已开启
feat(torch): migrate Magistral-LoRA to pure FSDP2 #2989
Louis Victor Leborgne创建于 8月15日
feat(torch): migrate Magistral-LoRA to pure FSDP2 #2989
已开启
合并受阻
8月15日 创建了 pull request,commit 5919e97f
8月15日 关联了issue:[Feature]: 基于FSDP2后端训练MM大模型
atomgit-bot
8月15日 评论:
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 完整性、数值误差和运行时性能。


不准确?
atomgit-bot
8月15日 评论:
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 键场景) |
各变更文件审查确认
mindspeed_mm/fsdp/train/train_engine.py— 已审,无确凿问题(clip_grad<=0跳过 norm 计算与代码库另一引擎语义一致;LoRA save 提前return属文档化意图)。mindspeed_mm/fsdp/utils/lora_utils.py— 已审,无确凿问题(新增的确定性 LoRA 初始化与其他副本算法一致)。mindspeed_mm/models/transformers/cp_utils.py— 已审,无问题(新增get_safe_context_parallel_world_size合理)。mindspeed_mm/models/transformers/mistral3/mistral3.py— 已审;存在用全新MMMistralModel/MMMistralAttention覆盖既有模块的写法,但权重是否被丢弃取决于加载顺序,证据不足,未报告。mindspeed_mm/models/transformers/mistral3/modeling_mistral.py— 已审,无问题。mindspeed_mm/models/transformers/mistral3/modules.py— 已审,无问题。mindspeed_mm/patchs/torch_dcp_patch.py— 已审,报告 1 项(P2)。mindspeed_mm/task3_deterministic_lora.py— 已审,无确凿问题(诊断/同步逻辑由 env 开关控制,默认开启但语义自洽)。mindspeed_mm/task3_layer0_audit.py— 已审,无问题(默认关闭的诊断代码)。mindspeed_mm/task3_runtime_audit.py— 已审,无问题。mindspeed_mm/task3_stage_timing.py— 已审,无问题。mindspeed_mm/tasks/finetune/lora/lora_patch.py— 已审,无确凿问题(新增确定性初始化与lora_utils.py副本一致)。mindspeed_mm/training.py— 已审,报告 1 项(P0)。pretrain_transformers.py— 已审,无问题(Task3Diagnostics在 import 之后使用,正常)。scripts/measure_task3_performance.py— 已审,无问题。scripts/task3_final_eval.py— 已审,无问题。
整体风险判断
高风险:mindspeed_mm/training.py 第 11 行的 NameError 会让整个 Megatron-FSDP2 桥接训练入口在导入阶段直接崩溃,属于必须修复的启动级缺陷;torch_dcp_patch.py 的严格校验则存在破坏断点续训的回归风险。建议优先修复 P0 项后再合入。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 4 |
| 🟡 建议 | 1 |
⛔ 需要修改


不准确?
8月15日 添加了label:ascend-cla/no
此处折叠了72条消息 查看更多
9月9日 添加了label:docs-ci-pipeline-running
ascend-robot
9月9日 评论:
9月9日 评论:
9月9日 删除了label:docs-ci-pipeline-running
9月9日 添加了label:docs-ci-pipeline-success
atomgit-bot
9月9日 评论:
9月9日 评论:
变更说明
本 PR 将 Magistral-LoRA 训练路径从 Megatron-FSDP2 对照路径迁移到仓库内的纯 FSDP2 训练入口,并保留原路径作为对照基线。
关联 Issue:369
主要改动
用户可见变化
新增一条可复现的纯 FSDP2 Magistral-LoRA 训练路径;原有 Megatron-FSDP2 路径继续保留,可用于对照。诊断功能默认关闭,只有显式设置开关时才启用。
验证方式
正式 2000 步结果
Megatron-FSDP2 和纯 FSDP2 两条路径均完成 2000/2000 步,完成 optimizer step 并保存 checkpoint;没有 OOM、NaN、Traceback 或 skipped iteration。
正式性能结果
前 100 步作为 warm-up,使用第 101~2000 步统计:
Pure FSDP2 平均快 19.745%,吞吐高 24.603%。存在一个较高的最大单步长尾,已保留在审计记录中,不影响均值、P95、P99 和吞吐结论。
解耦修复验证
审阅修复后已完成本地 Python 编译、Shell 语法检查、git diff --check,并完成 4 卡短步 smoke。短测完成 前向、反向、参数更新和 checkpoint,无 Traceback、OOM 或异常退出。
自测清单
兼容性与边界
数值验收采用明确的平均误差指标,不承诺 bitwise 一致。训练脚本、模型权重、checkpoint、完整运行日志和机器相关配置不作为大文件提交;公开文档只保留可复现的配置说明和摘要结果。