快速结论:该问题发生在使用 FlashInfer 后端与 speculative decoding 组合时,且运行在 Ampere(如 RTX 3090)等 Pre-Hopper 架构之上。优先排查 vLLM 版本是否为已知重复 Issue #49547 的受影响版本,并建议迁移至 FlashAttention 后端或等待上游修复。
适用环境:vLLM 0.27.1,2× RTX 3090 (sm_86),TP=2,Qwen3.8-27B,外部草稿模型(external drafter),num_spec_tokens=7。
最快修复方案:暂无确认的一步修复方案。此 Issue 由于与 #49547 重复已被关闭,因此解决方向需跟踪 #49547 的进展。当前可优先尝试的权宜之计是改用 FlashAttention 后端,以恢复 FULL cudagraph 模式。
注意事项:FlashInfer 后端本身是受支持的,但该限制是硬件(SM90 以下不支持 TRTLLM_GEN decode kernel)与 vLLM 实现共同作用的结果,并非简单的配置错误。换用 FlashAttention 后端可能不支持 fp8 KV Cache,这是取舍。
问题场景
用户操作 vLLM 0.27.1 + FlashInfer 后端,在 Ampere (sm_8x) 双卡(RTX 3090)环境下运行带有外部草稿模型的 speculative decoding(如 Qwen3.8-27B)。官方警告指出 cudagraph 模式降级为 PIECEWISE,且草稿模型未启动 CUDA Graph,导致推理步骤耗时明显增加。
报错原文
WARNING [compilation.py:1458] CUDAGraphMode.FULL_AND_PIECEWISE is not supported with spec-decode for attention backend FlashInferBackend (support: AttentionCGSupport.UNIFORM_SINGLE_TOKEN_DECODE); setting cudagraph_mode=PIECEWISE
原因分析
可能原因如下:
1. FlashInfer 的 decode 后端中,supports_spec_as_decode 被硬编码为仅在使用了 TRTLLM_GEN decode kernel 时为真,而该 kernel 仅支持 SM100+(Hopper 桌面版 SM90 也只具备 XQA decode 能力)。在 sm_8x 上该参数为 False,导致 spec-decode 请求被归类为 prefill 路径,而非 decode 路径。
2. PT 2.x 及 vLLM 的 cudagraph 池仅保存了 BatchDecodeWithPagedKVCacheWrapper 实例(专门用于 spec-decode),但 prefill wrapper 从未被捕获。因此,FULL_AND_PIECEWISE 会降级为 PIECEWISE,目标模型无法启动 FULL CUDA Graph,草稿模型直接进入 eager 模式。
3. 更深层的问题可能是 FlashInfer 的 FA2 decode kernel 在硬件支持上暂时无法表达跨 n+1 个 token 的 stair-step(阶梯)mask,或者 SM90 场景事实上只是 vLLM 未完成 XQA specdec mask 接线导致的“wiring gap”,这被作者观察到,但结论并未在 Issue 中得到最终确认。
环境排查
- 确认显卡算力是否为 sm_8x(如 RTX 3080/3090/A5000 等)或更早的 GPU。
- 检查 FlashInfer 安装版本是否与 vLLM 0.27.1 匹配。
- 确认 vLLM 版本是否为 0.27.1 或更早(在 0.27.1 与 #49547 同步关闭前)。
- 排查是否在使用 fp8 KV Cache:FlashAttention 在 sm_8x 下仅支持 bf16/fp16 KV,若需 fp8 KV 则必须使用 FlashInfer,故此问题的影响会更大。
- 记录当前 CUDA Graph 捕获日志,观察 target 模型与 drafter 模型是否为 eager/piecewise。
解决步骤
- 短期内切换后端:将
VLLM_ATTENTION_BACKEND=FLASH_ATTN环境变量设置后,绕过 FlashInfer,以获得 FULL CUDA Graph 并消除推理过程中 drafter 的额外 eager 开销。 - 确认是否影响当前负载:对比 FLASH_ATTN 与 FLASHINFER 在同一组参数下的
Capturing CUDA graphs (FULL)打印输出,确认真实拖慢程度是否在可接受范围内。 - 跟踪上游修复:由于该 Issue 已关闭并指向 #49547,建议订阅 #49547 的进展,等待官方在 FlashInfer 侧实现对 sm_8x 及 pre-Hopper GPU 的 TRTLLM_GEN 替代方案(如 XQA specdec mask)。
- 检查当前 vLLM 版本:在升级到新版本后重新运行一次 benchmark,确认是否仍出现该 Warning。
验证方法
1. 重新运行服务,观察启动日志中是否还包含 setting cudagraph_mode=PIECEWISE 警告;若替换为 FLASH_ATTN 后不再出现,则说明后端切换成功。
2. 对比两种后端的 Capturing CUDA graphs (FULL) 计数,FlashAttention 后端应显示 FULL 已启动,而 FlashInfer 后端则没有 FULL 捕获记录。
3. 通过 profiling 或控制台日志确认草稿模型不再运行在 eager 模式(例如不再打印 eager 相关时间占比)。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。

![[BUG] Gemini native provider never appends trailing user turn -> 400 'Requests ending with a model turn are not supported'](https://www.chat-gpts.plus/wp-content/uploads/2026/09/6984-b83b3d42-768x403.jpg)
