摘要

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 核心能力

  1. 存储完整计算图:算子、张量连接关系、网络拓扑;

  2. 嵌入模型权重参数,文件自包含;

  3. 硬件无关 IR 描述,支持 Ascend/GPU/CPU 多后端;

  4. 输出产物:用于推理,不可用于恢复训练、继续微调。

2.2 CKPT vs MindIR 对比

格式

存储内容

主要用途

大模型训练阶段

ckpt

仅网络权重参数

断点续训、继续微调

训练过程定期保存输出

MindIR

计算图 + 权重

跨平台推理部署

训练结束后导出得到

重要提示:训练循环不会直接生成 MindIR,MindIR 是训练完成后导出产物,不能拿 MindIR 回到训练做 resume 继续训练。

3 大模型训练‑MindIR 导出‑部署完整链路

  1. 大模型分布式训练:MindSpore 执行预训练 / 微调,迭代输出分布式 ckpt 权重、并行策略 strategy_ckpt;

  2. 构造推理网络:加载网络定义,设置为 eval 推理模式;

  3. 加载分布式 ckpt 权重:结合训练策略文件,使用load_distributed_checkpoint把权重灌入推理网络;

  4. export 导出 MindIR:构造示例输入 tensor,调用 export 接口生成.mindir文件;

  5. 推理验证:MindSpore 直接加载 MindIR 验证输出;

  6. 离线部署: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。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐