大模型训练:模型格式转换及调试优化
在大模型训练与部署链路中,会涉及 HuggingFace 权重、MindSpore‑CKPT、MindIR、OM 等多种模型格式的相互转换。实际开发中,经常出现权重转换参数名不匹配、MindIR 导出报错、转换后精度漂移、训练 loss 抖动、算子性能低下等问题。本文围绕大模型完整链路,梳理权重格式转换实操、MindIR 导出、Dump 精度调试、MindInsight 性能调优,配套完整代码示例,适配 MindSpore2.6.0、MindFormers1.8.0、CANN8.5.0,硬件 Atlas910B/A3,覆盖 “权重转换‑模型导出‑精度调试‑性能优化‑问题验证” 全流程,帮助开发者完成大模型训练与部署调优闭环。
一、环境准备与模型格式说明
大模型链路中主流格式:
1. HF‑Safetensors/PTH:HuggingFace 生态权重,开源大模型主流分发格式;
2. MindSpore‑CKPT:昇思训练权重格式,用于训练续训、微调;
3. MindIR:MindSpore 统一中间图表示,训练转推理的核心载体;
4. OM:CANN ATC 编译输出,昇腾硬件离线推理模型。
# openEuler 22.03 ARM64环境准备
sudo dnf install -y mindspore mindformers
# 加载CANN环境变量
echo "source /usr/local/Ascend/ascend‑toolkit/8.5.0/set_env.sh" >> ~/.bashrc
source ~/.bashrc
# 版本校验
python3 -c "import mindspore;print(mindspore.__version__)"
npu‑smi info
# 获取MindFormers转换脚本
git clone https://gitee.com/mindspore/mindformers.git
cd mindformers
pip install -r requirements.txt
注意:权重转换、MindIR 导出,MindSpore 与 CANN 版本必须匹配,版本不一致极易出现算子不支持、精度异常问题。
二、大模型权重格式转换实操
开源大模型大多为 HuggingFace 格式,需要转换为 MindSpore CKPT 才能用于微调训练,MindFormers 提供convert_weight.py完成双向转换。
2.1 HF Safetensors 转换 MindSpore CKPT
# HF权重转MindSpore ckpt,以Qwen‑7B为例
python mindformers/convert_weight.py \
--model qwen \
--input_path ./hf_model/Qwen‑7B‑Chat \
--output_path ./ms_ckpt/qwen7b.ckpt \
--dtype bf16
2.2 代码方式加载转换后权重,启动微调
import mindspore as ms
from mindformers import AutoModel, AutoTokenizer
ms.set_context(device_target="Ascend", device_id=0, mode=ms.GRAPH_MODE)
# 加载tokenizer与大模型,载入转换好的ckpt权重
model = AutoModel.from_pretrained(
config="./configs/qwen/finetune_qwen7b.yaml",
checkpoint="./ms_ckpt/qwen7b.ckpt"
)
tokenizer = AutoTokenizer.from_pretrained("./hf_model/Qwen‑7B‑Chat")
# 简单推理验证权重转换正确性
prompt = "请简单介绍昇思MindSpore"
inputs = tokenizer(prompt, return_tensors="ms")
outputs = model.generate(**inputs, max_new_tokens=100)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
2.3 MindSpore CKPT 导出 MindIR(训练转推理关键步骤)
训练完成的 ckpt,导出 MindIR,后续交给 ATC 工具编译 OM 模型,支持开启 KVCache 增量推理,适配大模型场景。
import mindspore as ms
from mindspore import export, Tensor
from mindformers import AutoModel
ms.set_context(device_target="Ascend", mode=ms.GRAPH_MODE)
model = AutoModel.from_pretrained(
config="./configs/qwen/export_qwen7b.yaml",
checkpoint="./ms_ckpt/qwen7b_finetuned.ckpt"
)
model.set_train(False)
# 构造虚拟输入:input_ids,attention_mask
dummy_input_ids = Tensor([[101,234,567,789]], ms.int32)
dummy_attn_mask = Tensor([[1,1,1,1]], ms.int32)
# 导出MindIR,支持增量推理use_past=True
export(
model,
dummy_input_ids,
dummy_attn_mask,
file_name="./mindir/qwen7b_inc",
file_format="MINDIR"
)
print("MindIR导出完成")
2.4 ATC 工具将 MindIR 编译为昇腾 OM 模型
atc --model=./mindir/qwen7b_inc.mindir \
--framework=5 \
--output=./om/qwen7b_inc \
--input_shape="input_ids:1,4;attention_mask:1,4" \
--soc_version=Ascend910B \
--log=warning
三、精度问题调试:Dump 工具与 TroubleShooter 定位误差
格式转换后,经常出现推理输出和 HF 原版结果不一致,训练 loss 出现 NAN、loss 不收敛。MindSpore 提供 Dump 工具,保存算子输入输出,对比标杆结果二分定位精度差异点。
3.1 开启 Dump 采集算子中间输出
import mindspore as ms
# 配置Dump,保存算子张量
dump_cfg = ms.DumpConfig()
dump_cfg.dump_mode = ms.DumpMode.ALL
dump_cfg.path = "./dump_data"
ms.set_dump(dump_cfg)
ms.set_context(device_target="Ascend", mode=ms.GRAPH_MODE)
# 执行推理,算子中间张量自动落盘dump_data
model = AutoModel.from_pretrained(...)
inputs = tokenizer(prompt, return_tensors="ms")
_ = model.generate(**inputs, max_new_tokens=20)
拿到 dump 输出后,使用TroubleShooter对比 MindSpore 与 PyTorch 的中间 npy 输出,定位第一个数值偏差算子。
# TroubleShooter对比两组npy输出,定位精度异常节点
python -m mindspore.troubleshooter compare --ms‑npy ./dump_data --ref‑npy ./ref_pytorch_npy
典型精度问题:
1. 权重转换参数名不匹配:转换时日志出现大量not loaded告警,核对 convert_weight 模型类型参数;
2. BF16/FP16 混合精度溢出:开启 loss‑scale,设置amp_level="O2";
3. 导出 MindIR 使用 PYNATIVE 模式:导出必须 GRAPH_MODE,否则导出失败。
四、训练性能调试优化(MindInsight + 代码调优)
大模型训练常见痛点:NPU 利用率低、迭代速度慢、显存 OOM。MindInsight 可视化查看迭代轨迹、算子耗时,配合代码层面混合精度、重计算、PageAttention 做优化。
import mindspore as ms
from mindformers import AutoModel
ms.set_context(device_target="Ascend", mode=ms.GRAPH_MODE)
model = AutoModel.from_pretrained(config="./configs/qwen/finetune_qwen7b.yaml")
# 1.开启混合精度,提升训练性能
model = ms.amp.auto_mixed_precision(model, amp_level="O2")
# 2.开启重计算,降低显存占用
model.recompute()
# 3.大模型开启PageAttention优化KVCache显存
model.config.use_page_attention = True
# 开启MindInsight训练日志,后续可视化分析
from mindspore import SummaryRecord
summary_writer = SummaryRecord("./summary_dir")
# 训练循环中记录loss、性能指标
for step, batch in enumerate(train_dataloader):
loss = model(**batch)
summary_writer.record(loss, step=step)
summary_writer.close()
启动 MindInsight 服务,浏览器打开页面,导入summary_dir,查看迭代耗时、算子占比、loss 曲线,定位 MatMul、Attention 等热点算子。
mindinsight start --summary‑base‑dir ./summary_dir --port 8080
五、格式转换与调优常见踩坑
1. 权重转换后部分权重未加载:检查convert_weight.py的--model参数,模型类型必须和权重匹配;打印网络参数名,消除前缀不匹配问题。
2. MindIR 导出报错控制流不支持:大模型导出推理图,关闭训练特有的控制流逻辑,model.set_train(False)。
3. 转换 OM 推理精度下降:ATC 编译确认 socversion 与硬件芯片匹配,精度模式设置为 forcebf16。
4. 训练 loss 出现 NAN:Dump 定位溢出算子,调大 loss‑scale,检查输入数据是否存在 nan/inf。
5. 显存 OOM:启用 recompute 重计算、PageAttention,调小 batch_size,开启梯度累积。
六、总结
在 MindSpore 大模型完整链路中,模型格式转换是连接开源权重、训练微调、昇腾部署的关键桥梁。完整流程为:HuggingFace Safetensors → MindSpore‑CKPT(转换脚本)→ 训练微调 → CKPT 导出 MindIR → ATC 编译 OM 推理模型。
当转换后出现精度偏差,借助 Dump+TroubleShooter 二分定位算子数值差异;性能不达标时,利用 MindInsight 分析迭代与算子耗时,配合混合精度、重计算、PageAttention 完成调优。开发者要重点注意版本对齐、GRAPH_MODE 导出、权重名称映射三个关键点,减少格式转换带来的各类隐性问题,保障大模型在昇腾 NPU 高效训练与部署。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐

所有评论(0)