一、核心根本原因(默认配置必然剩 2~3G)
1. 默认显存利用率上限 gpu_memory_utilization=0.9
vLLM(含 Omni 多模态分支)出厂默认只占用单卡 90% 物理显存,剩下 10% 强制留给 CUDA 驱动、内核、临时张量、显存碎片、CUDA Graph 编译开销,防止推理中途突发 OOM 爆显存vLLM。
- 24GB × 0.9 = 21.6GB 理论最大可用额度
- 你看到 20G 左右,是模型权重 + KV 缓存预分配池没把这 21.6G 额度占满,属于正常现象。
2. Omni 多模态额外显存开销拆分
vLLM Omni 要同时加载:文本大模型 + 视觉编码器 + 图像特征缓存,三部分一起计入 90% 配额:
- 模型权重:固定占用一部分显存(比如 7B 量化后 12~16G)
- KV Cache 全局内存池:启动时一次性预分配剩余额度,用于多并发上下文存储
- 视觉模块:图片编码、patch 缓存、跨模态映射占用显存 如果权重本身就偏大,留给 KV 缓存的池子就会缩水,整体 nvidia-smi 显示占用就会卡在 20G 出头。
3. 其他隐性占存点
max_model_len上下文长度越大,预分配 KV 缓存越多;设得短就会少占显存max_num_seqs最大并发数限制了同时处理对话条数,并发越低显存占用越低- CUDA Graph 默认开启,启动编译会临时占用一小段显存;加
--enforce-eager关闭可省少量显存
二、想拉高显存占用、榨满 24G(安全推荐方案)
方案 1:小幅拉高利用率(最稳妥,推荐)
启动命令添加参数,上限开到 0.92~0.95,不要直接 1.0 极易 OOM:
bash
运行
--gpu-memory-utilization 0.92
- 24G × 0.92 = 22.08G,余量仅 1.92G,吞吐量更高、可接更多并发
- 不建议≥0.96,多模态图片推理容易瞬时显存溢出报错
方案 2:排查是否有其他进程占用 GPU
先清空显卡其他占用,vLLM 才能拿到完整 90% 额度:
bash
运行
# 查看显卡占用
nvidia-smi
# 杀掉其他占用进程
fuser -v /dev/nvidia*
方案 3:调整上下文与并发,吃满分配额度
如果额度还有富余,说明 KV 缓存池没拉满:
- 调高
--max-model-len拉长单条对话最大上下文 - 调高
--max-num-seqs提升并发上限 示例完整启动参数:
bash
运行
python -m vllm.entrypoints.openai.api_server \
--model 你的Omni多模态模型 \
--gpu-memory-utilization 0.92 \
--max-model-len 8192 \
--max-num-seqs 64
三、不建议直接设 1.0 的原因
--gpu-memory-utilization 1.0 会拿走全部 24G,无任何预留缓冲:
- 图片批量编码、长文本生成、批量请求时,临时显存波动直接触发 CUDA out of memory
- 显存碎片、PyTorch 底层张量申请无容错,生产环境必崩
四、极简总结
- 24G 只用到 20G = 默认 90% 配额 + 模型 + 视觉模块没用尽配额,完全正常不是异常
- 想多用显存:
--gpu-memory-utilization 0.92~0.95 - 显存不够爆 OOM:降低该数值、缩短 max-model-len、减小并发、使用 4bit/8bit 量化加载模型
正文完
可以使用微信扫码关注公众号(ID:xzluomor)