Skip to content

模型格式

模型格式是 AI 模型的存储和交换标准,定义了模型权重、架构、元数据如何组织和序列化。一个良好的模型格式应具备可移植性(跨平台兼容)、安全性(防止恶意代码注入)、效率(加载速度快、占用空间小)、可扩展性(支持新架构和新特性)。本文聚焦训练和分发阶段最常用的 PyTorch 原生与 HF 风格两种格式的存储设计;ONNX 作为跨框架交换格式详见 ONNX,GGUF 作为 llama.cpp 生态的本地推理格式详见 GGUF

各格式对比

格式推出方特点适用场景详细介绍
PyTorch .pt/.pthMetaPyTorch 原生格式,支持完整计算图PyTorch 训练/推理
HF 风格Hugging Faceconfig + safetensors,生态标准开源模型分发
ONNXMicrosoft/Meta框架无关,跨平台推理跨框架部署ONNX
GGUFllama.cpp单文件分发、mmap 友好、量化内置本地部署、边缘设备GGUF

选型的第一性问题是模型规模——小模型(亿级参数)和大模型(百亿到千亿级)对格式的需求完全不同,由此衍生出两个时代、两条技术路线。2016-2020 年的传统深度学习(ResNet、YOLO、BERT)走 ONNX 静态计算图路线(详见 ONNX),2023 年后的 LLM 时代走 HF safetensors 的"薄容器"路线。理解这条分界线比记住任何一个格式的细节更重要。

PyTorch 原生格式

PyTorch 的原生模型格式包括 .pt.pth.pkl(三者本质相同),使用 Python 的 pickle 模块序列化。这种格式可以保存完整的模型对象(包括架构、权重、优化器状态、训练状态),加载后可直接使用,无需重新定义模型结构。

python
# 保存完整模型(包含架构和权重)
torch.save(model, "model.pth")

# 保存仅权重(state_dict)
torch.save(model.state_dict(), "weights.pth")

# 加载权重(需要先定义模型结构)
model = MyModelClass()
model.load_state_dict(torch.load("weights.pth"))

PyTorch 格式的优势是完整性灵活性——可以保存任意 Python 对象(包括自定义层、优化器、学习率调度器)。但这也是它的劣势:pickle 格式存在安全风险(反序列化可执行任意代码)、跨版本兼容性差(PyTorch 版本升级可能导致旧模型无法加载)、文件体积大(包含不必要的元数据)。

生产环境中建议使用 state_dict 方式保存权重,而非保存完整模型。原因有二:一是安全性(避免执行任意代码),二是兼容性(模型结构由代码定义,而非依赖序列化对象)。对于跨平台部署,建议转换为 ONNX 或 HF safetensors 格式。

HF 风格模型格式

HF 风格模型格式(Hugging Face pretrained model directory format)没有独立的正式品牌名称,而是 transformers 库中 PreTrainedModel 和 PreTrainedConfig 类的标准保存/加载目录规范,已成为开源大模型生态的事实标准

从系统视角看,HF 风格模型文件夹是一个带自描述元数据的二进制发布包——包含配置(定义架构)、权重(模型参数)、分词器(文本接口)三类核心文件,通过标准化的目录结构和 JSON 配置实现自描述,使得任何工具都可以解析和加载模型。

文件夹结构

权重文件(真正的数据)

文件说明
model.safetensors单文件模型的权重(推荐格式)
model-00001-of-000xx.safetensors大模型的分片权重(默认每片 50GB)
model.safetensors.index.json分片索引文件(映射 tensor 名 → 分片文件)
pytorch_model.bin旧格式(pickle,不推荐)

配置文件(模型元数据)

文件说明
config.json最关键的文件,定义模型架构(层数、隐藏层维度、注意力头数等)。AI 引擎通过读取它来实例化模型类。
generation_config.json推理默认参数(max_length、temperature、top_p 等)
preprocessor_config.json多模态模型的预处理配置(如图像/音频处理)

Tokenizer 文件(文本接口)

文件说明
tokenizer.json统一的分词器格式(推荐)
tokenizer_config.json分词器配置和特殊 token
vocab.json / merges.txtBPE 分词器的词汇表
tokenizer.modelSentencePiece 二进制词典

其他文件

文件说明
adapter_config.jsonPEFT/LoRA 适配器配置
README.md模型卡片(模型描述、使用许可)
python
model.save_pretrained(
    save_directory,
    max_shard_size="50GB",          # 自动分片阈值
    safe_serialization=True,        # 使用 safetensors(默认推荐)
    push_to_hub=False,              # 是否直接推送到 HF Hub
    variant=None                    # 如 "fp16" → pytorch_model.fp16.bin
)

几乎所有推理引擎(vLLM、TGI、TensorRT-LLM 等)都原生支持或通过少量转换支持 HF 格式。模型作者训练完后用一次 save_pretrained,多个下游工具就能直接加载。HF Hub 上数万模型都遵循这个规范,确保生态兼容。

SafeTensors

SafeTensors 是 Hugging Face 推出的安全张量序列化格式,旨在替代 PyTorch 的 pickle 格式。它只保存张量数据(名称 + 形状 + dtype + 字节流),不包含任何可执行代码,彻底杜绝了反序列化攻击的风险。

SafeTensors 采用 Header + Data 的二进制结构:前 8 字节是 JSON 元数据的长度(无符号整数),接着是 JSON 描述的元数据(每个张量的名称、形状、dtype、偏移量),最后是纯二进制张量数据(连续存储)。这种设计使得 AI 引擎可以使用 Linux 的 mmap 系统调用将文件直接映射到地址空间,实现零拷贝加载——open 文件后读取 Header 获取每个 Tensor 的偏移量,再 mmap 数据部分到虚拟内存,最后直接将磁盘数据指针通过 cudaMemcpyAsync 泵入显存。

特性Pickle (.bin/.pt)SafeTensors
反序列化速度慢(需要 Python 解释器)极快(纯磁盘 IO/mmap)
安全性差(可执行任意代码)安全(仅包含数据)
内存开销高(加载时有内存拷贝)极低(支持零拷贝)
跨语言支持难(强绑定 Python)易(C/C++/Rust 均有轻量级解析库)
python
from safetensors.torch import save_file, load_file

# 保存权重
save_file({"weight1": tensor1, "weight2": tensor2}, "model.safetensors")

# 加载权重
weights = load_file("model.safetensors")

SafeTensors 已成为 Hugging Face 模型分发的标准格式。自 2023 年起,HF Hub 上新上传的模型默认使用 safetensors 而非 pytorch_model.bin。主流推理引擎(vLLM、TGI、TensorRT-LLM)都优先支持 safetensors 格式。SafeTensors 是 AI 领域的 ELF 文件格式——它规范了权重的排布,实现了高性能、高安全性的模型加载。

transformers 三件套

transformers 是 Hugging Face 推出的大模型加载库,它本质上是一个模型格式规范。深度学习框架(如 PyTorch、TensorFlow)提供底层算子和自动微分能力,但如何定义模型架构、如何加载权重、如何做推理,这些都需要开发者自己编写大量样板代码。transformers 库把这些工作标准化——模型定义、权重加载、推理接口全部统一,开发者只需几行代码就能使用预训练模型。

在 transformers 出现之前,复现一篇论文的模型是极其痛苦的过程。论文作者通常只会发布训练好的权重文件,以及一段可能在特定框架版本上才能运行的代码。模型结构定义分散在各个 GitHub 仓库,API 风格五花八门,权重文件格式互不兼容。transformers 库通过统一的接口和规范的模型格式,将模型复现成本从数天降低到数分钟。

transformers 的核心贡献是把模型结构、权重、推理接口三者标准化。开发者不再需要"实现模型",只需"加载模型"。这种转变的意义在于将模型从"算法"变成了"基础设施"——就像调用 HTTP API 一样简单。

三件套将模型抽象为三个独立组件:

组件职责文件来源
Config存储模型超参数和架构信息(层数、隐藏层维度、注意力头数、词汇表大小)config.json
Tokenizer文本与 token 之间的双向转换,存储分词规则tokenizer.json、tokenizer_config.json
Model纯粹的神经网络实现,接收 token ID 输出 logits基于架构代码实例化

这三者解耦的设计使得同一个模型结构可以使用不同的预训练权重,同一个 Tokenizer 可以服务于多个模型,同一个模型可以轻松切换不同的任务头。

Auto 系列

Auto 系列类(AutoTokenizerAutoModelAutoModelForCausalLM 等)是 transformers 库工程化的集大成体现。传统的做法是需要明确知道使用的是哪种模型架构,然后导入对应的类。但 Auto 系列允许开发者完全不关心模型类型,只需提供模型名称或路径,库会自动推断应该加载哪个类。

python
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")

这种设计的革命性在于将模型选择权交给了权重文件,而不是代码。当你使用 AutoModel 加载一个本地目录时,库会读取目录中的 config.json 文件,根据 model_type 字段自动选择对应的模型类。

推理与训练

transformers 库的推理接口设计简洁到极致。调用 model.generate() 可以自动处理采样策略、温度参数、top-k/top-p 过滤等细节。对于文本分类、问答、命名实体识别等常见任务,库还提供了 pipeline 高级 API,一行代码就能完成从原始文本到模型输出的全流程。

python
from transformers import pipeline

classifier = pipeline("sentiment-analysis")
result = classifier("Hugging Face is amazing!")
# 输出: [{'label': 'POSITIVE', 'score': 0.9998}]

训练方面,transformers 提供了 Trainer 类封装了训练循环的样板代码:自动批处理、混合精度训练、梯度累积、学习率调度、日志记录、检查点保存等。开发者只需定义数据集和评估指标,Trainer 会处理其余的工程细节。

Hugging Face 生态

Hugging Face 起初是一家专注于聊天机器人开发的初创公司,但在 2019 年转型为 AI 开源工具和模型托管平台。如今它已成为大模型时代最重要的基础设施之一,被称为"AI 界的 GitHub"。

组件功能
模型托管平台类似 GitHub,托管模型权重和代码
transformers 库模型存储、加载和运行的规范
Datasets 库数据加载和预处理
Evaluate 库评估指标统一接口
Spaces演示环境(免费 GPU)

截至 2024 年,HF Hub 上已有数十万个模型被上传分享,涵盖自然语言处理、计算机视觉、音频处理、多模态等各个领域。

工程实践

  1. 缓存管理:初次使用时模型会下载到 ~/.cache/huggingface,生产环境建议指定 cache_dir 参数
  2. 内存优化device_map="auto" 会自动将模型分层分配到 CPU 和 GPU,超大规模模型可结合 accelerate 库使用模型并行
  3. Tokenizer 细节:不同模型的特殊 token 不同(如 BERT 的 [CLS]、GPT 的 <endoftext>),批量推理时设置 padding=Truetruncation=True

格式选择决策树

场景推荐格式理由
PyTorch 训练state_dict + safetensors安全、高效
模型分发HF 风格(config + safetensors)生态标准、兼容性强
本地 CPU 推理GGUF量化友好、内存占用小
跨框架部署ONNX框架无关、硬件支持广
边缘设备部署GGUF 或 TFLite量化、低资源优化

模型格式转换是常见的工程需求。Hugging Face 提供了 transformers 库的转换工具,支持从 PyTorch、TensorFlow、JAX 等格式互转。对于 ONNX 转换,可使用 torch.onnx.exportonnxruntime 的转换工具。对于 GGUF 转换,可使用 llama.cpp 的 quantize 工具将 HF 模型转换为 GGUF 格式。

转换路径的设计哲学值得展开。训练阶段用 PyTorch 原生格式保留灵活性,发布时转 HF safetensors(生态兼容),要跨框架部署再转 ONNX(解耦框架),要 CPU+Apple Silicon 部署再转 GGUF(量化 + 内存映射)。每一步转换都解决特定场景的问题,没有"一统天下"的银弹格式——这正是格式多样性的合理之处。