模型

发布于 2026-08-24

第四层:模型如何保存与发布?

从工程视角理解 AI 模型如何从内存中的参数和训练状态保存为文件,以及权重、配置、Tokenizer、Chat Template 和 Model Card 等资源如何组织并发布为模型仓库。

核心问题:训练结果最终变成了哪些文件?

主要概念:Checkpoint、Serialization、Weights、Safetensors、Shard、Index、Config、Tokenizer、Processor、Chat Template、Model Card、Model Repository、Revision

训练过程产生的是内存中的参数和训练状态;为了能够暂停训练、分发模型和执行推理,需要将这些内容序列化为文件,并与配置、Tokenizer、说明文档等资源一起发布。

训练时,模型的参数以 Tensor 的形式存在于内存或显存中。一个线性层可能包含:Weight Tensor:形状为 [4096, 4096],Bias Tensor:形状为 [4096]。

整个模型由大量这样的 Tensor 构成:

Model Parameters
├── model.embed_tokens.weight
├── model.layers.0.self_attn.q_proj.weight
├── model.layers.0.self_attn.k_proj.weight
├── model.layers.0.mlp.up_proj.weight
├── model.layers.1...
└── lm_head.weight

模型保存的核心工作就是:将内存中的 Tensor、名称、形状、数据类型和数值序列化为磁盘文件。

Serialization:序列化

把内存中的数据结构转换成可以存储或传输的文件格式。

加载模型时则执行相反过程:磁盘文件 → 反序列化 → Tensor → 放入内存或显存。

权重文件不是模型的源代码,而是模型训练后得到的大量数值的序列化结果。

Checkpoint:训练过程中的保存点

Checkpoint 是训练过程中在某个时间点保存下来的模型状态,用于恢复训练、比较不同阶段或者选择最终模型。

一个完整的训练 Checkpoint 可能包含:

Training Checkpoint
│
├── Model Weights
├── Optimizer State
├── Learning Rate Scheduler State
├── Training Step / Epoch
├── Gradient Scaler State
└── Random Number Generator State
内容作用
Model Weights保存模型当前学到的参数
Optimizer State保存优化器内部状态
Scheduler State保存学习率变化进度
Step / Epoch记录训练进行到哪里
Random State尽可能复现训练过程

Checkpoint 也会被宽泛地用来指一个可直接加载的完整模型文件。

Weights:保存模型能力的数据

权重文件保存训练后各个参数对应的数值。概念上表示:

  • Tensor 的形状
  • Tensor 的数据类型
  • Tensor 的具体数值

Safetensors:权重文件的保存格式

一个专门装载大量模型参数 Tensor 的容器格式。早期 PyTorch 模型经常使用: pytorch_model.bin。

这类文件通常基于 Python Pickle 机制。Pickle 在反序列化时理论上可以执行其中携带的代码,因此加载不可信文件存在安全风险。

Safetensors 的设计重点之一是:只保存 Tensor 数据,不通过 Pickle 反序列化任意 Python 对象,从格式层面减少执行恶意代码的风险。

Shard:为什么一个模型会有很多权重文件?

大型模型的权重可能有几十 GB、几百 GB,甚至更大。如果全部放在一个文件中,会带来:

  • 单文件过大;
  • 上传和下载不方便;
  • 文件系统或存储服务可能存在限制;
  • 加载时不容易按需处理;
  • 分布式处理不方便。

因此,模型权重通常会被拆成多个文件。这个过程称为:Sharding,分片。每个文件称为:Shard,分片。

model-00001-of-00018.safetensors
model-00002-of-00018.safetensors
model-00003-of-00018.safetensors
...
model-00018-of-00018.safetensors
 
model-00001-of-00018
      │         │
      │         └── 总共有 18 个分片
      └── 当前是第 1 个分片

Weight Index:怎样知道参数在哪个分片?

权重分片后,推理框架需要知道每个参数保存在哪个文件中。因此,仓库里通常会出现:model.safetensors.index.json。可以理解为:权重分片的目录或索引表。比如:

{
  "metadata": {
    "total_size": 55562855904.0
  },
  "weight_map": {
    "lm_head.weight": "model-00018-of-00018.safetensors",
    "model.language_model.embed_tokens.weight": "model-00003-of-00018.safetensors",
    "model.language_model.layers.0.input_layernorm.weight": "model-00001-of-00018.safetensors",
    "model.language_model.layers.0.linear_attn.A_log": "model-00001-of-00018.safetensors",
    "model.language_model.layers.0.linear_attn.conv1d.weight": "model-00001-of-00018.safetensors",
    ...
  }
}

Config:告诉程序应该创建什么模型结构

最常见的配置文件是 config.json,包含:

  • 模型类型;
  • 架构类名称;
  • 层数;
  • Hidden Size;
  • Attention Head 数量;
  • Vocabulary Size;
  • Position Encoding 配置;
  • 最大上下文长度;
  • 数据类型提示;
  • 特殊 Token ID;
  • 多模态结构配置。

Generation Config:控制默认生成行为

generation_config.json 用于保存默认生成参数,例如:

  • Temperature;
  • Top-p;
  • Top-k;
  • Max Length;
  • Repetition Penalty;
  • EOS Token ID;
  • PAD Token ID。

Tokenizer 文件:保存文本切分规则

Tokenizer 并不是简单的一张词表。一个完整 Tokenizer 可能包含:

Tokenizer
│
├── Vocabulary
├── Tokenization Algorithm
├── Merge Rules
├── Normalization Rules
├── Special Tokens
└── Tokenizer Config
文件作用
tokenizer.jsonTokenizer 的完整序列化定义
tokenizer_config.jsonTokenizer 类型和行为配置
vocab.jsonToken 与 Token ID 的对应关系
merges.txtBPE 等算法使用的合并规则
special_tokens_map.json特殊 Token 的定义
  • 模型权重是在特定 Token ID 体系上训练出来的。
  • Tokenizer 与模型权重通常是配套的。

Processor:多模态模型的输入处理规则

对于图像、音频和视频模型,模型仓库中还可能包含:

preprocessor_config.json
processor_config.json
video_preprocessor_config.json

可能规定:

  • 图片缩放方式;
  • 图片裁剪方式;
  • 像素归一化规则;
  • 视频采样方式;
  • 帧数或帧率处理;
  • 音频采样率;
  • 不同模态如何组合。

多模态模型的输入资源可以概括为:

  • 文本 → Tokenizer
  • 图片 → Image Processor
  • 视频 → Video Processor
  • 音频 → Audio Processor

处理规则必须与模型训练时使用的规则保持一致。

Model Repository:模型发布后的完整载体

模型仓库,用于保存、管理和发布一个模型版本所需资源的版本化仓。

Model Repository
│
├── Model Identity(模型身份)
│   ├── Repository Name
│   ├── Model Family
│   └── Model Variant
│
├── Model Structure(模型结构)
│   └── config.json
│
├── Model Weights(模型权重)
│   ├── *.safetensors
│   └── *.index.json
│
├── Input Processing(输入处理)
│   ├── tokenizer.json
│   ├── tokenizer_config.json
│   ├── vocab.json
│   ├── merges.txt
│   └── preprocessor_config.json
│
├── Inference Behavior(推理行为)
│   ├── generation_config.json
│   └── chat_template.jinja
│
└── Documentation(说明与许可)
    ├── README.md / Model Card
    └── LICENSE

LoRA、量化模型仓库

不是每个模型仓库都包含一套完整权重。

LoRA 或 Adapter 仓库通常只包含相对于基础模型新增或修改的少量参数。

量化模型仓库:包含由原始模型转换得到的:

  • INT8;
  • INT4;
  • FP8;
  • GGUF;
  • GPTQ;
  • AWQ。

总结:

模型训练得到的参数首先以 Checkpoint 的形式保存。用于发布时,模型权重会被提取并序列化为 Safetensors 等格式;体积过大时再拆成多个 Shard,并通过索引文件记录每个参数的位置。权重与 Config、Tokenizer、Processor、Chat Template、Model Card 和 License 等资源一起组成模型仓库,供其他人下载、加载和运行。

  • 权重文件保存的是训练得到的大量 Tensor 数值;
  • Config 描述怎样创建模型结构,权重负责填入具体参数;
  • Shard 只是同一套权重的文件分片,不是多个独立模型;
  • 工程中的模型通常以模型仓库发布,而不是只有一个权重文件。