# PR #1799 完整报告

- 仓库：`THUDM/slime`
- 标题：fix qwen3.5 397B converting error when enable expert parallel
- 合并时间：2026-04-03 11:49
- 原文链接：http://prhub.com.cn/THUDM/slime/pull/1799

---

# 执行摘要

- 一句话：修复 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.weight0` 到 `weight63`）时，使用 `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 同属底层工具链维护。