FlashInfer MNNVL allreduce: runtime CUDA ILLEGAL_ADDRESS (700) surfacing at signal_pads cuMemFree during multi-block long prefill — persists

该报错发生在 GLM-5.3-Flash(fp8、TP=4、超长 max_model_len)首次进行 ≥~24.6K token 的多块 chunked prefill 时,所有 TP rank 在 FlashInfer MNNVL 通信缓冲清理点( signal_pads 的 cuMemFree

快速结论:该报错发生在 GLM-5.3-Flash(fp8、TP=4、超长 max_model_len)首次进行 ≥~24.6K token 的多块 chunked prefill 时,所有 TP rank 在 FlashInfer MNNVL 通信缓冲清理点(signal_pads 的 cuMemFree)抛出 sticky CUDA ILLEGAL_ADDRESS (700);由于是异步内核导致、同步 API 处才浮现,应优先排查 FlashInfer MNNVL allreduce 通信路径,而不是 compute kernel。

适用环境:Issue 中确认参与的环境为:vLLM v0.30.0(base image nightly-7f1a5398,2026-09-24)、flashinfer 0.6.18.post1、模型 GLM-5.3-Flash(fp8 量化权重)、TP=4、NVIDIA H20、enable_flashinfer_autotune=True(--optimization-level 1 默认开启)、dcp_comm_backend=ag_rs(v0.30.0 默认);并全程使用 --disable-custom-all-reduce。CUDA_LAUNCH_BLOCKING=1 仅用于诊断,不是崩溃前提。

最快修复方案:暂无确认的一步修复方案。Issue 报告者的复现实验在“更换环境 + 合成 prompt”条件下未能复现(5 个 22.9K–68.6K token 长 prompt 全部返回 HTTP 200),因此原报告中的崩溃条件尚未被独立确认。

注意事项:复现者使用的镜像、vLLM commit(81198e97b)、flashinfer 版本(0.7.0.post1)、torch 版本(2.13.0+cu130)与报告原环境不同;且复现者使用合成重复句子,而原 Issue 未提供 prompt 文本,如果崩溃依赖 prompt 内容,则该复现不会触发。同时,复现者在默认设置下拿到的是 backend=trtllm 路径,需显式设置 VLLM_FLASHINFER_ALLREDUCE_BACKEND=mnnvl 才能进入报告所说的 MNNVL 路径;该路径下仍未复现崩溃。

问题场景

用户使用 vLLM v0.30.0 部署 GLM-5.3-Flash(fp8 量化权重),--tensor-parallel-size 4、--max-model-len 262144,配合 flashinfer 0.6.18.post1 与 dcp_comm_backend=ag_rs。在引擎完整启动后,发送单条 prompt 约 24,601 token 的 completion 请求(max_tokens 很小,如 64–1500,temperature 0),触发首次 ≥24.6K token 的多块 chunked prefill。短请求(13 token)正常返回,不触发崩溃。崩溃在 5 次独立引擎重启中 5/5 复现,且已排除 MTP speculative decoding、comm fusion、fp8 custom ops、norm+act fusion 等配置项。

报错原文

CUDA_ERROR_ILLEGAL_ADDRESS (700)
FlashInfer MNNVL allreduce: runtime CUDA ILLEGAL_ADDRESS (700) surfacing at signal_pads cuMemFree during multi-block long prefill — persists after disabling MTP / comm fusion / fp8 custom ops / norm+act fusion

num_computed_tokens=[8064]
kv_cache_usage_perc ~0.049–0.064
flashinfer/comm/mnnvl.py:836 __del__ → checkCudaErrors(cuda.cuMemFree(signal_pads_dev))

HTTP 500 EngineCore encountered an issue. See stack trace (above)
All TP0–3 workers exit with CUDA_ERROR_ILLEGAL_ADDRESS (700)

原因分析

从崩溃签名看,第一段 8064-token chunked-prefill block 正常完成(num_computed_tokens=[8064]),崩溃落在后续 block;KV cache 使用率仅约 0.049–0.064,远未饱和,因此可以排除 KV cache 容量不足。错误最终在 flashinfer/comm/mnnvl.py:836 的 __del__ 中调用 cuMemFree(signal_pads_dev) 时以 sticky-700 形式浮现,而 CUDA_LAUNCH_BLOCKING=1 未能定位到具体的出错 kernel,这说明更可能是在 FlashInfer MNNVL 通信缓冲路径(UC / signal pads)中存在越界写,导致后续同步 API 处才报告错误,而非某个 compute kernel 本身出错。报告者同时确认,即使关闭 MTP、comm fusion、fp8 custom ops 和 norm+act fusion,崩溃仍按相同签名出现,因此这些优化项可能不是根因。需要强调的是,后续复现实验未能重现该崩溃,上述判断仍是基于原报告签名的可能原因,尚未被独立确认。

环境排查

  • 确认 vLLM 版本是否为报告中的 v0.30.0(base image nightly-7f1a5398,2026-09-24)。
  • 确认 flashinfer 版本是否为 0.6.18.post1;复现者使用了 0.7.0.post1,提示较新版本可能已修复该故障,但未用原镜像验证。
  • 确认是否走的是 MNNVL 路径:检查启动日志中 FlashInfer Allreduce 初始化是否显示 backend=mnnvl;在默认 auto 下,_resolve_fi_ar_backend 对 node-local group 可能返回 trtllm,需要通过 VLLM_FLASHINFER_ALLREDUCE_BACKEND=mnnvl 强制。
  • 确认 GPU 与拓扑是否为 4×NVIDIA H20、TP=4。
  • 确认模型是否为 GLM-5.3-Flash fp8 量化权重;复现者使用的是 Hub 上的 zai-org/GLM-5.3-Flash(F8_E4M3,约 314B 参数),但无法确认与原报告内部路径是同一 revision。
  • 确认是否保留 --disable-custom-all-reduce;报告指出即使禁用 custom all-reduce,FlashInfer/symm-mem 通信仍然活跃。
  • 确认 prompt 长度是否达到约 24.6K token 并跨多个 chunked-prefill block;短请求不触发。
  • 复现时可确认 attention / MLA prefill / MoE backend 选择是否与报告一致;复现者观察到的是 FLASHINFER_MLA_SPARSE_SM90、FLASH_ATTN MLA prefill、TRITON Fp8 MoE。

解决步骤

  1. 先按原报告环境核对 vLLM、flashinfer、模型和 GPU 拓扑,确认日志中确实初始化了 FlashInfer Allreduce backend=mnnvl;如果默认是 trtllm,该路径与报告不同,需要显式设置 VLLM_FLASHINFER_ALLREDUCE_BACKEND=mnnvl 才能进入报告所说的代码路径。
  2. 用单条约 24.6K token 的 prompt 请求 fresh 引擎,确认是否在第二个 chunked-prefill block 崩溃,并记录 num_computed_tokens、kv_cache_usage_perc、各 TP rank 退出码,以对齐崩溃签名。
  3. 如果目标是规避而非定位:在复现者环境中,将 vLLM 升级到 0.31.1rc1.dev88+g81198e97b、flashinfer 升级到 0.7.0.post1、torch 2.13.0+cu130 后未再复现;可优先尝试较新的 nightly 组合验证,但需注意这并非原 Issue 已验证的修复。
  4. 如果无法升级,可优先尝试避开 MNNVL allreduce 路径,确认是否换回默认 trtllm 后端后不再触发(复现者默认即 trtllm,但该条件下未做长 prompt 压力验证,因此只能作为规避方向)。
  5. 继续保留 --disable-custom-all-reduce、关闭 MTP / comm fusion / fp8 custom ops / norm+act fusion 的配置逐一验证;原报告中这些配置均未能消除崩溃。

验证方法

在 fresh 引擎进程上发送单条 ≥24.6K token 的长 prompt,观察是否仍出现 CUDA_ERROR_ILLEGAL_ADDRESS (700)、EngineDeadError、EngineCore encountered an issue、signal_pads 以及所有 TP rank 同点退出。如果请求稳定返回 HTTP 200,且服务端日志不再出现上述签名,则说明在当前环境组合下未复现该问题;但仍需注意复现者使用的是合成 prompt,原报告的具体 prompt 内容未知,若崩溃依赖 prompt 内容,则仅靠 HTTP 200 不足以完全排除。

参考来源

vllm-project/vllm #60660

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29173

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注