Prhub

#5381 [megatron, model] feat: qwen3.5 example

原始 PR 作者 ISEEKYAN 合并时间 2026-03-13 10:47 文件变更 17 提交数 14 评论 42 代码增减 +746 / -74

执行摘要

新增 Qwen3.5 模型的 Megatron 训练示例和代码支持。

PR body中说明,感谢@LiuXTao在mbridge上的工作(https://github.com/ISEEKYAN/mbridge/pull/83)支持了Qwen3.5,此PR基于此在verl上成功运行Qwen3.5 SFT。Issue评论中用户询问是否支持RL,作者更新了RL脚本,但提到vllm依赖问题,体现了添加Qwen3.5训练支持的需求。

此PR值得工程师精读,以了解如何适配新模型架构到现有训练框架。关注设计决策:chat_template的异常处理机制、tool_parser的扩展性、以及Megatron配置中use_remove_padding参数的设计权衡。对于维护者,建议审查Exception捕获逻辑,并跟踪Megatron-LM对Qwen3.5 THD格式的支持进展。

讨论亮点

Review评论中的核心讨论包括:

  • gemini-code-assist[bot]在verl/utils/dataset/multiturn_sft_dataset.py中指出捕获宽泛Exception可能隐藏bug,建议捕获更具体的异常类型,但未完全解决。
  • wuxibin89在verl/workers/engine_workers.py中讨论model.use_remove_padding和engine.use_remove_padding参数的关系,ISEEKYAN回复标记model.use_remove_padding为deprecated,仅使用engine.use_remove_padding。
  • wuxibin89在verl/utils/tensordict_utils.py中询问NestedTensor unbind失败原因,ISEEKYAN解释是PyTorch bug导致3D jagged tensors问题,已通过文档和代码修复。
  • wuxibin89在examples/grpo_trainer/run_qwen3_5-35b-megatron.sh中提出对新模型引擎使用NestedTensor的疑问,但未进一步讨论结论。
  • mamazi0131在Issue评论中分享成功运行经验并讨论性能对比。

实现拆解

实现方案分为多个模块:

  1. 示例脚本:新增examples/grpo_trainer/run_qwen3_5-35b-megatron.sh和examples/sft/gsm8k/run_qwen3_5_megatron.sh,配置Megatron并行参数和Qwen3.5特定设置(如use_remove_padding=False)。
  2. chat模板:修改verl/utils/chat_template.py中的apply_chat_template函数,处理Qwen3.5至少需要一个用户消息的模板需求。
  3. 工具解析器:在verl/experimental/agent_loop/tool_parser.py中新增Qwen3XMLToolParser类,支持Qwen3.5模型的XML格式工具调用解析。
  4. agent循环:调整verl/experimental/agent_loop/agent_loop.py中的_compute_position_ids函数,以兼容transformers>=5.3.0引入的mm_token_type_ids参数。
  5. 数据处理器:修改verl/utils/dataset/multiturn_sft_dataset.py,增强对视觉内容的处理和错误处理。
  6. Megatron工具:更新verl/utils/megatron_utils.py中的load_megatron_model_to_gpu函数,修复Gated DeltaNet等非标准层的grad buffer处理。
  7. 其他修改:包括更新CI工作流以支持transformers>=5.0.0,修复NestedTensor处理(verl/utils/tensordict_utils.py)等。
文件 模块 状态 重要度
examples/grpo_trainer/run_qwen3_5-35b-megatron.sh examples added 8.0
examples/sft/gsm8k/run_qwen3_5_megatron.sh examples added 8.0
verl/utils/chat_template.py utils modified 7.0
verl/experimental/agent_loop/tool_parser.py agent_loop modified 6.0
verl/utils/tensordict_utils.py utils modified 6.0

关键符号

apply_chat_template extract_tool_calls _compute_position_ids chunk_tensordict load_megatron_model_to_gpu

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

Exception 捕获风险 正确性

gemini-code-assist[bot] 在 verl/utils/dataset/multiturn_sft_dataset.py 中指出捕获宽泛 Exception 可能隐藏 bug,建议捕获更具体的异常类型。

结论:未完全解决,PR 中未修改此逻辑,可能需要后续修复以提升代码健壮性。 · unresolved

use_remove_padding 参数设计 设计

wuxibin89 在 verl/workers/engine_workers.py 中询问 model.use_remove_padding 和 engine.use_remove_padding 参数的关系,ISEEKYAN 回复标记 model.use_remove_padding 为 deprecated。

结论:已解决,决定仅使用 engine.use_remove_padding,model.use_remove_padding 被标记为弃用以简化配置。 · 已解决

NestedTensor 处理问题 正确性

wuxibin89 在 verl/utils/tensordict_utils.py 中询问 unbind 失败原因,ISEEKYAN 解释是 PyTorch bug 导致 3D jagged tensors 问题。

结论:已通过文档更新和代码修复(使用 to_padded_tensor 回退)解决,增强了函数的鲁棒性。 · 已解决

风险与影响

技术风险具体包括:

  • 兼容性风险:依赖特定版本的vllm、transformers和mbridge,Issue评论中显示版本冲突(如transformers==5.2.0与vllm nightly的兼容性问题),可能导致用户环境配置复杂。
  • 性能风险:Qwen3.5使用Gated Delta Net线性注意力,不支持packed sequences(THD格式),必须设置use_remove_padding=False,可能影响训练性能,直到Megatron-LM添加支持(PR讨论中提及)。
  • 代码健壮性风险:verl/utils/dataset/multiturn_sft_dataset.py中捕获宽泛Exception可能掩盖非预期错误,增加调试难度。
  • 回归风险:修改核心函数如verl/utils/tensordict_utils.py中的chunk_tensordict可能影响其他使用NestedTensor的模块,需确保向后兼容。
  • 依赖外部项目风险:mbridge支持是关键依赖,但需从源码安装,增加部署复杂度。

影响范围:

  • 对用户:现在可以在verl中运行Qwen3.5的SFT和GRPO训练,通过提供的示例脚本快速上手,但需注意硬件要求(如128+ GPUs for 397B模型)和依赖版本管理。
  • 对系统:引入新模型架构支持,需升级transformers到>=5.0.0(CI工作流已更新),可能影响现有模型训练流程的兼容性。
  • 对团队:需维护Qwen3.5相关代码,处理后续bug和性能优化,Issue评论中显示用户反馈了多个运行问题(如vllm初始化、transformers版本冲突),增加了支持负担。
版本兼容性问题 宽泛 Exception 捕获 NestedTensor 处理复杂性

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论