关于模型结构与参数的文件类型及运行设备
.ckpt
广泛用于 PyTorch、TensorFlow(早期版本)及MindSpore的模型 checkpoint 文件。主要保存模型的权重参数、优化器状态、训练配置等,支持训练中断后恢复、模型微调或后续导出为部署格式(如 MindSpore 可将.ckpt 转为 ONNX、AIR 等)。
.ONNX
(Open Neural Network Exchange)开放神经网络交换格式,由多机构联合推出,用于跨框架模型互转(如 PyTorch、TensorFlow、MindSpore、MXNet 等),是模型部署的中间标准格式,便于在不同推理引擎(如 ONNX Runtime)中部署。
.GEIR
非通用标准格式,推测与特定国产 AI 框架或工具链(如昇腾相关)的模型中间表示有关,用于模型转换或优化过程中的临时存储。
.om
华为昇腾(Ascend)芯片的专用部署格式,由昇腾模型转换工具(ATC)将 ONNX、Caffe、MindSpore 的 AIR 等格式转换而来,针对昇腾 NPU 硬件优化,用于高效推理。
这是华为Ascend AI处理器支持的离线模型格式。
.prototxt + .caffemodel
Caffe 框架的配套文件:
.prototxt:定义网络结构(层配置、输入输出等,分训练和部署版本);这是Caffe模型文件的格式。
.caffemodel:保存训练好的权重参数,需与对应的.prototxt 配合加载模型。这是Caffe模型文件的格式。
.pb
(Protocol Buffer)Google 的序列化格式,在 TensorFlow 中常用于保存冻结模型(包含结构和权重),直接用于部署;此外,MindSpore 也支持将模型导出为.pb 格式(兼容 TensorFlow Lite),便于跨平台推理。
这是TensorFlow模型文件的格式。
MindSpore 特有的其他格式
.air:MindSpore 的专有中间格式,包含网络结构和权重,可作为向昇腾 OM、TensorRT 引擎等格式转换的中间载体;
.mindir:MindSpore 定义的统一模型表示格式,支持动态图和静态图模型的存储,用于模型的跨平台部署和迁移。
直接使用checkpiont文件进行推理,即在MindSpore训练环境下,使用推理接口加载数据及checkpoint文件进行推理。
将checkpiont文件转化为通用的模型格式[如ONNX、GEIR格式]文件进行推理,推理环境不需要依赖MindSpore。这样做的好处是可以跨硬件平台,只要在支持ONNX/GEIR推理的硬件平台上即可进行推理。譬如在Ascend 910 AI处理器上训练的模型可以在GPU/CPU上进行推理。
ONNX 作为中间格式,既可以作为网络结构的中间转换载体,也可以作为权重参数的中间转换载体,但需要明确的是:它的设计是将 “结构” 和 “参数”绑定在一起作为 “完整模型” 进行转换,而非单独拆分存储结构或参数。具体来说:
作为网络结构的中间转换者ONNX 能够精确描述不同框架(如 PyTorch、TensorFlow、MindSpore 等)定义的网络结构(计算图、算子连接、张量维度等)。例如,PyTorch 的
torch.onnx.export
会将模型的动态计算图转换为 ONNX 静态计算图结构,TensorFlow 也可通过工具将SavedModel
转换为 ONNX 结构。其他框架(如 MXNet、PaddlePaddle)也支持导出为 ONNX 结构。这意味着 ONNX 可以作为 “结构转换的桥梁”,让不同框架的网络结构能够被统一解析和转换(例如,将 PyTorch 的 ResNet 结构通过 ONNX 转换为 TensorRT 可识别的结构)。作为权重参数的中间转换者ONNX 会将模型的权重参数(如卷积核、偏置、BN 层的均值 / 方差等)以 “初始器(Initializer)” 的形式嵌入到文件中,与结构绑定。这些参数会随着结构一起被转换:例如,PyTorch 模型导出为 ONNX 时,权重会从 PyTorch 的张量格式转换为 ONNX 定义的张量格式;当 ONNX 模型被转换为 TensorRT 引擎或昇腾 OM 格式时,权重也会被同步转换为目标平台支持的参数格式(如针对硬件优化的精度、存储方式)。因此,ONNX 也承担了 “参数转换的中间载体” 角色,确保权重在跨框架 / 跨硬件时能够被正确解析和复用。
关键结论
ONNX 不支持 “单独存储结构或单独存储参数”,但它同时包含结构和参数,并能作为两者的统一中间转换者—— 通过 ONNX,不同框架的结构可以被统一表示,参数可以被统一携带,最终实现 “结构 + 参数” 的整体跨平台转换。这种 “绑定式转换” 正是 ONNX 作为中间格式的核心价值:保证结构与参数的一致性,避免转换过程中出现不匹配问题。