已开启
feat(torch): add Magistral-Small-2509 FSDP2 training #3133
feat(torch): add Magistral-Small-2509 FSDP2 training #3133
已开启
chenchen创建于 28 天前
chenchen
chenchen
28 天前

What this PR does / why we need it?

为 #368 增加 Magistral-Small-2509 纯 FSDP2 训练支持,使该模型不再依赖 Megatron-FSDP2 后端即可训练,并与现有 Megatron-FSDP2 配置进行精度和性能比较。

  • 增加 Mistral3 模型、Pixtral 数据处理、单机 8 卡与 4 卡训练配置及启动脚本。
  • 按图像边界设置视觉注意力的累计序列长度,保持多张图像之间的注意力独立;视觉编码器不参与上下文并行通信,语言序列支持 Ulysses、Ring Attention 和 hybrid_cp_algo 上下文并行。
  • 适配分块损失计算、激活重计算和异步激活卸载;修复打包数据的 position_ids 补齐,并过滤因最大长度截断而不完整的 Pixtral 图像标记序列。
  • 根据代码审查结果消除重复图像预处理和视觉塔各层重复的设备到主机转换,补齐公开 forward 参数、缺少 image_sizes 时的处理和相应测试。
  • 按维护者意见移除模型迁移与性能优化两篇实践文档,改为发布在社区 issue #703。

Does this PR introduce any user-facing change?

新增以下训练入口和说明:

  • examples/magistral-2509/finetune_magistral_2509_v1.sh 和 magistral_2509_config_v1.yaml 提供单机 8 卡 BF16 配置。
  • examples/magistral-2509/finetune_magistral_2509_v1_4card.sh 和对应 YAML 提供使用 adamw_swap 的单机 4 卡配置。
  • examples/magistral-2509/README_v1.md 说明安装、数据准备、训练和检查点恢复方法。

模型迁移与性能优化实践文档不随本 PR 提交,全文见 issue #703。

How was this patch tested?

实测结果

项目 结果
平台与训练规模 单台 8 × Ascend 910B3,Magistral-Small-2509 24B,BF16;Megatron-FSDP2 与纯 FSDP2 各连续运行 2000 步。
精度 两种后端的归一化平均绝对损失差为 0.708614%,低于 2% 验收阈值。
性能 第 101 至 2000 步的平均单步耗时分别为 2397.8312 ms 和 2374.4979 ms,纯 FSDP2 的平均单步耗时降低了 0.9731%。
训练与恢复 纯 FSDP2 使用真实图文数据完成 30 步训练,保存 Distributed Checkpoint(DCP),并从第 31 步恢复训练。
视觉注意力 39 项 NPU 测试通过;最大前向相对 L2 误差为 0.0004810383,最大梯度相对 L2 误差为 0.0052183196,多张图像之间的注意力独立性检查通过。
最终回归 审查修订提交(现为 0ecf62e8)完成 30 步真实数据训练,损失和梯度范数均为有限值,没有 NPU 显存溢出;相关范围的 70 项单元测试通过。
持续集成 文档移除提交在 rebase 前为 306dd193,其文档门禁和完整持续集成 PR-pipeline_MindSpeed-MM#4847 全部通过;当前提交 d44a33d2 的流水线结果以本 PR 最新记录为准。

文档移除提交只删除两篇实践文档和三处文档链接,没有改动运行代码、配置、测试逻辑或依赖,因此没有重复执行上述实验。

为解决与 master 的冲突,本分支已 rebase 到 0029fcfe,三个提交的内容不变,哈希相应变化:任务实现提交由 74760a54 变为 c6853001,审查修订提交由 3213496c 变为 0ecf62e8,文档移除提交由 306dd193 变为 d44a33d2。冲突只出现在 mindspeed_mm/fsdp/data/dataloader/data_collator.py 的注册段落,上游新增的 text_only 与本 PR 新增的 pixtral 两项注册均已保留。rebase 后 docs/ 目录不再有任何改动。下文引用流水线记录时沿用当时的提交哈希。

优化功能

各功能分别与关闭该功能的配置比较。每个配置连续运行 20 步,损失差均低于 2%,且没有发生 NPU 显存溢出。

功能 实测结果
Ulysses 上下文并行,组大小 2 最大已分配显存减少 3377.44 MB,平均单步耗时增加 25.45%。
Ring Attention,组大小 2 最大已分配显存减少 2030.08 MB,平均单步耗时增加 39.78%。
激活重计算 最大已分配显存减少 7120.50 MB。该组实验同时观察到单步耗时下降,但 20 步的测试长度不足以证明这一差异能够稳定复现,因此不作为性能结论。
分块损失计算,块大小 256 最大已分配显存减少 372 MB,最大保留显存增加 1680 MB,因此没有证明整体显存或性能收益。
异步激活卸载 最大保留显存减少 520 MB;其单步耗时差异落在对照组自身的波动范围之内,因此不认定为性能提升。

损失差按 sum(abs(loss_pure-loss_base)) / sum(abs(loss_base)) 计算,性能统计排除前 100 个预热步骤。20 步的功能对照实验只能支持功能正确性、损失差、峰值显存和短期单步耗时这几项结论,不能替代长期稳定性测试。全部性能结果来自单机 8 × Ascend 910B3,不能直接外推到多机或其他硬件。

实验分阶段执行:30 步训练、DCP 恢复和 2000 步后端比较使用 cdefc58b;Ulysses 与 Ring Attention 使用 1134a0fd;其余优化功能和此前最终回归使用 7a151c16。本 PR 包含任务实现、审查修订和文档移除三个提交,rebase 后分别为 c6853001、0ecf62e8 和 d44a33d2。审查修订提交另行通过 70 项单元测试、八卡 HCCL all_reduce 与矩阵乘法检查、hybrid_cp_algo 上下文并行配置下的视觉注意力检查和 24B 真实数据 30 步训练。2000 步实验使用非打包数据路径,后续数据处理修复不会在该实验中触发。

提交 74760a54 的流水线 #4809 和提交 3213496c 的流水线 #4818 首次运行时,Qwen3.5 系统测试都因为出现了单个耗时约 5 秒的异常步骤而未达到单步耗时阈值。流水线 #4814 和 #4818 的重试都已通过;这两次通过的运行同样出现过同类异常步骤,只是该步骤落在预热区间内。除该异常步骤以外,参与判定的步骤耗时均低于基准,因此没有证据表明存在持续的性能回归。原始失败和通过结果均已保留。

Magistral-Small-2509 是稠密模型,没有专家层,因此无法执行有意义的专家并行对照。请维护者确认专家并行在本模型上不适用。

复现与材料

  • 训练说明提供固定软件环境、数据准备、配置和运行命令。
  • Issue #703发布模型迁移实践和性能优化实践两篇文章及结果图,说明模型、数据、视觉注意力、上下文并行实现,以及实验方法、统计口径、结果和适用范围。
  • 公开证据包包含逐步数据、配置、汇总、图表和单元测试输出,SHA-256 为 2ca862ecf16425bb368aa5a19b90d63854e58b94751454d545978742cfbccdf6。
likedislike
合并受阻
chenchenchenchen
28 天前 创建了 pull request,commit 0333db0e
chenchenchenchen
28 天前 关联了issue:[Feature]: 基于FSDP2后端训练MM大模型
atomgit-bot
atomgit-bot
28 天前 评论:

变更摘要

本 PR 为 Magistral-Small-2509(Mistral3)增加纯 FSDP2 训练支持(对应 issue #368):新增 Mistral3ForConditionalGenerationFSDP 模型适配并注册为 model_id: mistral3,实现多图视觉注意力按每张图像序列长度分别计算且视觉编码器不参与上下文并行(CP)通信,语言序列支持 Ulysses、Ring 和 Hybrid 并行,并适配分块损失(ChunkLoss);同时补充数据侧注册(mistral 模板、pixtral 插件与数据整理器、fix_mistral_regex 参数)及 8 卡/4 卡训练脚本与 YAML 配置、相关测试。训练默认冻结视觉编码器与投影模块,使用 BF16;PR 描述中说明还包含三份使用与迁移文档(无内嵌补丁)。

主要改动

  • Mistral3 模型适配:新增 Mistral3ForConditionalGenerationFSDP(注册于 model_id: mistral3),默认 forward 直接委托上游 Mistral3ForConditionalGeneration;当启用分块损失或上下文并行时改走 _feature_forward,分块损失路径下 lm_head 直接接收 loss_function 与 labels 并返回 loss,CP 路径通过 _context_parallel_model_forward 在图像合并与解码器之间切分序列,并将 CP 组内各分片损失求和。
  • 视觉注意力多图隔离:_prepare_vision_attention 前置钩子按各图像尺寸生成 cu_seq_lens/max_length 并设置 skip_context_parallel=True,视觉编码器在各 rank 上复制处理完整图像;_context_parallel_model_forward 中通过 skip_ulysses=True 保证视觉塔不进入 Ulysses all-to-all,防止不同图像的视觉 token 被拼接在一起计算。
  • flash attention 打包序列转换重构:_convert_cu_seq_lens 重写 1TND/1NTD 布局处理,校验 Q/K 长度成对出现、去掉 HF 偏移中的零前缀并转换为 NPU 累积结束位置,单序列或等长序列回退到稠密 BSND/BNSD;flash_attention_forward 新增 skip_context_parallel 参数,供视觉塔等序列切分之外的复制模块跳过 CP 分支。
  • 数据侧注册:新增 mistral 对话模板([INST]…[/INST]、[SYSTEM_PROMPT] 等格式,绑定 pixtral 插件与 [IMG] 图像 token);PixtralPlugin 将图像占位符展开为按行 image_break_token、末位 image_end_token 的 patch 网格,并在 transformers < 4.49.0 时移除 image_sizes 入参;data_collator 注册 pixtral 并复用 DataCollatorForQwen2vl;ProcessorArguments 新增 fix_mistral_regex 字段并透传给 AutoTokenizer.from_pretrained。
  • 训练示例与测试:新增 examples/magistral-2509/ 下 8 卡(finetune_magistral_2509_v1.sh)与 4 卡(optimizer: adamw_swap)微调脚本及两份 YAML 配置(FSDP2 分片计划、BF16、冻结 model.vision_tower 与 model.multi_modal_projector);新增 30 步合成小模型 smoke 测试 train_smoke.py、NPU 视觉注意力探针 vision_attention_probe.py,以及覆盖数据侧注册与视觉注意力行为的单元测试。
likedislike
不准确?
atomgit-bot
atomgit-bot
28 天前 评论:

代码审查

✅ 未发现问题

likedislike
不准确?
此处折叠了166条消息 查看更多
ascend-robotascend-robot成员
22 天前 删除了label:ci-pipeline-failed
ascend-robotascend-robot成员
22 天前 添加了label:ci-pipeline-running
ascend-robotascend-robot成员
22 天前 删除了label:ci-pipeline-running
ascend-robotascend-robot成员
22 天前 添加了label:ci-pipeline-passed
ascend-robot
ascend-robot成员
22 天前 评论:
流水线 PR-pipeline_MindSpeed-MM#4874 (重试第1次) [ commitID:d44a33d2 ] 已完成
>>>代码风格自动修复执行成功(无修复内容)
阶段 任务名 状态 详情
编译构建 Build ✅ COMPLETED >>>
恶意代码检查 Antipoison ✅ COMPLETED >>>
编码安全与规范检查 Only_doc_commit ✅ COMPLETED >>>
codeCheck_pre-commit ✅ COMPLETED >>>
pre-commit ✅ COMPLETED >>>
Compatibility_Interface ✅ COMPLETED >>>
开源片段检查 SCA ✅ COMPLETED >>>
开发者测试 UT ⚪ IGNORED >>>
ST ⚪ IGNORED >>>
UT-pool ✅ COMPLETED >>>
ST_pool ✅ COMPLETED >>>
流水线 PR-pipeline_MindSpeed-MM ✅ COMPLETED >>>
此流水线已支持下列评论快捷指令,仅PR创建者和白名单成员[wujinyuan1, htwang, hhhzhuyizhi, cxiaolong, bigdog1206, ghoshaw, yaoyaoxu]评论有效
  • compile : 运行流水线
  • retry : 重试流水线所有失败子任务
  • retry <任务名> : 仅重试指定失败子任务
  • stop : 停止流水线
likedislike