执行摘要
修复 EPLB 重平衡时权重张量非连续导致 RuntimeError
修复之前的 PR(#25663) 引入的 RuntimeError:在 EPLB 专家重平衡期间,跨卡发送专家权重时,由于 transpose 后的张量非连续,导致 HCCL P2P 通信报错 "Tensors must be contiguous"。
对于 NPU 平台的开发和维护人员值得关注,特别是涉及跨卡通信的 EPLB 流程;普通用户可以忽略。
无 review 评论,PR 由 Hexq0210 直接批准。
修复之前的 PR(#25663) 引入的 RuntimeError:在 EPLB 专家重平衡期间,跨卡发送专家权重时,由于 transpose 后的张量非连续,导致 HCCL P2P 通信报错 "Tensors must be contiguous"。
对于 NPU 平台的开发和维护人员值得关注,特别是涉及跨卡通信的 EPLB 流程;普通用户可以忽略。
无 review 评论,PR 由 Hexq0210 直接批准。
moe_methods.py 的 process_weights_after_loading 方法中,处理权重的代码 weight.data = npu_format_cast(weight.data.transpose(1, 2)) 在 transpose 后未保证内存连续,而后续 EPLB 重平衡时需通过 HCCL 发送该权重,非连续张量导致通信失败。.contiguous(),即 weight.data = npu_format_cast(weight.data.transpose(1, 2).contiguous()),显式将张量转为连续内存布局。| 文件 | 模块 | 状态 | 重要度 |
|---|---|---|---|
python/sglang/srt/hardware_backend/npu/quantization/moe_methods.py |
NPU 量化 | modified | 4.49 |
python/sglang/srt/hardware_backend/npu/quantization/moe_methods.py
core-logic
核心修复文件,在权重处理流程中添加 contiguous 调用以解决跨卡通信问题。
# file: python/sglang/srt/hardware_backend/npu/quantization/moe_methods.py
# process_weights_after_loading 方法中的权重处理部分
# 原代码:weight.data = npu_format_cast(weight.data.transpose(1, 2))
# 修复后:在 transpose 后添加 .contiguous() 保证内存连续,
# 因为后续 EPLB 重平衡需要通过 HCCL 跨卡发送该权重,非连续张量会触发 RuntimeError
weight.data = npu_format_cast(weight.data.transpose(1, 2).contiguous())
当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。
风险极低。仅增加 .contiguous() 调用,不会改变张量数值,语义等价。但由于 NPU 厂商可能针对特定布局有优化,连续化可能引入微小的内存复制开销,但在 EPLB 重平衡这种低频操作中可忽略。
影响范围小:仅影响 Ascend NPU 上使用 EPLB 专家负载均衡的模型(如 MoE 模型)在触发重平衡时的正确性。修复后避免了 RuntimeError,保证重平衡正常执行。
当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。
参与讨论