2026/8/27 8:39:08

vLLM #49149 补丁:A800 上 MiniMax-M3 batch>1 崩溃排查与修复

vLLM #49149 补丁:A800 上 MiniMax-M3 batch>1 崩溃排查与修复 vLLM #49149 补丁A800 上 MiniMax-M3 batch1 崩溃排查与修复⚠️版本提示vLLMv0.26.0 已官方合并 PR #49149A800 上 batch1 崩溃问题已修复推荐直接使用官方镜像。本文主要面向因镜像策略必须停留在vllm v0.25.1的用户讲解补丁原理与手动构建步骤。文章目录vLLM #49149 补丁A800 上 MiniMax-M3 batch1 崩溃排查与修复一 现象二 排查过程2.1 排除常见嫌疑2.2 定位到上游 issue三 根因分析四 上游修复 PR #49149五 手动给 v0.25.1 打补丁六 验证七 小结mini-max-m3-mxfp8-v-llm-a800-deployment gitee仓库一 现象接上一篇在8×A800上部署 MiniMax-M3-MXFP8vLLM 实战笔记 vllm v0.25.1部署完成后我做了并发压测结果单请求完全正常并发 ≥2 服务立刻崩溃。错误信息torch.AcceleratorError: CUDA error: an illegal memory access was encountered EngineDeadError崩溃点被捕获在prepare_inputs_event.synchronize()说明是异步 CUDA 错误。更奇怪的是换--moe-backend triton仍崩加--enforce-eager仍崩移除 EAGLE3 仍崩。也就是说和 MoE 后端、CUDA Graph、推测解码都没关系。二 排查过程2.1 排除常见嫌疑怀疑点验证方式结果Marlin MoE 内核换triton后端仍崩排除CUDA Graph 竞态加enforce-eager仍崩排除EAGLE3 草稿模型去掉--speculative-config仍崩排除温度/输出长度固定 temp0、max_tokens16仍崩2.2 定位到上游 issue用错误关键词搜索找到 vLLM 上游两个相关 issue#50557MiniMax-M3-NVFP4 同类崩溃NVFP4 格式#49070NVFP4 在 Hopper 上的 Marlin FP4-MoE 崩溃#48603MiniMax-M3 Triton path misinterprets token-major top-k buffer。环境和我们完全一致8×SM80 MiniMax-M3-MXFP8 VLLM v0.25.1这才是真凶。三 根因分析MiniMax M3 的稀疏注意力需要为每层分配一个topk_indices_buffer用来存 top-k 索引。VLLM v0.25.1 里这个 buffer 被分配为token-major[T, H, K]先按 token 排再按 head最后 topk。但公共 Triton indexer 和稀疏注意力路径在切片时把它当成了head-major[H, T, K]。走到_topk_index_kernel时形状/步幅不匹配越界写显存 →CUDA illegal memory access。为什么batch1不崩因为当序列数为 1 时[T,H,K]和[H,T,K]在内存布局上恰好等价差异被隐藏了。batch1时 T1两种布局差异立刻暴露。另外MiniMax M3 官方支持平台是 Hopper/Blackwell/AMD不含 Ampere (SM80)所以 A800/A100 走的是未充分验证的回退路径bug 就在这里。四 上游修复 PR #49149修复非常简单只改两个文件vllm/models/minimax_m3/common/indexer.pyvllm/models/minimax_m3/common/sparse_attention.py核心思想在 Triton 读写边界对topk_indices_buffer做 transpose非 ROCm 路径。# indexer.pybufself.topk_indices_buffer buf_htk( bufifbuf is None or current_platform.is_rocm()elsebuf.transpose(0,1))-outbuf, outbuf_htk, -outbuf[:, nd:, :]ifbuf is not NoneelseNone, outbuf_htk[:, nd:, :]ifbuf_htk is not NoneelseNone,# sparse_attention.py- topklayer.topk_indices_buffer topk_bufferlayer.topk_indices_buffer assert topk_buffer is not None topk( topk_buffer ifcurrent_platform.is_rocm()elsetopk_buffer[:num_tokens].transpose(0,1))PR #49149 已合入 vLLMv0.26.0。五 手动给 v0.25.1 打补丁如果因内部镜像策略必须停留在VLLM v0.25.1可以手动构建 patched 镜像cdpatchmkdir-psrc/vllm/models/minimax_m3/common# 从官方 v0.25.1 镜像提取需要修改的两个文件CID$(dockercreate vllm/vllm-openai:v0.25.1)dockercp$CID:/usr/local/lib/python3.12/dist-packages/vllm/models/minimax_m3/common/indexer.py\src/vllm/models/minimax_m3/common/indexer.pydockercp$CID:/usr/local/lib/python3.12/dist-packages/vllm/models/minimax_m3/common/sparse_attention.py\src/vllm/models/minimax_m3/common/sparse_attention.pydockerrm-f$CID# 应用补丁cdsrcpatch-p1--forward../m3_topk_fix.patch# 构建新镜像cd..dockerbuild-tvllm/vllm-openai:v0.25.1-m3patch.patch/Dockerfile内容FROM vllm/vllm-openai:v0.25.1 COPY src/vllm/models/minimax_m3/common/indexer.py\/usr/local/lib/python3.12/dist-packages/vllm/models/minimax_m3/common/indexer.py COPY src/vllm/models/minimax_m3/common/sparse_attention.py\/usr/local/lib/python3.12/dist-packages/vllm/models/minimax_m3/common/sparse_attention.py六 验证打补丁后重新跑部署脚本再用bench.py压测python3 bench.py1,2,4,8,16450.7结果并发 1/2/4/8/16全部 2000 失败。长请求、工具调用、thinking 输出均正常。七 小结阶段结论现象batch1 必崩单请求正常根因topk_indices_buffertoken-major vs head-major 布局错位修复PR #49149v0.26.0 已含v0.25.1 需手动打补丁验证并发 1-16 全通过这个 bug 再次提醒我们官方未支持的硬件平台走回退路径时一定要做并发验证不能只看单请求通没通。上一篇《在 8×A800 上部署 MiniMax-M3-MXFP8vLLM 实战笔记》下一篇《MiniMax-M3 EAGLE3 推测解码压测分析》