Prhub

#32022 fix(qwen3.5): restrict MoE weights to local PP layers

原始 PR 作者 ICENacl 合并时间 2026-07-30 03:01 文件变更 1 提交数 2 评论 7 代码增减 +3 / -3

执行摘要

限制 Qwen3.5 MoE 权重获取到本地 PP 层

Qwen3.5 在多 PP rank 场景下,load_fused_expert_weights 中的 _routed_experts_weights_of_layer 使用 enumerate(self.model.layers) 遍历所有层,导致其他 PP 阶段的 PPMissingLayer 占位符被访问(这些占位符没有 mlp 属性),从而引发错误。PR body 明确说明需要“avoid accessing mlp on PPMissingLayer placeholders from other pipeline stages”。

值得合并的快速修复。对于维护 PP 或 MoE 模型的工程师,可关注此模式下其他模型是否也存在类似问题。

讨论亮点

无 review 讨论:该 PR 仅有一位 reviewer(AgainstEntropy)直接批准,无评论。作者在 issue 评论中解释了 CI 失败均与 PR 无关。

实现拆解

  1. 修改 _routed_experts_weights_of_layer Lambda 表达式(文件:python/sglang/srt/models/qwen3_5.py):
    • for layer_id, layer in enumerate(self.model.layers) 替换为 for layer_id in range(self.model.start_layer, self.model.end_layer),限制遍历范围仅为当前 PP rank 负责的层。
    • layer.mlp.get_moe_weights() 替换为 self.model.layers[layer_id].mlp.get_moe_weights(),直接通过 layer_id 索引。
  2. 无其他文件改动:仅修改了 1 个文件中的 3 行代码(+3/-3),由于该逻辑与 Qwen3.5 前向路径中已使用的局部层范围一致,因此无需额外测试。
文件 模块 状态 重要度
python/sglang/srt/models/qwen3_5.py 模型层 modified 5.94

关键符号

load_fused_expert_weights

关键源码片段

python/sglang/srt/models/qwen3_5.py data-contract

唯一变更文件,修复了 MoE 权重收集的 PP 层范围问题。

# python/sglang/srt/models/qwen3_5.py (head)# 之前:遍历所有层,可能访问其他 PP rank 的 PPMissingLayer
# 现在:只遍历当前 rank 的局部层 (start_layer 到 end_layer)
self._routed_experts_weights_of_layer = LazyValue(
    lambda: {
        layer_id: self.model.layers[layer_id].mlp.get_moe_weights()
        for layer_id in range(self.model.start_layer, self.model.end_layer)
        if isinstance(self.model.layers[layer_id].mlp, Qwen2MoeSparseMoeBlock)
    }
)

评论区精华

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

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

风险与影响

风险极低:

  • 改动范围极小(3行),且已经过 py_compile 语法检查和 CI 测试(失败均为环境问题)。
  • 限制层范围到 start_layerend_layer 是 PP 场景下的标准做法,与其他 PP 模块一致。
  • 不会影响单 rank 或 TP-only 场景,因为单 rank 时 start_layer=0end_layer=num_hidden_layers

影响范围有限:

  • 仅修复 Qwen3.5 模型在 PP 部署(如 PP2+TP4)时加载权重的正确性。
  • 对单节点或仅 TP 的用户无影响。
  • 显著提升大规模部署场景下 Qwen3.5 的稳定性,避免因跨 PP 访问 PPMissingLayer 导致的 crash。

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论