RuntimeError: CUDA out of memory warming up sampler with 64 dummy requests——vLLM V1 引擎 OOM 排障指南
RuntimeError: CUDA out of memory warming up sampler with 64 dummy requests——vLLM V1 引擎 OOM 排障指南
如果你最近把 vLLM 从 0.6.x 升到了 0.7+,然后模型突然跑不起来了——这篇文章就是写给你的。
一、事故现场:同样的模型,同样的参数,V1 就是 OOM
一位开发者在 GitHub 上提交了这样一个 Issue(#12529):
硬件:4× RTX 3070 = 32GB 总显存
模型:Qwen/Qwen2.5-Coder-32B-Instruct-GPTQ-Int4
vLLM 0.6.x(V0 引擎):max-model-len=12K,正常运行
vLLM 0.7.0 +VLLM_USE_V1=1:max-model-len只能压到 3K,超过就:
torch.cuda.OutOfMemoryError: CUDA out of memory.同一个模型,同一块卡,同样的参数,V1 引擎让可用上下文长度从 12K 暴跌到 3K。
这不是个例。vLLM 从 0.7.0 开始正式引入 V1 引擎(VLLM_USE_V1=1),并在后续版本中逐步将其设为默认。大量用户升级后遭遇了同样的 CUDA OOM。
二、为什么 V1 引擎比 V0 吃更多内存?
V1 引擎是 vLLM 的全新调度架构,核心变化:
| 组件 | V0 引擎 | V1 引擎 |
|---|---|---|
| 调度器 | 基于 BlockTable 的传统调度 | 全新的统一调度器(Scheduler V2) |
| CUDA Graph 捕获 | 按 batch size 分档捕获 | 更激进的预捕获策略 |
| KV Cache 管理 | 相对保守 | 为高吞吐优化,预留更多 block |
| 内存分配 | 渐进式 | 启动时预分配更激进 |
核心矛盾:V1 引擎在启动阶段的 warmup 过程中会预分配大量 GPU 内存用于 CUDA Graph 捕获和 sampler 预热,这部分内存开销在 V0 引擎中不存在。
具体表现有三类典型崩溃场景:
三、4 种 V1 引擎典型 CUDA OOM + 逐一修复
场景 1:Warmup 阶段 OOM(最常见)
报错特征:
RuntimeError: CUDA out of memory occurred when warming up sampler with 64 dummy requests. Please try lowering `max_num_seqs` or `gpu_memory_utilization` when initializing the engine.根因:V1 引擎在启动时会用max_num_seqs个虚拟请求跑一轮 sampler warmup,用于 CUDA Graph 捕获。这个过程需要临时占用大量显存。
修复方案(按优先级):
<