大模型训练:保存mindir 格式模型
摘要
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=3
4.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。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)