去年线上推理服务出过一次事故:GPU显存缓慢泄漏导致服务在运行三天后OOM崩溃。如果当时有完善的监控,显存泄漏趋势早就能被发现。那次事故之后,我们把推理服务的监控体系补全了;

AI推理服务的监控和传统Web服务不同,需要关注一些特有的维度;

监控维度

推理性能方面,首Token延迟(TTFT)直接影响用户体验——用户感受到的"响应速度"就是TTFT;生成速度(tokens/s)决定了"阅读速度";端到端延迟是总耗时;

GPU状态方面,GPU计算利用率反映GPU忙不忙;显存使用率接近100%就该预警了;KV Cache使用率是vLLM特有的指标,比显存总量更能反映当前负载;

队列状态方面,等待处理的请求数反映服务是否过载。队列持续增长说明服务能力不够了;

Prometheus配置

scrape_configs:
  - job_name: "vllm-inference"
    scrape_interval: 15s
    static_configs:
      - targets: ["vllm-server:8000"]
    metrics_path: /metrics

vLLM暴露的核心指标:vllm:request_duration_seconds(请求总耗时)、vllm:time_to_first_token_seconds(首Token延迟)、vllm:num_requests_running(运行中请求数)、vllm:gpu_cache_usage_perc(KV Cache使用率)、vllm:avg_generation_throughput_toks_per_s(生成吞吐量)。

告警规则

groups:
- name: vllm-alerts
  rules:
  - alert: HighLatency
    expr: histogram_quantile(0.95, vllm:request_duration_seconds_bucket) > 30
    for: 5m
    labels: {severity: warning}
    annotations:
      summary: "P95推理延迟超过30秒"

  - alert: GPUOOM
    expr: vllm:gpu_cache_usage_perc > 0.95
    for: 2m
    labels: {severity: critical}
    annotations:
      summary: "KV Cache使用率超95%,即将OOM"

  - alert: QueueBacklog
    expr: vllm:num_requests_waiting > 50
    for: 5m
    labels: {severity: warning}
    annotations:
      summary: "请求队列积压超过50"

  - alert: HighErrorRate
    expr: rate(vllm:request_errors_total[5m]) / rate(vllm:request_total[5m]) > 0.05
    for: 5m
    labels: {severity: critical}
    annotations:
      summary: "请求错误率超过5%"

Grafana大盘

建议的面板布局:顶部一行放核心指标卡片(QPS、P50延迟、P95延迟、错误率);中间一行放GPU相关图表(GPU利用率时序图、显存使用率时序图、KV Cache使用率时序图);底部放请求详情(按模型维度的请求分布、延迟分布直方图)。

日志采集

用Loki采集推理服务日志。vLLM的日志包含了每次请求的详细信息(模型名、输入长度、输出长度、处理时间),对于排查问题和分析使用模式非常有价值。

自定义指标

除了内置指标,业务层面的指标也很重要。在推理服务中用prometheus_client库添加:

from prometheus_client import Counter, Histogram

token_counter = Counter("llm_tokens_total", "生成的总Token数", ["model", "type"])
latency = Histogram("llm_custom_latency", "自定义延迟追踪", ["model"])

选型建议

模型选型没有标准答案,取决于具体场景。几个关键维度:

  • 效果:在你的任务上的准确率/质量,建议用真实数据跑benchmark;
  • 速度:推理延迟和吞吐量,直接影响用户体验和成本;
  • 成本:API调用费用或自部署的硬件成本;
  • 生态:社区支持、工具链、文档质量;

实际操作中,建议先用API快速验证效果,再决定是否自部署;

量化和压缩

模型太大装不进显存?几个压缩方案:

  • GPTQ:训练后量化,4bit量化后模型大小减少75%,效果损失很小;
  • AWQ:激活感知量化,对重要通道保留高精度,效果比GPTQ略好;
  • GGUF:llama.cpp的量化格式,CPU推理也能用;
  • 蒸馏:用大模型的输出训练小模型,效果接近但参数量小一个数量级;

写在最后

没有监控的服务就是在裸奔。出事故之后再补监控,代价远大于提前建设。Prometheus加Grafana的标准方案已经足够成熟,照着这篇文章搭起来就行,别等出了事故再补课。