Prhub

#39054 [Bug] Fix Trtllm Fp8 MoE Weight Shuffle Memory Fragamentation

原始 PR 作者 wzhao18 合并时间 2026-04-07 20:04 文件变更 1 提交数 1 评论 2 代码增减 +12 / -9

执行摘要

修复 Trtllm FP8 MoE 权重重排中的内存碎片化问题,避免 OOM。

PR #38993 导致 CI 测试 tests/quantization/test_blackwell_moe.py::test_deepseek_fp8_block_moe_flashinfer_trtllm 出现 OOM 错误。错误日志显示 CUDA 内存碎片化严重(尝试分配 2.00 GiB 但失败,尽管 GPU 有 1.68 GiB 空闲)。PR body 指出原因是“fragamented memory allocation”,并引用 PyTorch 文档建议设置 PYTORCH_ALLOC_CONF=expandable_segments:True 来避免碎片化。Issue 评论中 @johnnynunez 确认此修复解决了他在 0.6.7.post3 版本中的失败,@wzhao18 报告 quantized-moe-test-b200 测试通过。

建议精读以理解内存碎片化问题的典型解决方案。关注 _shuffle_deepseek_fp8_moe_weights 函数的设计变更:预分配张量 vs 列表堆叠,这是优化内存密集型操作的常见模式。

讨论亮点

review 讨论较少。gemini-code-assist[bot] 评论指出优化通过预分配输出张量替代列表追加和堆叠,提升了内存效率和性能,无进一步反馈。robertgshaw2-redhat 直接批准。Issue 评论中 @johnnynunez 确认修复有效,@wzhao18 报告测试通过。无争议点或未解决疑虑。

实现拆解

仅修改了 vllm/model_executor/layers/quantization/utils/flashinfer_utils.py 文件中的 _shuffle_deepseek_fp8_moe_weights 函数。关键改动:1) 预先计算输出张量的形状(M13, K13, M2, K2);2) 使用 torch.empty 预分配 w13_outw2_out 张量(dtype=torch.uint8);3) 在循环中直接赋值到预分配张量的对应位置,替代原有的列表追加和 torch.stack;4) 最后通过 .view(torch.float8_e4m3fn) 转换数据类型返回。

文件 模块 状态 重要度
vllm/model_executor/layers/quantization/utils/flashinfer_utils.py quantization modified 8.0

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

关键符号

_shuffle_deepseek_fp8_moe_weights

评论区精华

内存碎片化修复的有效性确认 正确性

Issue 评论中 @johnnynunez 和 @wzhao18 确认修复解决了 OOM 问题。

结论:修复有效,测试通过。 · 已解决

风险与影响

风险较低但需注意:1) 预分配张量可能一次性占用更多连续内存,若专家数量极大或张量超大,可能直接 OOM(但原方案因碎片化已 OOM,此风险可控);2) 修改了核心量化权重处理逻辑,需确保 convert_to_block_layout 等函数输出形状与预分配张量索引匹配,否则可能引发形状错误或数据错位;3) 仅修改 DeepSeek FP8 MoE 的权重重排,不影响其他模型或量化方案。

影响范围有限但关键:1) 用户:修复了特定测试场景(DeepSeek FP8 MoE + Trtllm)的 OOM,提升模型运行稳定性;2) 系统:减少内存碎片化,可能提升内存利用效率和性能;3) 团队:确保 CI 测试通过,避免因碎片化导致的间歇性失败。影响程度中等,主要针对使用 FP8 量化 MoE 的用户。

核心路径变更 内存管理优化

关联 Issue

未识别关联 Issue

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

完整报告

执行摘要

  • 一句话:修复Trtllm FP8 MoE权重重排中的内存碎片化问题,避免OOM。
  • 推荐动作:建议精读以理解内存碎片化问题的典型解决方案。关注 _shuffle_deepseek_fp8_moe_weights 函数的设计变更:预分配张量 vs 列表堆叠,这是优化内存密集型操作的常见模式。

功能与动机

PR #38993 导致 CI 测试 tests/quantization/test_blackwell_moe.py::test_deepseek_fp8_block_moe_flashinfer_trtllm 出现 OOM 错误。错误日志显示 CUDA 内存碎片化严重(尝试分配 2.00 GiB 但失败,尽管 GPU 有 1.68 GiB 空闲)。PR body 指出原因是“fragamented memory allocation”,并引用 PyTorch 文档建议设置 PYTORCH_ALLOC_CONF=expandable_segments:True 来避免碎片化。Issue 评论中 @johnnynunez 确认此修复解决了他在 0.6.7.post3 版本中的失败,@wzhao18 报告 quantized-moe-test-b200 测试通过。

实现拆解

仅修改了 vllm/model_executor/layers/quantization/utils/flashinfer_utils.py 文件中的 _shuffle_deepseek_fp8_moe_weights 函数。关键改动:1) 预先计算输出张量的形状(M13, K13, M2, K2);2) 使用 torch.empty 预分配 w13_outw2_out 张量(dtype=torch.uint8);3) 在循环中直接赋值到预分配张量的对应位置,替代原有的列表追加和 torch.stack;4) 最后通过 .view(torch.float8_e4m3fn) 转换数据类型返回。

关键文件:

  • vllm/model_executor/layers/quantization/utils/flashinfer_utils.py(模块 quantization): 唯一修改的文件,包含修复内存碎片化的核心函数 _shuffle_deepseek_fp8_moe_weights。

关键符号:_shuffle_deepseek_fp8_moe_weights

评论区精华

review 讨论较少。gemini-code-assist[bot] 评论指出优化通过预分配输出张量替代列表追加和堆叠,提升了内存效率和性能,无进一步反馈。robertgshaw2-redhat 直接批准。Issue 评论中 @johnnynunez 确认修复有效,@wzhao18 报告测试通过。无争议点或未解决疑虑。

  • 内存碎片化修复的有效性确认 (correctness): 修复有效,测试通过。

风险与影响

  • 风险:风险较低但需注意:1) 预分配张量可能一次性占用更多连续内存,若专家数量极大或张量超大,可能直接 OOM(但原方案因碎片化已 OOM,此风险可控);2) 修改了核心量化权重处理逻辑,需确保 convert_to_block_layout 等函数输出形状与预分配张量索引匹配,否则可能引发形状错误或数据错位;3) 仅修改 DeepSeek FP8 MoE 的权重重排,不影响其他模型或量化方案。
  • 影响:影响范围有限但关键:1) 用户:修复了特定测试场景(DeepSeek FP8 MoE + Trtllm)的 OOM,提升模型运行稳定性;2) 系统:减少内存碎片化,可能提升内存利用效率和性能;3) 团队:确保 CI 测试通过,避免因碎片化导致的间歇性失败。影响程度中等,主要针对使用 FP8 量化 MoE 的用户。
  • 风险标记:核心路径变更, 内存管理优化

关联脉络

  • PR #38993 [未知,PR body 提及]: PR body 指出本 PR 是为了修复 #38993 引入的 OOM 问题,两者直接关联。
  • PR #38251 [Quantization] Add FlashInfer CuteDSL batched experts backend for NVFP4 MoE: 同属量化模块,涉及 FlashInfer 和 MoE 权重处理,技术领域相关。
  • PR #35733 [NVFP4] Support NVFP4 dense models from modelopt and compressed-tensors on AMD Instinct MI300, MI355X and Hopper through emulation: 同属量化模块,涉及 FP8/NVFP4 支持,上下文相关。

参与讨论