vLLM CUDA OOM Debug Runbook | 2026-10-05

主题: LLM Inference 生产环境 CUDA OOM 排障
来源: OneUptime Blog / Anyscale Docs / vLLM Forums
时间: 2026 年
类型: 工程排障 Runbook
实例: Jay


一、核心诊断命令

1. GPU 显存基础检查

# 查看 GPU 显存使用详情
nvidia-smi -i 0 -q -d MEMORY

# 实时监控显存占用
watch -n 1 nvidia-smi

# 列出所有 GPU
nvidia-smi -L

2. OOM Killer 检查

# 内核日志中的 OOM killer 记录
dmesg | grep -i "oom\|killed"

# systemd 日志(journalctl)
journalctl -k | grep -i "oom\|killed"

# 检查具体进程是否被 kill
journalctl --since "1 hour ago" | grep -i killed

3. 显存碎片化诊断

vLLM 在长时间运行后可能出现显存碎片化——即使理论上显存充足,gpu_memory_utilization 设置过高也会触发 OOM。

# 检查 vLLM 进程实际显存占用
nvidia-smi --query-compute-apps=pid,used_memory --format=csv

# 建议:使用实际测量值设置 gpu_memory_utilization
# 不要只依赖理论值,要用 nvidia-smi 实际测量后再设置

4. 系统资源历史

# 内存使用历史
sar -r

# CPU 使用历史
sar -u

# 每秒刷新
sar -r 1

二、vLLM 显存预留问题(Anyscale 文档)

已知盲点: vLLM 无法检测系统为以下功能预留的显存: - ECC(Error-Correcting Code)内存 - 驱动/firmware 开销 - 显示输出 - MIG/vGPU 配置

这会导致 vLLM 尝试分配超过实际可用显存的内存。

测量系统预留显存

nvidia-smi -i 0 -q -d MEMORY
# Total FB memory = 总显存
# Used memory = 实际已用
# 差值 = 系统预留 + 可用

经验法则: 预留 5-10% 的总显存给系统开销,将 gpu_memory_utilization 设置为 0.9 或更低(取决于是否有 MIG/vGPU)。


三、Ray Serve / Anyscale 特定诊断

检查 Replica 状态

OOM 时,Ray Serve replicas 通常卡在 STARTING 或 UNHEALTHY 状态:

# 检查 replica 状态
ray status

# 查看 actor 日志
ray logs --actor-id=<actor_id>

网络连通性排查(Anyscale)

如果 OpenAIIngress 节点无法连接到其他节点也会导致问题:

# SSH 到对应节点
ssh <node_ip>

# 测试连通性
ping <other_node_ip>
curl -v http://<other_node>:<port>/health

四、Databricks 具体配置示例

{
  "name": "qwen-chat-endpoint",
  "config": {
    "served_entities": [{
      "entity_name": "catalog.schema.model_name",
      "entity_version": "1",
      "workload_type": "GPU_LARGE",
      "workload_size": "Large",
      "task": "llm/v1/completions",
      "environment_vars": {
        "HF_HOME": "/dbfs/huggingface",
        "MAX_JOBS": "4"
      }
    }]
  }
}

Databricks 多 GPU 加载脚本

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

def load_model(model_path):
    model = AutoModelForCausalLM.from_pretrained(
        model_path,
        device_map="auto",           # 跨 GPU 自动分配
        torch_dtype=torch.float16,   # FP16 节省显存
        trust_remote_code=True,
        low_cpu_mem_usage=True        # 降低 CPU RAM 压力
    )
    return model

五、长期运行显存碎片化处理

问题: vLLM 在数小时连续请求后,显存碎片化可能导致 OOM,即使理论显存应该充足。

解法: 1. 定时重启策略: 配置健康检查 + 自动重启(生产环境下的 workaround) 2. 降低 gpu_memory_utilization: - 80GB H100:从 0.95 降到 0.85 - 40GB A100:从 0.90 降到 0.80 3. 启用 --enforce-eager: 禁用 CUDA graph,牺牲少量性能换取更稳定的显存使用


六、根因分类速查

症状 可能根因 建议
启动即 OOM 模型太大 + gpu_memory_utilization 过高 降低利用率或换更大 GPU
运行数小时后 OOM 显存碎片化 定时重启或降低利用率
并发请求时 OOM 瞬时显存峰值 限流 + 增加 GPU
多 GPU 环境下部分 GPU OOM CUDA compute capability 不一致(vLLM #7472) 检查所有 GPU 型号一致
报错 CUDA out of memory 但 nvidia-smi 显示显存足够 系统预留显存未计入 用 nvidia-smi -q -d MEMORY 实际测量

七、可信度评估

  • 来源: OneUptime Blog(工程实践)+ Anyscale 官方文档(平台级)+ vLLM Forums(社区验证)
  • 命令级内容: 可直接在生产环境运行
  • Databricks 示例: 具体 JSON 配置,有参考价值

链接: - https://oneuptime.com/blog/post/2026-01-28-debug-llm-inference-issues/view - https://docs.anyscale.com/llm/serving/troubleshooting - https://discuss.vllm.ai/t/torch-outofmemoryerror-cuda-out-of-memory/2420

标签: vLLM, CUDA-OOM, debugging, production, runbook