跳到主要内容

模型文件与格式

模型格式是模型在磁盘上保存、分发和加载的方式。
它不只是“权重文件后缀名”,还会影响推理框架兼容性、量化方式、加载速度、安全性、跨平台部署和后续微调。

在大模型工程化中,常涉及的概念包括:

  • Hugging Face 目录:最常见的模型发布结构,通常包含权重、配置、tokenizer 和 chat template。
  • safetensors:安全、快速的张量权重文件格式。
  • PyTorch checkpoint:常见后缀为 .bin.pt.pth,训练和研究场景常见。
  • GGUF:llama.cpp 生态常用格式,适合本地推理和多种量化版本分发。
  • ONNX:通用模型交换格式,适合跨框架和推理引擎部署。
  • TensorRT / TensorRT-LLM engine:面向 NVIDIA GPU 的高性能推理格式。
  • Adapter 权重:LoRA、QLoRA 等微调产物,通常不是完整模型。

理解模型格式的重点不是背后缀名,而是知道一个格式能被哪个运行时加载、包含哪些元数据、是否保留 tokenizer 和对话模板、是否绑定硬件和框架版本。

1. 模型文件到底包含什么

一个可用的大模型通常不只有权重。

完整模型目录常见内容包括:

文件 / 目录作用
config.json模型结构配置,例如层数、hidden size、attention heads、模型类型
model.safetensors / pytorch_model.bin模型权重
model-00001-of-000xx.safetensors分片保存的大模型权重
model.safetensors.index.json权重分片索引,说明每个参数在哪个分片里
tokenizer.jsontokenizer 的完整定义
tokenizer_config.jsontokenizer 相关配置,可能包含 chat_template
special_tokens_map.json特殊 token 映射,例如 BOS、EOS、PAD
generation_config.json默认生成参数,例如 temperature、top_p、eos_token_id
preprocessor_config.json多模态模型的图像、音频预处理配置
adapter_config.jsonLoRA / Adapter 的配置
adapter_model.safetensorsLoRA / Adapter 权重

部署时经常出问题的不是权重本身,而是 tokenizer、special tokens、chat template 或多模态预处理配置没有一起迁移。

2. Hugging Face 模型目录

Hugging Face 模型目录不是单一文件格式,而是一组约定好的文件结构。

典型目录如下:

Qwen3-8B/
config.json
generation_config.json
model-00001-of-00004.safetensors
model-00002-of-00004.safetensors
model-00003-of-00004.safetensors
model-00004-of-00004.safetensors
model.safetensors.index.json
tokenizer.json
tokenizer_config.json
special_tokens_map.json

这种结构的优点是生态兼容性强:

  • Transformers 可以直接加载。
  • vLLM、SGLang、TensorRT-LLM 等框架通常都支持从 HF 目录读取模型。
  • tokenizer、模型配置和生成配置可以和权重一起分发。
  • 大模型权重可以自动分片,便于下载和加载。

它的工程特点是:目录里的每个文件都可能影响最终行为。换权重、换 tokenizer、换 chat template,都可能让同一个模型表现不同。

3. safetensors

safetensors 是一种专门保存张量的文件格式,常见后缀为 .safetensors

它解决的是传统 PyTorch pickle 权重文件的一些问题:

  • 更安全:加载时不会执行任意 Python 代码。
  • 加载更快:支持内存映射,适合大模型权重。
  • 元数据清晰:文件中记录张量名称、形状和 dtype。
  • 生态成熟:Hugging Face、vLLM、SGLang 等常见工具普遍支持。

典型文件:

model.safetensors
model-00001-of-00008.safetensors
adapter_model.safetensors

需要注意的是,safetensors 只保存张量。它不会自动包含模型结构、tokenizer、chat template 或生成参数。实际部署时仍然需要配套的 config.json 和 tokenizer 文件。

4. PyTorch checkpoint

PyTorch checkpoint 常见后缀包括:

  • .bin
  • .pt
  • .pth

在早期 Hugging Face 模型和训练代码中,pytorch_model.bin 很常见。

优点:

  • 与 PyTorch 训练流程天然兼容。
  • 可以保存复杂对象,例如模型权重、优化器状态、训练步数和 scheduler 状态。
  • 研究代码和自定义训练脚本中使用广泛。

缺点:

  • 通常基于 pickle,加载不可信文件有安全风险。
  • 跨语言、跨运行时兼容性不如 safetensors。
  • 生产部署中可控性较弱。

工程上,如果只是发布推理权重,通常优先选择 safetensors。如果是保存训练断点,PyTorch checkpoint 仍然很常见。

5. GGUF

GGUF 是 llama.cpp 生态常用的模型格式,常见文件后缀为 .gguf

它的定位和 Hugging Face 目录不同:GGUF 通常把本地推理需要的大量信息打包到一个文件里,包括权重、部分模型元数据、tokenizer 信息和量化信息。

常见文件名类似:

Qwen3-8B-Q4_K_M.gguf
Llama-3.1-8B-Instruct-Q5_K_M.gguf
DeepSeek-R1-Distill-Qwen-7B-Q8_0.gguf

文件名里的 Q4Q5Q8 通常表示量化等级,但具体含义取决于 llama.cpp 生态的量化类型。

5.1 GGUF 适合什么场景

GGUF 常见于:

  • 本地桌面推理。
  • CPU 推理。
  • Mac Metal 推理。
  • 消费级 GPU 推理。
  • 边缘设备部署。
  • 需要单文件分发的模型应用。

它的优势是使用门槛低,生态工具丰富,一个文件就能被 llama.cpp、Ollama、LM Studio 等工具加载。

5.2 GGUF 的注意点

GGUF 很适合本地推理,但不是所有服务端推理框架的首选格式。

需要注意:

  • 不是所有模型结构都能稳定转换成 GGUF。
  • 转换质量依赖 tokenizer、特殊 token 和 chat template 是否正确处理。
  • 量化版本很多,Q4_K_MQ5_K_MQ8_0 等不能只看 bit 数,还要实际评估质量和速度。
  • 某些新模型、多模态模型或 MoE 模型在 GGUF 生态中的支持可能滞后。
  • GGUF 文件方便分发,但后续继续微调通常不直接基于 GGUF 进行。

如果目标是本地运行,GGUF 很合适。如果目标是生产服务端高并发,通常还要比较 vLLM、SGLang、TensorRT-LLM 等框架支持的格式。

6. GPTQ 与 AWQ 格式

GPTQ 和 AWQ 首先是量化方法,但在工程上也经常表现为特定的模型目录结构。

常见目录可能包含:

config.json
quantize_config.json
model.safetensors
tokenizer.json
tokenizer_config.json

或者:

awq_config.json
model-00001-of-00002.safetensors
model.safetensors.index.json

这里的关键不是后缀,而是推理框架需要知道:

  • 权重是几 bit。
  • 使用什么量化算法。
  • group size 是多少。
  • 是否使用 zero point。
  • 哪些层被量化。
  • 推理时应该使用哪种 kernel。

因此,部署 GPTQ / AWQ 模型时,不能只复制 .safetensors 权重,还要保留量化配置文件。

7. ONNX

ONNX(Open Neural Network Exchange)是一种通用模型交换格式,常见后缀为 .onnx

它的目标是让模型从一个训练框架导出后,可以被不同推理引擎加载,例如 ONNX Runtime、TensorRT、OpenVINO 等。

ONNX 的优势:

  • 跨框架。
  • 推理引擎支持广。
  • 适合传统深度学习模型、Embedding 模型、分类模型和部分 encoder 模型。
  • 便于做图优化、算子融合和静态部署。

ONNX 的挑战:

  • 自回归 LLM 的导出和部署更复杂。
  • 动态 shape、KV Cache、多模态预处理和自定义算子容易带来兼容问题。
  • 新模型结构可能需要较新的 opset 或自定义算子支持。
  • 导出成功不等于推理结果完全一致,需要做数值和任务对齐验证。

对大语言模型来说,ONNX 更常见于 Embedding、reranker、分类模型或特定优化部署链路。通用 chat LLM 服务端部署通常会优先考虑 vLLM、SGLang、TensorRT-LLM 或 llama.cpp 生态。

8. TensorRT 与 TensorRT-LLM Engine

TensorRT engine 通常是为特定硬件、特定精度、特定 shape 或特定配置编译出来的推理产物。

它不是通用交换格式,而是高度优化后的运行时格式。

特点:

  • 面向 NVIDIA GPU。
  • 可以做算子融合、kernel 选择、低精度优化和图优化。
  • 推理性能强,但构建过程更复杂。
  • 常常和 GPU 架构、TensorRT 版本、CUDA 版本、模型配置绑定。

工程上要注意:

  • engine 文件不一定能跨机器、跨 GPU 架构或跨 TensorRT 版本复用。
  • 构建 engine 时的 batch、序列长度、精度、并行策略会影响可用范围。
  • 模型升级、驱动升级或 TensorRT 升级后可能需要重新构建。
  • 需要保存构建参数,否则后续很难复现性能和问题。

TensorRT-LLM 更适合对性能要求高、部署环境可控、工程团队能维护构建链路的生产场景。

9. Adapter 与 LoRA 权重

LoRA、QLoRA、Adapter 微调通常输出的不是完整模型,而是增量权重。

常见文件:

adapter_config.json
adapter_model.safetensors

这类文件必须和基座模型一起使用:

最终模型行为 = 基座模型 + Adapter 权重

部署时有两种方式:

方式含义适合场景
动态加载 Adapter推理时加载基座模型,再挂载 adapter多租户、多任务、频繁切换适配器
合并权重把 adapter 合并进基座模型,导出完整权重单一任务部署、简化推理链路

需要注意:

  • Adapter 必须匹配训练时的基座模型版本。
  • 同名模型的不同 revision 也可能不兼容。
  • 合并后再量化,和先量化再挂 adapter,效果和部署方式可能不同。
  • 只保存 adapter,不保存基座模型版本信息,会给复现带来很大风险。

10. Tokenizer 与 Chat Template

很多模型格式问题表面看是“权重加载失败”,实际是 tokenizer 或 chat template 不匹配。

部署时至少要确认:

  • tokenizer 文件是否和训练时一致。
  • bos_tokeneos_tokenpad_token 是否正确。
  • eos_token_id 是否和推理框架的停止条件一致。
  • chat template 是否和模型训练格式一致。
  • 工具调用、思考模式、多模态占位符是否被正确渲染。

同一组 messages,不同 chat template 渲染后的 prompt 可能完全不同。模型格式迁移时,如果只迁移权重,不迁移 tokenizer 和模板,输出质量可能明显下降。

11. 多模态模型的额外文件

多模态模型通常不只有语言模型权重,还可能包含视觉塔、投影层和预处理配置。

常见文件包括:

  • preprocessor_config.json
  • processor_config.json
  • image_processor_config.json
  • video_processor_config.json
  • 视觉 encoder 权重
  • projector 权重
  • 多模态 special tokens 配置

多模态模型转换格式时更容易出问题:

  • 图片尺寸和归一化参数不一致。
  • 图像占位 token 不匹配。
  • vision encoder 没有一起导出。
  • projector 权重遗漏。
  • 推理框架只支持 language model 部分。

因此,多模态模型不要只按普通文本 LLM 的方式处理格式转换。

12. 格式选择建议

目标推荐优先考虑原因
Hugging Face 生态训练 / 微调HF 目录 + safetensors兼容 Transformers、PEFT、TRL 等工具
服务端通用推理HF 目录 + safetensors / AWQ / GPTQvLLM、SGLang 等框架支持较好
本地桌面推理GGUF单文件分发,llama.cpp / Ollama / LM Studio 生态成熟
CPU 或边缘部署GGUF / ONNX / OpenVINO根据目标硬件选择
NVIDIA 高性能生产部署TensorRT-LLM engine性能强,但构建和维护成本高
LoRA 多任务部署基座模型 + Adapter便于多个任务共享同一个基座模型
跨框架传统模型部署ONNX交换格式成熟,推理引擎选择多

简单判断:

  • 要训练或继续微调:优先保留 Hugging Face 目录。
  • 要本地跑:优先看 GGUF。
  • 要服务端高并发:优先看推理框架支持的 HF / AWQ / GPTQ / FP8 格式。
  • 要极致 NVIDIA 性能:评估 TensorRT-LLM。

13. 转换格式时要检查什么

格式转换不是简单改后缀。

转换前后建议检查:

  • 模型结构是否被目标格式支持。
  • tokenizer 是否完整保留。
  • special tokens 是否一致。
  • chat template 是否保留或重新指定。
  • 量化配置是否完整。
  • dtype 是否符合预期。
  • max position embeddings / rope scaling 是否正确。
  • 多模态 processor 是否完整。
  • 推理输出是否和原模型对齐。
  • 目标框架是否真正使用了期望的低精度 kernel。

最小验证方式是准备一组固定 prompt,对比转换前后的输出:

  • 短问答。
  • 长上下文。
  • JSON 格式输出。
  • 工具调用。
  • 中文和英文。
  • 业务关键样本。
  • 安全拒答样本。

不要只验证“模型能启动”。能启动只说明格式基本可读,不代表行为正确。

14. 版本与复现

模型格式和工具版本强相关。工程记录中建议保留:

  • 原始模型名称和 revision / commit hash。
  • 权重格式和分片信息。
  • tokenizer 文件版本。
  • chat template 内容或来源。
  • 量化算法、bit 数、group size、校准数据。
  • 转换工具和版本。
  • 推理框架和版本。
  • CUDA、驱动、TensorRT 等运行时版本。
  • 构建 engine 的参数。

这些信息决定了后续能不能复现同样的模型行为和性能。

15. 常见问题

15.1 safetensors 和 GGUF 是一类东西吗

不完全是。

safetensors 主要是张量权重保存格式,常作为 Hugging Face 模型目录的一部分。GGUF 更偏向 llama.cpp 生态的本地推理模型格式,通常把权重、量化信息和部分元数据打包到单个文件中。

15.2 GGUF 可以直接拿去微调吗

通常不建议。GGUF 主要面向推理分发和加载。微调一般使用 Hugging Face 格式的基座模型,再用 PEFT、Transformers、LLaMA-Factory、Unsloth 等工具训练。

15.3 只有权重文件能不能部署

多数情况下不够。还需要模型结构配置、tokenizer、special tokens、chat template 和生成参数。多模态模型还需要 processor 和视觉相关权重。

15.4 量化格式和模型格式是什么关系

量化描述的是数值精度和压缩方法,模型格式描述的是保存和加载方式。二者会交织在一起。例如 GGUF 文件可以承载多种量化版本,AWQ / GPTQ 模型通常以 safetensors 权重加量化配置的目录形式存在。

15.5 为什么同一个模型换格式后效果变差

常见原因包括:

  • tokenizer 不一致。
  • chat template 丢失。
  • special tokens 配置不同。
  • 量化误差。
  • rope scaling 或上下文长度配置错误。
  • 推理框架默认生成参数不同。
  • 多模态预处理不一致。

16. 总结

模型格式决定了模型如何被保存、迁移、加载和运行。对工程部署来说,格式选择会直接影响兼容性、性能、可复现性和排障难度。

可以按这个思路选择:

  • 训练和微调优先保留 Hugging Face 目录和 safetensors
  • 本地推理优先考虑 GGUF。
  • 服务端推理优先跟随 vLLM、SGLang、TensorRT-LLM 等框架支持的格式。
  • LoRA 这类 adapter 要始终记录基座模型版本。
  • 转换格式后必须验证 tokenizer、chat template、量化配置和真实任务输出。

工程上最稳妥的做法是:把“权重、配置、tokenizer、模板、量化参数、转换脚本、运行时版本”作为一个整体管理,而不是只管理某个权重文件。