HiHuo
首页
博客
手册
工具
关于
首页
博客
手册
工具
关于

AI 平台的监控告警

GPU 贵,出问题更贵。监控告警是 AI 平台的基本功。

这篇讲清楚 AI 平台要监控什么、怎么监控、怎么告警。


监控什么

GPU 指标

指标含义关注点
GPU 利用率SM 使用率过低说明有问题
显存使用已用/总量接近满要告警
显存带宽利用率内存带宽使用推理瓶颈
温度GPU 温度过高会降频
功耗实时功耗异常高/低
ECC 错误显存纠错硬件故障预警
PCIe 带宽主机通信带宽数据传输瓶颈

训练指标

指标含义关注点
训练 loss损失函数值是否在下降
学习率当前 LR调度是否正常
吞吐量samples/s 或 tokens/s训练效率
梯度范数梯度大小梯度爆炸/消失
checkpoint 时间保存耗时存储是否瓶颈

推理指标

指标含义关注点
QPS每秒请求数负载情况
延迟 P50/P99响应时间用户体验
TTFT首 token 延迟响应速度
吞吐量tokens/s服务容量
队列长度等待请求数是否过载
错误率失败请求比例服务健康

集群指标

指标含义关注点
GPU 分配率已分配/总量资源利用
节点状态Ready/NotReady集群健康
网络带宽IB/以太网利用率通信瓶颈
存储 IOPS读写速度数据加载

监控工具

DCGM(Data Center GPU Manager)

NVIDIA 官方的 GPU 管理工具。

安装:

# 安装 DCGM
sudo apt-get install datacenter-gpu-manager

# 启动服务
sudo systemctl start dcgm

# 查看 GPU 状态
dcgmi discovery -l

DCGM Exporter:

把 DCGM 指标暴露给 Prometheus:

# K8s 部署
helm repo add gpu-helm-charts https://nvidia.github.io/dcgm-exporter/helm-charts
helm install dcgm-exporter gpu-helm-charts/dcgm-exporter

暴露的指标:

DCGM_FI_DEV_GPU_UTIL          # GPU 利用率
DCGM_FI_DEV_MEM_COPY_UTIL     # 显存带宽利用率
DCGM_FI_DEV_FB_USED           # 已用显存
DCGM_FI_DEV_FB_FREE           # 空闲显存
DCGM_FI_DEV_GPU_TEMP          # 温度
DCGM_FI_DEV_POWER_USAGE       # 功耗
DCGM_FI_DEV_ECC_DBE_VOL_TOTAL # ECC 双比特错误

Prometheus + Grafana

标配的监控栈。

架构:

DCGM Exporter → Prometheus → Grafana
     ↑
  GPU 指标

Prometheus 配置:

scrape_configs:
  - job_name: 'dcgm-exporter'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_label_app]
        regex: dcgm-exporter
        action: keep

Grafana Dashboard:

NVIDIA 提供官方 Dashboard:

  • Dashboard ID: 12239(DCGM Exporter Dashboard)

导入后可以看到:

  • 每张 GPU 的利用率、显存、温度
  • 集群整体 GPU 分配情况
  • 历史趋势

nvidia-smi

最基础的 GPU 监控工具。

# 实时监控
nvidia-smi -l 1

# 只看特定指标
nvidia-smi --query-gpu=utilization.gpu,memory.used,temperature.gpu --format=csv -l 1

# 查看进程
nvidia-smi pmon

nvitop

交互式的 GPU 监控,类似 htop。

pip install nvitop
nvitop

界面更友好,支持进程管理。


告警配置

常见告警规则

GPU 利用率过低:

- alert: GPUUtilizationLow
  expr: DCGM_FI_DEV_GPU_UTIL < 10
  for: 30m
  labels:
    severity: warning
  annotations:
    summary: "GPU 利用率低于 10%"
    description: "节点 {{ $labels.node }} GPU {{ $labels.gpu }} 利用率持续 30 分钟低于 10%"

显存即将耗尽:

- alert: GPUMemoryHigh
  expr: DCGM_FI_DEV_FB_USED / DCGM_FI_DEV_FB_TOTAL > 0.9
  for: 5m
  labels:
    severity: critical
  annotations:
    summary: "GPU 显存使用超过 90%"

GPU 温度过高:

- alert: GPUTemperatureHigh
  expr: DCGM_FI_DEV_GPU_TEMP > 85
  for: 10m
  labels:
    severity: critical
  annotations:
    summary: "GPU 温度超过 85°C"

ECC 错误:

- alert: GPUECCError
  expr: increase(DCGM_FI_DEV_ECC_DBE_VOL_TOTAL[1h]) > 0
  labels:
    severity: critical
  annotations:
    summary: "GPU 出现 ECC 双比特错误"
    description: "可能是显存故障,需要检查硬件"

推理服务告警

P99 延迟过高:

- alert: InferenceLatencyHigh
  expr: histogram_quantile(0.99, rate(inference_latency_seconds_bucket[5m])) > 2
  for: 10m
  labels:
    severity: warning
  annotations:
    summary: "推理 P99 延迟超过 2 秒"

错误率上升:

- alert: InferenceErrorRateHigh
  expr: rate(inference_errors_total[5m]) / rate(inference_requests_total[5m]) > 0.01
  for: 5m
  labels:
    severity: critical
  annotations:
    summary: "推理错误率超过 1%"

队列堆积:

- alert: InferenceQueueBacklog
  expr: inference_queue_length > 100
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "推理队列积压超过 100"

训练监控

集成 Weights & Biases

import wandb

wandb.init(project="my-training")

for epoch in range(epochs):
    for batch in dataloader:
        loss = train_step(batch)

        wandb.log({
            "loss": loss,
            "learning_rate": scheduler.get_lr(),
            "gpu_memory": torch.cuda.memory_allocated(),
            "throughput": samples_per_sec,
        })

集成 TensorBoard

from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter("runs/experiment_1")

for step, batch in enumerate(dataloader):
    loss = train_step(batch)
    writer.add_scalar("loss", loss, step)
    writer.add_scalar("learning_rate", lr, step)

自定义指标暴露

用 Prometheus client 暴露训练指标:

from prometheus_client import Gauge, start_http_server

training_loss = Gauge('training_loss', 'Current training loss')
training_throughput = Gauge('training_throughput', 'Samples per second')

start_http_server(8000)

for step, batch in enumerate(dataloader):
    loss = train_step(batch)
    training_loss.set(loss)
    training_throughput.set(samples_per_sec)

vLLM 监控

vLLM 内置 Prometheus 指标:

# 启动时开启指标
python -m vllm.entrypoints.openai.api_server \
    --model llama-7b \
    --enable-metrics

关键指标:

vllm:num_requests_running     # 运行中请求数
vllm:num_requests_waiting     # 等待中请求数
vllm:gpu_cache_usage_perc     # KV Cache 使用率
vllm:avg_generation_throughput_toks_per_s  # 生成吞吐
vllm:e2e_request_latency_seconds  # 端到端延迟

日志收集

训练日志

关键日志内容:

  • 训练开始/结束时间
  • 每个 epoch/step 的 loss
  • checkpoint 保存
  • 异常和错误
import logging

logging.basicConfig(
    format='%(asctime)s - %(levelname)s - %(message)s',
    level=logging.INFO,
    handlers=[
        logging.FileHandler('training.log'),
        logging.StreamHandler()
    ]
)

logger = logging.getLogger(__name__)

logger.info(f"Epoch {epoch}, Step {step}, Loss: {loss:.4f}")

集中日志

用 ELK 或 Loki 收集日志:

# Fluent Bit 配置
[INPUT]
    Name tail
    Path /var/log/training/*.log
    Tag training

[OUTPUT]
    Name es
    Match training
    Host elasticsearch
    Index training-logs

Dashboard 设计

GPU 概览

┌─────────────────────────────────────────────────┐
│  GPU 集群概览                                    │
├─────────────────────────────────────────────────┤
│  总 GPU: 64    已分配: 56    利用率: 87.5%       │
├───────────────────┬─────────────────────────────┤
│  GPU 利用率分布    │  显存使用分布               │
│  [热力图]          │  [柱状图]                   │
├───────────────────┴─────────────────────────────┤
│  节点状态                                        │
│  node-1: 8 GPU ✓  node-2: 8 GPU ✓  ...         │
└─────────────────────────────────────────────────┘

训练任务

┌─────────────────────────────────────────────────┐
│  训练任务: llama-70b-pretrain                   │
├─────────────────────────────────────────────────┤
│  Loss 曲线         │  学习率曲线                 │
│  [折线图]          │  [折线图]                   │
├───────────────────┬─────────────────────────────┤
│  GPU 利用率        │  吞吐量                     │
│  [多线图]          │  tokens/s: 15000           │
├───────────────────┴─────────────────────────────┤
│  ETA: 3 天 5 小时   进度: 45%                    │
└─────────────────────────────────────────────────┘

推理服务

┌─────────────────────────────────────────────────┐
│  推理服务: vllm-llama-7b                        │
├─────────────────────────────────────────────────┤
│  QPS: 150         延迟 P99: 800ms               │
│  [QPS 趋势图]     [延迟分布图]                   │
├───────────────────┬─────────────────────────────┤
│  GPU 显存          │  KV Cache 使用率           │
│  45GB / 80GB      │  78%                        │
├───────────────────┴─────────────────────────────┤
│  错误率: 0.1%     队列长度: 5                   │
└─────────────────────────────────────────────────┘

小结

AI 平台监控核心:

监控内容:

  • GPU 指标:利用率、显存、温度、ECC
  • 训练指标:loss、吞吐量、梯度
  • 推理指标:延迟、QPS、错误率
  • 集群指标:分配率、节点状态

监控工具:

  • DCGM + DCGM Exporter:GPU 指标
  • Prometheus + Grafana:存储和展示
  • W&B / TensorBoard:训练可视化

告警重点:

  • GPU 利用率过低
  • 显存即将耗尽
  • 温度过高
  • ECC 错误
  • 推理延迟/错误率

下一篇讲 GPU 利用率优化。