Prhub

#1799 fix qwen3.5 397B converting error when enable expert parallel

THUDM/slime · 作者 xutianming · 合并时间 2026-04-03 11:49

分析状态 已生成
文件变更 1提交数 1 · 评论 0
代码增减 +15 / -3
bugfix configuration multimodal

执行摘要

修复 Qwen3.5 397B 模型在启用专家并行时权重转换错误。

根据PR描述,当使用--expert-model-parallel-size 8参数时,512个专家被分配到8个EP rank,每个rank处理64个专家。但转换函数_weight_to_mcore_format在处理融合专家权重(如linear_fc1.weight0weight63)时,使用mcore_weights_name.split("weight")[-1]提取的是本地专家ID(0-63),而HF的融合张量gate_up_proj形状为[512, 2048, 4096],需要全局专家ID来索引。这导致EP rank 1的参数错误地从HF张量的索引0-63提取,而非正确的64-127,造成权重转换错误。

该PR值得精读,特别是对于处理大模型专家并行权重的开发者。关注点:1. 如何从权重名称中提取本地专家ID;2. 如何结合EP上下文计算全局ID;3. 确保HF张量形状与EP配置匹配的设计决策。建议补充测试用例以验证修复。

讨论亮点

由于review评论为空,没有讨论记录。从代码变更看,这是一个直接的bug修复,没有争议或设计权衡。

实现拆解

修改了slime_plugins/mbridge/qwen3_5.py文件中的_weight_to_mcore_format函数。关键改动点:1. 将变量名从expert_id重命名为local_expert_id以明确其含义;2. 引入专家并行上下文,通过mpu.get_expert_model_parallel_world_size()mpu.get_expert_model_parallel_rank()获取EP大小和当前rank;3. 计算全局专家ID:如果EP大小大于1,则根据EP rank和本地专家数量计算全局ID,否则直接使用本地ID;4. 使用全局专家ID索引HF张量,确保权重正确提取。

文件 模块 状态 重要度
slime_plugins/mbridge/qwen3_5.py plugins/mbridge modified 9.0

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

关键符号

_weight_to_mcore_format

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险较低:1. 回归风险:修改仅影响启用专家并行时的权重转换逻辑,对非专家并行场景无影响;但需确保EP大小和rank计算正确,否则可能导致权重映射错误。2. 性能风险:引入mpu模块调用可能增加轻微开销,但仅在转换时执行一次,影响可忽略。3. 兼容性风险:依赖于Megatron Core的mpu模块,需确保该模块在运行环境中可用且版本兼容。4. 测试覆盖:缺少相关测试用例验证修复效果,需手动测试专家并行场景。

影响范围:1. 对用户:修复了Qwen3.5 397B模型在专家并行下的权重转换错误,确保模型能正确加载和运行,提升大模型训练稳定性。2. 对系统:仅影响权重转换工具,不涉及运行时逻辑,不影响已训练模型。3. 对团队:简化了专家并行配置下的调试工作,避免了因权重错误导致的训练失败。影响程度:中等,因为专家并行常用于大规模模型训练,修复可避免潜在训练中断。

专家并行配置敏感 缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

执行摘要

  • 一句话:修复Qwen3.5 397B模型在启用专家并行时权重转换错误。
  • 推荐动作:该PR值得精读,特别是对于处理大模型专家并行权重的开发者。关注点:1. 如何从权重名称中提取本地专家ID;2. 如何结合EP上下文计算全局ID;3. 确保HF张量形状与EP配置匹配的设计决策。建议补充测试用例以验证修复。

功能与动机

根据PR描述,当使用--expert-model-parallel-size 8参数时,512个专家被分配到8个EP rank,每个rank处理64个专家。但转换函数_weight_to_mcore_format在处理融合专家权重(如linear_fc1.weight0weight63)时,使用mcore_weights_name.split("weight")[-1]提取的是本地专家ID(0-63),而HF的融合张量gate_up_proj形状为[512, 2048, 4096],需要全局专家ID来索引。这导致EP rank 1的参数错误地从HF张量的索引0-63提取,而非正确的64-127,造成权重转换错误。

实现拆解

修改了slime_plugins/mbridge/qwen3_5.py文件中的_weight_to_mcore_format函数。关键改动点:1. 将变量名从expert_id重命名为local_expert_id以明确其含义;2. 引入专家并行上下文,通过mpu.get_expert_model_parallel_world_size()mpu.get_expert_model_parallel_rank()获取EP大小和当前rank;3. 计算全局专家ID:如果EP大小大于1,则根据EP rank和本地专家数量计算全局ID,否则直接使用本地ID;4. 使用全局专家ID索引HF张量,确保权重正确提取。

关键文件:

  • slime_plugins/mbridge/qwen3_5.py(模块 plugins/mbridge): 这是唯一修改的文件,包含权重转换的核心逻辑修复,直接影响Qwen3.5模型在专家并行下的正确性。

关键符号:_weight_to_mcore_format

评论区精华

由于review评论为空,没有讨论记录。从代码变更看,这是一个直接的bug修复,没有争议或设计权衡。

  • 暂无高价值评论线程

风险与影响

  • 风险:风险较低:1. 回归风险:修改仅影响启用专家并行时的权重转换逻辑,对非专家并行场景无影响;但需确保EP大小和rank计算正确,否则可能导致权重映射错误。2. 性能风险:引入mpu模块调用可能增加轻微开销,但仅在转换时执行一次,影响可忽略。3. 兼容性风险:依赖于Megatron Core的mpu模块,需确保该模块在运行环境中可用且版本兼容。4. 测试覆盖:缺少相关测试用例验证修复效果,需手动测试专家并行场景。
  • 影响:影响范围:1. 对用户:修复了Qwen3.5 397B模型在专家并行下的权重转换错误,确保模型能正确加载和运行,提升大模型训练稳定性。2. 对系统:仅影响权重转换工具,不涉及运行时逻辑,不影响已训练模型。3. 对团队:简化了专家并行配置下的调试工作,避免了因权重错误导致的训练失败。影响程度:中等,因为专家并行常用于大规模模型训练,修复可避免潜在训练中断。
  • 风险标记:专家并行配置敏感, 缺少测试覆盖

关联脉络

  • PR #1769 Support FP8 conversion for Qwen3.5: 同样涉及Qwen3.5模型的权重转换工具(tools/convert_hf_to_fp8.py),可能共享类似转换逻辑,但本PR专注于专家并行场景。
  • PR #1756 [Fix]Fix some bugs/clean up: 涉及Megatron工具链的bug修复,包括检查点加载等,与本PR同属底层工具链维护。

参与讨论