快速结论:这个 CUDA out of memory 出现在 vLLM 处理 Qwen3.8-Flash-Next 的 PLE 短卷积(short-conv)批量 prefill 时,混合长度请求被按 batch-max query 长度对齐填充,导致激活显存瞬时膨胀。优先排查是否命中该 padding 路径,并降低单步批处理 token 数。
适用环境:Issue 已确认的环境为 vLLM 0.1.dev20073+g8e685d198(vllm/vllm-openai:qwen38-flash-next 镜像)、模型 Qwen/Qwen3.8-Flash-Next-FP8、4×H200 140GB、tensor-parallel-size 4 + expert-parallel 4、MTP 推测解码 num_speculative_tokens=5、chunked prefill 默认开启。AMD 侧同类问题出现在 docker.io/vllm/vllm-openai-rocm:v0.30.0、ROCm 7.2.3、PyTorch 2.12.0、4×MI300X 192GB、TP4 环境。
最快修复方案:NVIDIA 路径已由 #54517 修复,使用该修复之后的 nightly 构建即可,PLE prefill 不再构建 (num_prefills, max_prefill_query_len, hc_hidden_size) 的 slot 矩阵。若暂时无法升级,或在 AMD ROCm 路径上(该路径仍存在此问题),Issue 中验证可用的缓解措施是把 –max-num-batched-tokens 从 32768 降到 8192。
注意事项:–max-num-batched-tokens 8192 只是降低 padding 上界、缓解触发概率,并未消除 padding 本身;ROCm scratch 相关环境变量(HSA_NO_SCRATCH_RECLAIM 等)和降低 –gpu-memory-utilization 在 Issue 中均被证实无效,只能改变报错形态或推迟崩溃时间。#54517 仅替换了 NVIDIA 路径,AMD 路径的根治修复截至该 Issue 讨论时尚未包含。
问题场景
在 vLLM 上运行 Qwen3.8-Flash-Next(hidden_size=2560、hc_count=4)进行批量 prefill,开启 chunked prefill,并在混合长度生产流量下触发:一个约 153,853 token 的新 prompt 进入等待队列后被调度器分配 31,344 token 的 chunk,同时另有 7 个多轮会话以很小的 prefill chunk(4–1,352 token)并发追加上下文。所有 10 个请求被打包进同一步,PLE 短卷积路径把整批请求填充到 batch-max query 长度,导致激活显存瞬时超出预算并崩溃。注意此时 KV cache 使用率仅约 13%,说明并非 KV cache 占满显存。
报错原文
(Worker_TP1_EP1) torch.OutOfMemoryError: CUDA out of memory. Tried to allocate 4.78 GiB.
GPU 1 has a total capacity of 139.80 GiB of which 3.91 GiB is free.
...
File ".../vllm/models/qwen3_8_flash_next/nvidia/ple_layer.py", line 842
return torch._C._nn.silu(input)
AMD ROCm 路径上同一根因还表现为以下三种错误之一:
1. HSA_STATUS_ERROR_OUT_OF_RESOURCES ... Available Free mem : 0 MB
2. torch.OutOfMemoryError: ... Tried to allocate 3.31 GiB ... of which 0 bytes is free
3. RuntimeError: Expected canUse32BitIndexMath(input) && canUse32BitIndexMath(output) to be true
原因分析
核心原因是 PLE dilated short-conv 的批量 prefill 路径按 batch-max query 长度做 dense padding。在 vllm/models/qwen3_8_flash_next/nvidia/ple_layer.py 中:max_len = metadata.max_prefill_query_len(批量最大值),packed_tokens = x_p.new_zeros((num_prefills, max_len, hidden_size)) 按请求逐行 dense 打包,随后在 silu 与 transpose(1,2).contiguous() 处分配大张量。激活显存因此按 num_prefills × batch_max_len 扩张,与实际调度的 token 数无关。
该 checkpoint 的 hidden_size 取 hc_hidden_size = config.hidden_size × config.hc_count = 2560 × 4 = 10,240,且 key_proj/value_proj 是 ReplicatedLinear、未做 TP 切分,因此每张卡都独立分配全宽 buffer。崩溃步骤中 8 × 31,344 × 10,240 × bf16 ≈ 4.78 GiB 每个中间张量,短卷积路径上同时有约 2–3 个中间张量存活(packed_tokens → transpose(1,2).contiguous() → history cat → conv1d → silu),瞬时约 12 GiB,而当时可用约 11.8 GiB,于是 OOM。
加剧因素有两点:一是 padding 比例无上界,单个长 chunk 会抬高所有同批短 chunk 的行宽(崩溃步骤中 1,424 个真实 token 被填充到 31,344,单行约 22×);二是调度器的 long_prefill_token_threshold 本可限制单请求 chunk 长度、从而约束 max_len,但默认关闭且与包装逻辑的交互未文档化。
为什么常规基准测不出:等长 prompt(如 32K×32、100K×8)下 padding 浪费接近 0,激活峰值与 profiling 结果一致;只有混合长度批次中“一个长 chunk + 若干短 chunk”才会放大。AMD 路径上同样的 padding 还会让张量元素数超过 2^31,触发 F.conv1d 的 int32 索引检查失败,即上述第 3 类错误。
环境排查
- 确认 vLLM 版本:NVIDIA 路径需确认是否包含 #54517 之后的修复(Issue 建议 2026-08-31 之后的 nightly);AMD 路径需注意 #54517 未覆盖 ROCm。
- 确认模型与配置:Qwen3.8-Flash-Next(hidden_size=2560、hc_count=4 → hc_hidden_size=10,240)。
- 确认引擎参数:–max-num-batched-tokens、–max-num-seqs、chunked prefill 是否开启、是否启用 MTP 推测解码及其 num_speculative_tokens。
- 确认硬件与并行:GPU 型号与显存、tensor-parallel-size、expert-parallel size;AMD 侧还需确认是否使用 docker.io/vllm/vllm-openai-rocm:v0.30.0 这类通用 ROCm 镜像。
- AMD 侧确认环境变量:VLLM_ROCM_USE_AITER、VLLM_ROCM_USE_AITER_MOE;并观察服务器进程显存是否超出 vLLM gpu_memory_utilization 预算(Issue 中观测到超出 11–27 GiB)。
- 确认流量特征:是否同时存在长 prompt 到达与多个短 chunk 多轮续写,即典型的混合长度 agentic 负载。
解决步骤
- 先在调度日志中确认崩溃步骤是否满足“混合长度 + 单步 batch-max 远大于多数请求长度”的形状。Issue 给出的样例:num_scheduled_tokens 中含 31,344 与 4、8、9、10 等小值,total_num_scheduled_tokens = 32767,kv_cache_usage=0.1319。
- 对照源码确认是否命中 padding 路径:检查 ple_layer.py 中 max_len = metadata.max_prefill_query_len、packed_tokens = x_p.new_zeros((num_prefills, max_len, hidden_size)) 以及 silu/transpose 分配点。
- NVIDIA 路径:升级到包含 #54517 的版本。修复后 _short_conv_dilated_dispatch 直接把扁平 [num_tokens, C] 激活交给融合 Triton 内核(ops/ple.py,mode=”prefill”),按 query_start_loc 逐请求遍历,不再有 packed_tokens、transpose(1,2).contiguous() 拷贝与 history cat,激活峰值重新与已调度 token 数线性相关。
- 若暂时无法升级,或在 AMD ROCm 路径上:把 –max-num-batched-tokens 从 32768 降到 8192,以压低 padding 上界。Issue 的 AMD 测试中,使用 8192 的两个副本分别稳定运行约 3 小时和 2.3 小时无引擎崩溃,并完成了 48 次真实 agentic 编码试验,完成率(每 GPU 小时完成试验数 5.0 和 5.7)相比 32768 的 4.8 未见回退。
- 不要依赖以下手段:ROCm scratch 相关设置(HSA_NO_SCRATCH_RECLAIM=1、HSA_ENABLE_SCRATCH_ASYNC_RECLAIM=0、HSA_SCRATCH_SINGLE_LIMIT_ASYNC=512MiB)与降低 –gpu-memory-utilization 到 0.85,在 Issue 中只改变报错形态或把崩溃从数分钟推迟到约 1.7 小时,未真正解决问题。
验证方法
在包含 #54517 的构建上,用能复现 Issue 调度形状的混合长度负载(一个长 chunk 与多个短 prefill 同批)重跑崩溃步骤,若不再出现 OOM,且激活峰值随已调度 token 数线性增长而非按 num_prefills × batch_max 扩张,即可确认修复生效。Issue 中建议:如报告者能在 2026-08-31 之后的 nightly 上复现原调度形状而不出现 OOM,该 Issue 即可关闭。使用 8192 缓解方案时,则以长时间负载持续运行无引擎死亡(而非仅延迟崩溃)作为验证标准。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。

![[Bug]: HunYuan Dense V1 fails CUDA graph capture on v0.29 — HF dynamic RoPE does a host-side sync during capture](https://www.chat-gpts.plus/wp-content/uploads/2026/10/57890-0b89f014-768x403.jpg)
