一、训练好的模型,怎么让它到处都能跑?
想象你是一位摄影师,用专业的单反相机拍了一组震撼的照片。现在你想让这些照片被更多人看到——有人想在手机上看,有人想在电脑上做壁纸,有人想印成海报挂在墙上。
问题是:单反拍的原始文件(RAW 格式)太大,手机打不开;直接发原图,很多人根本没法看。你需要把它们转换成不同的格式:JPEG 给手机、PNG 给电脑、TIFF 给印刷厂。
AI 模型也面临同样的问题。
训练一个 AI 模型,通常用的是 PyTorch 或 TensorFlow 这类"专业相机"。但训练完成后,你想让模型运行在不同的地方——手机 App 里、网页浏览器里、云服务器上、甚至摄像头这样的边缘设备上。这些地方用的"播放器"各不相同,直接把 PyTorch 的模型文件发过去,很多环境根本读不懂。
这就需要在"训练格式"和"部署格式"之间搭一座桥。
二、ONNX:模型的"通用语"
ONNX(Open Neural Network Exchange,开放神经网络交换格式)就是这座桥。
它的核心思想很简单:不管你在 PyTorch、TensorFlow、MXNet 还是其他什么框架里训练的模型,都可以导出成一个 .onnx 文件。这个文件是一种"通用语"——手机、浏览器、C++ 服务、Java 后端都能读懂并运行它。
为什么需要 ONNX?
在没有 ONNX 的时代,模型部署是一件非常痛苦的事。
假设你用 PyTorch 训练了一个图像识别模型,现在想把它放到一个手机 App 里。你需要:
- 找一套能在手机上跑 PyTorch 模型的工具
- 处理 PyTorch 和移动端框架之间的兼容问题
- 优化模型,让它在手机上跑得足够快、不耗太多电
- 如果将来要换到另一个框架,上面的工作可能得重来一遍
如果你同时想部署到网页、iOS App、Android App 和服务器上?恭喜你,每多一个平台,就多一整套重复劳动。
ONNX 解决的就是这个"N×M"问题:N 个训练框架 × M 个部署平台。有了 ONNX,你只需要"训练框架 → ONNX → 部署平台"这一跳,而不是"训练框架 → 部署平台"的 N×M 种组合。
ONNX 的本质是什么?
如果把 AI 模型想象成一个复杂的数学公式,ONNX 做的就是把这个公式用一种标准化的方式"写出来"。
它不关心这个公式是在哪里推导出来的,只关心公式本身长什么样:有哪些输入、经过哪些运算步骤、产生什么输出。ONNX 用一张"计算图"(Graph)来描述这个过程——节点是运算(比如加法、乘法、卷积),边是数据流动。
任何能读懂这张图的运行时(Runtime),就能执行这个模型,不管它跑在什么设备上。
三、Safetensors:安全的"模型保险箱"
说完了模型"怎么跑",再来聊聊模型"怎么存"。
一个训练好的模型,本质上就是一大堆数字——专业叫法是"权重"(Weights)或"张量"(Tensors)。这些数字得存进文件里,下次才能加载回来用。 Safetensors 就是专门用来存这些数字的格式。
为什么不直接用原来的格式?
很多框架自带的模型存储格式(比如 PyTorch 的 .pt 或 .pkl 文件)有一个安全隐患:它们在加载时会执行 Python 代码。
这听起来像是一个"功能",但实际上是一个巨大的安全风险。想象一下,你从网上下载了一个别人分享的模型文件,加载的时候它突然开始执行代码——可能是无害的,也可能在偷偷做一些坏事(比如读取你的文件、发送数据到远程服务器)。
这就是著名的"Pickle 反序列化漏洞"。由于这种格式的灵活性,恶意代码可以藏在模型文件里,加载时自动执行。
Safetensors 的解决之道
Safetensors 的设计哲学是:只存数据,不执行代码。
它是一个纯数据的文件格式,加载时不会执行任何代码,只是按照目录把数字读出来。就像打开一个 ZIP 文件,里面只有纯文本数据,没有可执行程序——你可以放心地查看内容,不用担心中毒。
除了安全,Safetensors 还有另一个优势:快。
传统的格式加载时,需要逐块解析、验证、转换。而 Safetensors 在文件头部就有一个"目录",写明每个张量叫什么名字、什么类型、在文件的哪个位置、占多少字节。加载时可以直接跳转到对应位置读取,不需要遍历整个文件——这叫"零拷贝"(Zero-Copy)加载,速度能快几倍甚至几十倍。
Safetensors 长什么样?
打开一个 Safetensors 文件,它的结构大致是这样的:
[文件头部:JSON 格式的目录]
{
"embed.weight": {"dtype": "F16", "shape": [32000, 768], "offset": 0, "size": 49152000},
"layer0.attn.q": {"dtype": "F16", "shape": [768, 768], "offset": 49152000, "size": 1179648},
...
}
[文件主体:一个个张量的原始字节数据]
就像一本书前面的目录页,告诉你第几章从第几页开始。你想读哪章,直接翻到对应页码就行。
四、精度格式:数字该用多少位来存?
现在我们有了安全的存储格式(Safetensors)和通用的交换格式(ONNX)。但还有一个关键问题:模型里的每个数字,到底该用多少位二进制来存?
这个问题听起来很技术,但其实很好理解。
精度的本质
计算机里的一切都是 0 和 1。一个数字(比如 3.14159)要存进计算机,得转换成一串二进制位。用的位越多,数字存得越精确;用的位越少,越省空间、越快,但可能损失精度。
常见的精度格式有:
| 格式 | 位数 | 通俗理解 | 适用场景 |
|---|---|---|---|
| FP32 | 32位 | "高清版",最精确 | 训练阶段,需要高精度 |
| FP16 | 16位 | "标准版",省一半空间 | 推理部署,追求效率 |
| BF16 | 16位 | "宽动态版",范围和 FP32 一样大 | 训练和推理的折中方案 |
| FP8 | 8位 | "压缩版",只有 1 字节 | 极致性能优化,最新硬件支持 |
FP32:基准线
FP32(32位浮点数)是深度学习训练的标准格式。它用 32 个二进制位表示一个数:1 位表示正负,8 位表示指数(数字的大小范围),23 位表示尾数(数字的精确度)。
32 位能表示非常精确的小数,适合训练阶段——训练时需要进行大量微小的参数更新,精度不够会导致模型学偏。
但 FP32 的代价是:每个数占 4 个字节。一个 70 亿参数的模型,如果全用 FP32,需要 28GB 内存。这已经超出大多数消费级显卡的能力了。
FP16:省空间的方案
FP16(16位浮点数)把位数砍半:1 位符号、5 位指数、10 位尾数。
位数少了,好处是内存占用减半、计算速度更快。但问题也来了:
- 范围变小:指数只有 5 位,能表示的最大/最小值范围比 FP32 小很多
- 精度变低:尾数只有 10 位,小数部分不够精细
在实际使用中,FP16 容易出现"梯度下溢"——训练时某些梯度值太小,在 FP16 里直接变成 0,模型就学不动了。
BF16:聪明的折中
BF16(Brain Floating Point 16)是 Google 提出的格式,也是 16 位,但分配方式不同:1 位符号、8 位指数、7 位尾数。
你发现了吗?BF16 的指数部分和 FP32 一样多(都是 8 位),所以它能表示的数字范围和 FP32 一样大,不容易出现下溢。代价是尾数只有 7 位,小数精度比 FP16 还低一点。
但在深度学习的实际场景中,范围的稳定性往往比小数点后多几位更重要。所以 BF16 现在已经成为大模型训练的默认选择——它比 FP32 快、省内存,又比 FP16 稳定。
FP8:极致压缩
FP8 只用 8 位(1 个字节)表示一个数。这是目前最前沿的格式,需要最新的硬件(比如 NVIDIA H100)才能高效支持。
8 位意味着什么?内存占用只有 FP32 的 1/4,计算速度可以大幅提升。但精度损失也很明显——它只能非常粗糙地表示数字。
FP8 目前主要用于推理(运行已经训练好的模型),而且通常需要配合量化技术(Quantization)使用——不是简单地把 FP32 截断成 FP8,而是通过算法找到最优的映射方式,尽量保留重要信息。
五、三重门:从训练到生产的路径
现在我们有了完整拼图。一个模型从训练到部署,要穿过三重门:
第一重门:训练
用 FP32 或 BF16 高精度训练,确保模型学到正确的模式。这个阶段不计成本地追求精度。
第二重门:存储与交换
训练好的权重用 Safetensors 安全地存起来,需要交换时用 ONNX 作为通用格式,确保哪里都能读、哪里都能跑。
第三重门:部署优化
根据目标设备的性能,选择合适的精度格式。服务器上可以用 BF16 或 FP16 平衡速度和精度;手机上可能要用 INT8 或 FP8 进一步压缩;边缘设备上甚至要考虑专门的芯片加速。
每一重门都有自己的考量:第一重门求"准",第二重门求"通",第三重门求"快"。
六、小结
ONNX、Safetensors 和精度格式,看起来是三个独立的技术,实际上解决的是同一个大问题的不同侧面:怎么让 AI 模型从实验室的训练环境,顺畅地走到各种各样的实际应用场景中。
- ONNX 解决的是"兼容性"——让模型摆脱框架绑定,哪里都能跑
- Safetensors 解决的是"安全性"——让模型文件可以安心地分享和加载
- 精度格式 解决的是"效率"——在精度和速度之间找到最佳平衡点
就像那位摄影师,只有掌握了 RAW → JPEG/PNG/TIFF 的转换之道,才能让作品被更多人看见。AI 模型也是如此——训练只是开始,真正的挑战在于让它安全、高效、无处不在地运行。
本文基于 easy-learn-ai 项目 9621a05 commit 中新增的"ONNX"、"Safetensors"、"精度格式"等模块内容整理撰写。
#easy-learn-ai #每日更新 #ONNX #Safetensors #精度格式 #模型部署 #记忆 #小凯
讨论回复
加载中...正在加载回复...
推荐
智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。