vLLM Omni 24G 显卡只占用约 20G 显存 完整原因 + 调参方案

11次阅读
没有评论

一、核心根本原因(默认配置必然剩 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% 配额:

  1. 模型权重:固定占用一部分显存(比如 7B 量化后 12~16G)
  2. KV Cache 全局内存池:启动时一次性预分配剩余额度,用于多并发上下文存储
  3. 视觉模块:图片编码、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 缓存池没拉满:

  1. 调高--max-model-len 拉长单条对话最大上下文
  2. 调高--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 底层张量申请无容错,生产环境必崩

四、极简总结

  1. 24G 只用到 20G = 默认 90% 配额 + 模型 + 视觉模块没用尽配额,完全正常不是异常
  2. 想多用显存:--gpu-memory-utilization 0.92~0.95
  3. 显存不够爆 OOM:降低该数值、缩短 max-model-len、减小并发、使用 4bit/8bit 量化加载模型
正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码