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 利用率优化。