核心问题:训练结果最终变成了哪些文件?
主要概念: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.json | Tokenizer 的完整序列化定义 |
tokenizer_config.json | Tokenizer 类型和行为配置 |
vocab.json | Token 与 Token ID 的对应关系 |
merges.txt | BPE 等算法使用的合并规则 |
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
└── LICENSELoRA、量化模型仓库
不是每个模型仓库都包含一套完整权重。
LoRA 或 Adapter 仓库通常只包含相对于基础模型新增或修改的少量参数。
量化模型仓库:包含由原始模型转换得到的:
- INT8;
- INT4;
- FP8;
- GGUF;
- GPTQ;
- AWQ。
总结:
模型训练得到的参数首先以 Checkpoint 的形式保存。用于发布时,模型权重会被提取并序列化为 Safetensors 等格式;体积过大时再拆成多个 Shard,并通过索引文件记录每个参数的位置。权重与 Config、Tokenizer、Processor、Chat Template、Model Card 和 License 等资源一起组成模型仓库,供其他人下载、加载和运行。
- 权重文件保存的是训练得到的大量 Tensor 数值;
- Config 描述怎样创建模型结构,权重负责填入具体参数;
- Shard 只是同一套权重的文件分片,不是多个独立模型;
- 工程中的模型通常以模型仓库发布,而不是只有一个权重文件。