对比
Safetensors 与 ONNX:权重保存与模型图
Safetensors 保存带名称的张量。ONNX 描述包含计算图、输入输出和算子版本的模型。
应该选择哪种格式?
向兼容模型加载权重时可考虑 Safetensors;向兼容运行时交付计算图时可考虑 ONNX。
适用于 Safetensors
保存和分发机器学习张量权重 · 在受支持的框架间加载权重
- 交换张量和基本元数据而非任意 Python 对象
- 检查并按需加载指定张量的流程
适用于 ONNX
向兼容运行时交换机器学习计算图和权重 · 在训练框架与推理环境之间迁移模型
- 在支持模型算子和 opset 的运行时中推理
- 交换包含输入输出和类型的模型图
基本信息
| 项目 | Safetensors | ONNX |
|---|---|---|
| 扩展名 | .safetensors | .onnx |
| MIME 类型 | application/octet-stream | application/octet-stream |
| 常见用途 | 保存和分发机器学习张量权重 · 在受支持的框架间加载权重 | 向兼容运行时交换机器学习计算图和权重 · 在训练框架与推理环境之间迁移模型 |
| 打开方式 | 使用兼容 Safetensors 的库或模型工具。支持的工具可以在将权重全部载入设备前查看张量名称、类型和形状。JSON 头部并不意味着整个文件都是 JSON 文本。 | 使用 ONNX 检查器或兼容推理运行时加载。部署前检查 IR/opset 版本、算子、输入输出类型和形状及运行时支持;使用有代表性的输入与源模型比较输出。 |
| 导出或转换 | 通过模型框架支持的 API 保存张量权重。将基于 pickle 的输入转换为该格式时可能需要反序列化输入,因此不要随意加载来源不可信的文件。转换后核对张量名称、形状、类型、元素总数和模型输出。 | 使用源训练框架提供的 ONNX 导出器转换,并用 ONNX checker 验证结构。转换成功不保证数值等价或能在目标设备运行。使用外部数据时,将模型和所有引用文件作为同一交付单元保存。 |
按用途选择
交换张量和基本元数据而非任意 Python 对象
保存和分发机器学习张量权重 · 在受支持的框架间加载权重
Safetensors检查并按需加载指定张量的流程
保存和分发机器学习张量权重 · 在受支持的框架间加载权重
Safetensors在支持模型算子和 opset 的运行时中推理
向兼容运行时交换机器学习计算图和权重 · 在训练框架与推理环境之间迁移模型
ONNX交换包含输入输出和类型的模型图
向兼容运行时交换机器学习计算图和权重 · 在训练框架与推理环境之间迁移模型
ONNX关键点 1
Safetensors 本身不定义模型结构或推理代码。
进一步了解差异关键点 2
ONNX 可包含图的初始化张量,也可引用外部数据。
进一步了解差异进一步了解差异
两者不能直接互相替代。由权重生成 ONNX 需要模型定义和受支持的导出流程,改扩展名不会生成计算图。
- Safetensors 头部记录张量名称、dtype、shape 和数据范围。分片索引、配置、分词器等依赖需另行确认。
- 应核对运行时对 ONNX IR/opset、算子和类型的支持,并保留外部权重引用。用相同预处理和代表输入比较输出;结构检查通过不保证精度或速度。
常见问题
Safetensors 可以不管来源而直接信任吗?
不能。它避免 pickle 式任意对象重建,但不保证来源、加载器、依赖代码或模型自身安全。