已开启
feat(torch): migrate Magistral-LoRA to pure FSDP2 #2989
feat(torch): migrate Magistral-LoRA to pure FSDP2 #2989
已开启
Louis Victor Leborgne创建于 8月15日
Louis Victor Leborgne
8月15日

变更说明

本 PR 将 Magistral-LoRA 训练路径从 Megatron-FSDP2 对照路径迁移到仓库内的纯 FSDP2 训练入口,并保留原路径作为对照基线。

关联 Issue:369

主要改动

  • 新增纯 FSDP2 的 Magistral/Mistral3 模型、处理器、多模态模板和 数据处理插件和批处理器兼容路径。
  • 新增纯 FSDP2 YAML 配置和 LoRA 训练启动脚本。
  • 修复 LoRA adapter 参数与 optimizer master 参数的同步边界。
  • 增加 DCP/checkpoint 完整性检查、数值误差评估和性能统计脚本。
  • 将诊断、分阶段计时和审计能力做成可选开关,默认不改变训练逻辑。
  • 修复审阅中发现的入口初始化、回调参数传递、DCP 非 LoRA 兼容性、旧版 Transformers 多图尺寸处理、MiniMax 模板注册和临时配置文件命名问题。

用户可见变化

新增一条可复现的纯 FSDP2 Magistral-LoRA 训练路径;原有 Megatron-FSDP2 路径继续保留,可用于对照。诊断功能默认关闭,只有显式设置开关时才启用。

验证方式

正式 2000 步结果

Megatron-FSDP2 和纯 FSDP2 两条路径均完成 2000/2000 步,完成 optimizer step 并保存 checkpoint;没有 OOM、NaN、Traceback 或 skipped iteration。

  • 相对 Megatron-FSDP2 平均 loss 的平均绝对误差:0.4572%,低于 2% 精度门槛;
  • 聚合平均 loss 变化:-0.2334%;
  • DCP 键匹配和 checkpoint 完整性检查通过。

正式性能结果

前 100 步作为 warm-up,使用第 101~2000 步统计:

指标 Megatron-FSDP2 纯 FSDP2
平均 step time 1994.042 ms 1600.321 ms
P50 1924.900 ms 1572.750 ms
P95 1959.725 ms 1585.905 ms
P99 4125.775 ms 2744.852 ms
吞吐 2.005976 samples/s 2.499498 samples/s

Pure FSDP2 平均快 19.745%,吞吐高 24.603%。存在一个较高的最大单步长尾,已保留在审计记录中,不影响均值、P95、P99 和吞吐结论。

解耦修复验证

审阅修复后已完成本地 Python 编译、Shell 语法检查、git diff --check,并完成 4 卡短步 smoke。短测完成 前向、反向、参数更新和 checkpoint,无 Traceback、OOM 或异常退出。

自测清单

兼容性与边界

数值验收采用明确的平均误差指标,不承诺 bitwise 一致。训练脚本、模型权重、checkpoint、完整运行日志和机器相关配置不作为大文件提交;公开文档只保留可复现的配置说明和摘要结果。

likedislike
合并受阻
Louis Victor LeborgneLouis Victor Leborgne
8月15日 创建了 pull request,commit 5919e97f
Louis Victor LeborgneLouis Victor Leborgne
8月15日 关联了issue:[Feature]: 基于FSDP2后端训练MM大模型
atomgit-bot
atomgit-bot
8月15日 评论:

变更摘要

该 PR 主要围绕 Issue #369,为 Magistral-LoRA 训练路径新增纯 FSDP2 入口,并保留原有 Megatron-FSDP2 路径作为对比基线。核心改动包括:新增纯 FSDP2 的模型/处理器/插件与 LoRA 优化器集成、Launcher 与配置、DCP/key 校验、数值评测和性能工具,以及配套的开发与性能实践文档;同时引入确定性的 LoRA 初始化与优化器同步机制,用于在两条路径间对齐训练完整性与数值等价性。

主要改动

  • 新增纯 FSDP2 Magistral-LoRA 入口:新增 mindspeed_mm/fsdp/models/mistral3/__init__.py 中的 PureMistral3ForConditionalGeneration,以及 magistral3_fsdp2_lora_config.yaml 和 finetune_magistral_2509_pure_fsdp2_lora.sh,提供独立的模型适配器、训练配置和启动脚本,将 LoRA 训练切到纯 FSDP2 路径。
  • 接入 Pixtral 多模态插件与 tokenizer/processor 兼容路径:在 mm_plugin.py 中用 PixtralPlugin 替换 MiniMaxM3VLPlugin,在 template.py 注册带 pixtral 插件的 mistral 模板并在 data_collator.py 注册 pixtral 收集器,同时在 convert.py 中重写 load_tokenizer/update_tokenizer_with_chat_template,以支持 Mistral3/Tekken tokenizer 与 Pixtral 图像处理。
  • 新增确定性 LoRA 初始化与优化器同步:新增 task3_deterministic_lora.py 提供 apply_once、sync_optimizer_lora 和 audit_optimizer,并在 lora_utils.py、lora_patch.py、train_engine.py、training.py 中接入,使 LoRA 初始化不依赖 wrapper 遍历顺序,并在优化器首次更新前同步模型与主参数。
  • 调整训练与 checkpoint 逻辑:train_engine.py 在 clip_grad <= 0 时跳过冗余的全局 FSDP2 梯度范数计算,LoRA 保存后提前返回避免重复保存基座模型;torch_dcp_patch.py 将 DCP key 检查改为严格模式,存在无法映射到模型的 checkpoint key 时抛出异常。
  • 新增评测与诊断工具:新增 scripts/task3_final_eval.py、scripts/measure_task3_performance.py 以及 task3_diagnostics.py、task3_runtime_audit.py、task3_layer0_audit.py、task3_stage_timing.py,用于分阶段门控地检查 checkpoint 完整性、数值误差和运行时性能。
likedislike
不准确?
atomgit-bot
atomgit-bot
8月15日 评论:

代码审查

Closing Summary

已逐一审查全部 14 个变更文件,结论如下:

  • checkpoint/common/hf_to_dcp.py:已审查,新增 model.safetensors.index.json 索引解析逻辑,未发现需要上报的问题。
  • examples/magistral-2509/data.json:已审查,仅路径/预处理参数值调整,JSON 键无拼写问题。
  • examples/magistral-2509/finetune_magistral_2509_lora.sh:已审查,仅新增两个默认开启的环境变量导出,无问题。
  • examples/magistral-2509/finetune_magistral_2509_pure_fsdp2_lora.sh:已审查(新增),set -euo pipefail、sed 生成运行时配置、trap 清理等,未发现确定性问题。
  • examples/magistral-2509/fsdp2_lora_config.yaml:已审查,reduce_dtype 由 bf16 改为 fp32,属有意配置变更,键名正确。
  • examples/magistral-2509/magistral3_fsdp2_lora_config.yaml:已审查(新增),YAML 键名无拼写问题。
  • examples/magistral-2509/model.json:已审查,仅路径值变更,键名正确。
  • mindspeed_mm/fsdp/data/data_utils/func_utils/convert.py:已审查,load_tokenizer 重构及 Mistral3 处理器/Tokenizer 兼容逻辑,未发现确定性问题。
  • mindspeed_mm/fsdp/data/data_utils/func_utils/mm_plugin.py:已审查,发现 2 个问题(1 个 P2、1 个 P3),见上方报告。
  • mindspeed_mm/fsdp/data/data_utils/func_utils/template.py:已审查,删除 minimax_m3_vl 模板、新增 mistral 模板,未发现确定性问题。
  • mindspeed_mm/fsdp/data/dataloader/data_collator.py:已审查,新增 pixtral -> DataCollatorForQwen2vl 注册,复用已有 collator,未发现确定性问题。
  • mindspeed_mm/fsdp/models/mistral3/__init__.py:已审查(新增),模型适配类,未发现确定性问题。
  • mindspeed_mm/fsdp/ops/fully_shard/fully_shard.py:已审查,为 2.10.0 复用 2.9.0 补丁路径,未发现确定性问题。
  • mindspeed_mm/fsdp/tools/task3_diagnostics.py:已审查(新增),惰性导入的诊断门面,默认关闭,未发现确定性问题。

问题计数:P0 0 个,P1 0 个,P2 1 个,P3 1 个。

总体风险判断:本 PR 以新增 pure-FSDP2 Magistral-LoRA 路径为主,核心风险集中在 PixtralPlugin.process_messages 的图像 token 展开逻辑上——其中 transformers < 4.49 多图样本会因只取首图尺寸而崩溃(P2),极端长宽比图像存在空列表越界(P3,低置信度)。其余配置、脚本、注册与版本分支改动未见明确缺陷。建议重点验证多图样本与旧版 transformers 组合下的数据预处理路径。


我已完成对全部 16 个变更文件的逐一审查。最终报告如下。

审查结论

已报告的问题(按优先级)

优先级 文件:行 问题
P0 mindspeed_mm/training.py:11 Task3Diagnostics 在第 84 行才 import,却提前在第 11 行使用,导入模块时必然 NameError,导致 Megatron-FSDP2 入口无法启动
P2 mindspeed_mm/patchs/torch_dcp_patch.py:204-208 把 DCP 加载的“意外键”从告警升级为无条件 raise RuntimeError,且未限定在 LoRA 路径,可能破坏非 LoRA 断点续训(含被主动弹出的 _extra_state 键场景)

各变更文件审查确认

  1. mindspeed_mm/fsdp/train/train_engine.py — 已审,无确凿问题(clip_grad<=0 跳过 norm 计算与代码库另一引擎语义一致;LoRA save 提前 return 属文档化意图)。
  2. mindspeed_mm/fsdp/utils/lora_utils.py — 已审,无确凿问题(新增的确定性 LoRA 初始化与其他副本算法一致)。
  3. mindspeed_mm/models/transformers/cp_utils.py — 已审,无问题(新增 get_safe_context_parallel_world_size 合理)。
  4. mindspeed_mm/models/transformers/mistral3/mistral3.py — 已审;存在用全新 MMMistralModel/MMMistralAttention 覆盖既有模块的写法,但权重是否被丢弃取决于加载顺序,证据不足,未报告。
  5. mindspeed_mm/models/transformers/mistral3/modeling_mistral.py — 已审,无问题。
  6. mindspeed_mm/models/transformers/mistral3/modules.py — 已审,无问题。
  7. mindspeed_mm/patchs/torch_dcp_patch.py — 已审,报告 1 项(P2)。
  8. mindspeed_mm/task3_deterministic_lora.py — 已审,无确凿问题(诊断/同步逻辑由 env 开关控制,默认开启但语义自洽)。
  9. mindspeed_mm/task3_layer0_audit.py — 已审,无问题(默认关闭的诊断代码)。
  10. mindspeed_mm/task3_runtime_audit.py — 已审,无问题。
  11. mindspeed_mm/task3_stage_timing.py — 已审,无问题。
  12. mindspeed_mm/tasks/finetune/lora/lora_patch.py — 已审,无确凿问题(新增确定性初始化与 lora_utils.py 副本一致)。
  13. mindspeed_mm/training.py — 已审,报告 1 项(P0)。
  14. pretrain_transformers.py — 已审,无问题(Task3Diagnostics 在 import 之后使用,正常)。
  15. scripts/measure_task3_performance.py — 已审,无问题。
  16. scripts/task3_final_eval.py — 已审,无问题。

整体风险判断

高风险:mindspeed_mm/training.py 第 11 行的 NameError 会让整个 Megatron-FSDP2 桥接训练入口在导入阶段直接崩溃,属于必须修复的启动级缺陷;torch_dcp_patch.py 的严格校验则存在破坏断点续训的回归风险。建议优先修复 P0 项后再合入。

类型 数量
🔴 阻塞 4
🟡 建议 1

⛔ 需要修改

likedislike
不准确?
ascend-robotascend-robot成员
8月15日 添加了label:ascend-cla/no
此处折叠了72条消息 查看更多
ascend-robotascend-robot成员
9月9日 添加了label:docs-ci-pipeline-running
ascend-robot
ascend-robot成员
9月9日 评论:

✅ 文档门禁通过!

检查项 检查结果 详情
markdownlint ✅ 已通过 查看详情
link-validity-check ✅ 已通过 查看详情
resource-existence-check ✅ 已通过 查看详情
tag-closed-check ✅ 已通过 查看详情
likedislike
ascend-robotascend-robot成员
9月9日 删除了label:docs-ci-pipeline-running
ascend-robotascend-robot成员
9月9日 添加了label:docs-ci-pipeline-success
atomgit-bot
atomgit-bot
9月9日 评论:

代码审查

✅ 未发现问题

likedislike
不准确?