摘要
MindIR(MindSpore Intermediate Representation)是昇思 MindSpore 原生中间表示模型格式,注意 MindIR 不是训练过程保存断点的格式,大模型训练阶段输出 ckpt 检查点,训练完成后导出 MindIR 用于推理部署。MindIR 同时保存计算图结构、算子定义与权重参数,屏蔽不同硬件后端差异,实现 “一次训练,多端部署”。大模型分布式训练完成后,从 ckpt 权重导出 MindIR,可交付 MindSpore 原生推理、MindSpore‑Lite,也可经由 ATC 工具编译生成 om 离线模型,部署到昇腾 NPU。本文讲解 MindIR 基本概念、和 ckpt 的区别、大模型训练后导出 MindIR 完整流程、分布式场景处理、代码实践、约束限制与问题排查,帮助开发者打通大模型训练到推理部署链路。
1 背景介绍
昇思 MindSpore 大模型训练(预训练、微调)过程中,使用CheckPoint(ckpt)保存权重断点,ckpt 只存储参数值,不保存完整网络图结构,主要用于断点续训、继续微调,不能直接用于跨硬件推理部署。
很多开发者容易混淆 ckpt 与 MindIR:训练循环迭代保存 ckpt;训练收敛完成,加载 ckpt 权重到推理网络,导出 MindIR。大模型场景还会遇到分布式切分权重,导出 MindIR 需要处理并行策略文件。MindIR 作为统一中间表示,向上承接训练产出,向下对接昇腾推理全栈。
实际开发痛点:分布式大模型直接导出 MindIR 失败;动态 shape 配置错误;控制流算子导致导出报错;导出后的 MindIR 推理精度与训练结果不一致。掌握 MindIR 导出约束,是大模型训推打通的关键。
2 MindIR 格式核心概念与和 CKPT 对比
2.1 MindIR 核心能力
存储完整计算图:算子、张量连接关系、网络拓扑;
嵌入模型权重参数,文件自包含;
硬件无关 IR 描述,支持 Ascend/GPU/CPU 多后端;
输出产物:用于推理,不可用于恢复训练、继续微调。
2.2 CKPT vs MindIR 对比
格式 | 存储内容 | 主要用途 | 大模型训练阶段 |
ckpt | 仅网络权重参数 | 断点续训、继续微调 | 训练过程定期保存输出 |
MindIR | 计算图 + 权重 | 跨平台推理部署 | 训练结束后导出得到 |
重要提示:训练循环不会直接生成 MindIR,MindIR 是训练完成后导出产物,不能拿 MindIR 回到训练做 resume 继续训练。
3 大模型训练‑MindIR 导出‑部署完整链路
大模型分布式训练:MindSpore 执行预训练 / 微调,迭代输出分布式 ckpt 权重、并行策略 strategy_ckpt;
构造推理网络:加载网络定义,设置为 eval 推理模式;
加载分布式 ckpt 权重:结合训练策略文件,使用
load_distributed_checkpoint把权重灌入推理网络;export 导出 MindIR:构造示例输入 tensor,调用 export 接口生成
.mindir文件;推理验证:MindSpore 直接加载 MindIR 验证输出;
离线部署:ATC 工具将 MindIR 编译为 om 模型,用于 Ascend NPU 推理服务。
分布式特殊说明
大模型 TP/PP 并行训练产出分片 ckpt,导出 MindIR 时,需要读取训练保存的strategy_ckpt,生成推理 layout 策略,再加载分片权重,否则权重加载失败,导出报错。
4 代码实践
4.1 环境准备 env.sh
source /usr/local/Ascend/ascend‑toolkit/set_env.sh pip install mindspore‑ascend==2.6.0 export ASCEND_GLOBAL_LOG_LEVEL=34.2 大模型训练后导出 MindIR 示例 export_mindir.py
import numpy as np from mindspore import Tensor, export, context from mindspore import load_distributed_checkpoint, set_auto_parallel_context # 以简易大模型网络举例,替换为你的大模型网络定义 from large_model import LargeLLMNet def main(): # 设置静态图模式,导出MindIR必须GRAPH_MODE context.set_context(mode=context.GRAPH_MODE, device_target="Ascend", device_id=0) # 分布式场景:加载训练阶段保存的并行策略文件 set_auto_parallel_context( strategy_ckpt_load_file="./output/train_strategy.ckpt" ) # 1.初始化推理网络,eval模式,关闭dropout等训练组件 net = LargeLLMNet(vocab_size=32000, hidden_size=512) net.set_train(False) # 构造推理输入样例,shape需要匹配模型输入 input_ids = Tensor(np.ones((1,128), dtype=np.int32)) # 2.生成推理layout策略,用于分布式权重加载 predict_layout = net.infer_predict_layout(input_ids) # 分布式分片ckpt文件列表(训练输出的多个分片权重) ckpt_file_list = [ "./output/ckpt/rank_0‑llm.ckpt", "./output/ckpt/rank_1‑llm.ckpt" ] # 加载分布式训练ckpt权重灌入网络 load_distributed_checkpoint(net, ckpt_file_list, predict_layout) # 3.导出MindIR,file_format指定MINDIR export( net, input_ids, file_name="./llm_model", file_format="MINDIR" ) print("MindIR导出完成,输出文件 llm_model.mindir") if __name__ == "__main__": main()4.3 MindIR 加载推理验证 infer_mindir.py
from mindspore import context, Model import numpy as np from mindspore import Tensor context.set_context(mode=context.GRAPH_MODE, device_target="Ascend") def run_mindir_infer(): model = Model("./llm_model.mindir") input_data = Tensor(np.ones((1,128), dtype=np.int32)) output = model.predict(input_data) print("MindIR推理输出shape:", output[0].shape) if __name__ == "__main__": run_mindir_infer()4.4 ATC 工具:MindIR 编译昇腾 om 离线模型
source env.sh atc --model=./llm_model.mindir \ --output=./llm_model.om \ --soc_version=Ascend910B \ --input_shape="input_ids:1,128"5 FAQ 常见问题
Q1:MindIR 可以用来恢复大模型继续训练吗?A:不可以。MindIR 是推理 IR,不包含优化器状态、训练循环信息;断点续训只能使用 ckpt 文件。
Q2:大模型分布式训练,导出 MindIR 报权重加载失败?A:确认加载训练输出的train_strategy.ckpt;调用infer_predict_layout生成推理 layout;ckpt_file_list 路径与 rank 分片文件一一对应。
Q3:export 导出 MindIR 报错控制流不支持?A:MindIR 对部分动态控制流支持有限,需要简化网络推理分支,把训练阶段独有的控制逻辑在 eval 模式去除。
Q4:MindIR 推理结果和 ckpt 直接推理结果不一致?A:检查网络是否没有切换 set_train (False);确认 dropout 等随机模块是否关闭;核对 export 输入样例 dtype 与维度。
Q5:MindIR 和 ONNX 怎么选择?A:昇思全栈优先 MindIR,原生适配 MindSpore、ATC、MindSpore‑Lite;跨其他框架交互场景选择 ONNX。
6 总结
昇思 MindSpore 大模型训练阶段输出 ckpt 检查点用于断点续训、微调;MindIR 不是训练产物,是训练收敛后导出的推理中间表示,同时保存网络图结构与权重,屏蔽硬件差异。
大模型 TP/PP 分布式场景导出 MindIR,需要带上训练并行策略文件,加载分片 ckpt 权重到 eval 推理网络,调用 export 接口生成 mindir 文件;得到 MindIR 后,既可以在 MindSpore 直接推理验证,也可以经由 ATC 编译得到 om 离线模型部署昇腾 NPU。