格式决定能上哪些引擎
权重格式不是细节问题,它直接决定模型能喂给哪个推理框架。safetensors 是服务端主流格式,支持内存映射加载;早期的 PyTorch bin 文件用 pickle 序列化,加载慢且存在反序列化风险;GGUF 是 llama.cpp 生态的单文件格式,自带量化档位;ONNX 偏跨平台与编译部署。拿到权重后第一件事是确认格式与目标引擎匹配。
格式对照
| 格式 | 常见使用者 | 说明 |
|---|---|---|
| safetensors | vLLM、TGI、Transformers | 安全序列化,支持内存映射,多分片配索引文件 |
| PyTorch bin | 较早发布的模型 | pickle 序列化,加载慢且存在反序列化风险 |
| GGUF | llama.cpp、Ollama | 单文件多档位,量化信息写在文件名里 |
| ONNX | ONNX Runtime、编译部署栈 | 与运行时和硬件绑定,偏工程化落地 |
| TensorRT 引擎 | TensorRT-LLM | 针对具体 GPU 架构编译,换卡需要重编 |
核对要点
| 目录必备文件 | config.json、tokenizer 相关文件、权重分片与其索引 |
|---|---|
| 多分片条件 | 需要 index 文件描述分片与张量映射,缺了无法自动合并 |
| 精度信息 | config 里记录权重 dtype,与量化内核要求必须一致 |
| 模板文件 | 对话模板缺失或错配会导致输出格式异常 |
查看模型目录
查看模型目录
ls models/<模型>/ # 关注 config.json、tokenizer*、*.safetensors、*.index.json
ls models/<模型>/*.safetensors | wc -l # 分片数量
# 校验单个分片能否完整解析(能打开不代表张量齐全,还要看大小)
python -c "from safetensors.torch import load_file; load_file('models/<模型>/model-00001-of-00004.safetensors')"
# 看配置里的精度与结构信息
python -c "import json; c=json.load(open('models/<模型>/config.json')); print(c.get('torch_dtype'), c.get('num_hidden_layers'))"典型使用场景
- 选引擎前确认格式:手上是 GGUF 就不要指望服务端引擎直接加载
- 下载后核对完整性:分片数量与索引文件是否齐全,缺一个都可能导致加载失败
- 排查加载失败:先看格式与量化要求是否匹配,再看路径与权限
- 做量化转换:从高精度格式转成目标格式与档位,转换后要用固定用例回归
- 离线搬迁:把整个目录连同配置文件一起搬,只搬权重文件会缺模板与配置
同一仓库常同时提供多种格式:按目标引擎能力挑,不要「拿到哪种用哪种」,格式不匹配是加载失败的高频原因。
用 pickle 序列化的权重来自不可信来源时存在反序列化风险:优先选 safetensors,并确认来源可信。