在AI基础设施(AI Infra)领域,模型服务的稳定性和性能直接影响业务成果。传统的系统监控(如CPU负载、内存)已不足以反映用户体验和模型健康状态。本文将聚焦于如何借鉴Google SRE实践中的“黄金指标”(Golden Signals),并将其应用于AI模型部署,构建一套高实操性的监控体系,确保模型服务的可靠性。
Contents
什么是AI Infra的黄金指标?
黄金指标(Golden Signals)通常包括四个核心维度:延迟(Latency)、流量(Traffic)、错误(Errors)和饱和度(Saturation),简称LTES。
对于AI Infra而言,我们需要对这些指标进行特定化转换:
- 延迟 (Latency): 不仅是HTTP请求的总响应时间,更重要的是模型推理的P95/P99延迟。这是衡量用户体验的关键指标。
- 流量 (Traffic): QPS(每秒查询次数)、批处理大小(Batch Size)以及不同模型版本的调用量。
- 错误 (Errors): 包括服务崩溃(5xx)、数据格式错误(4xx)、以及AI特有的模型质量错误(例如,预测值离群、数据漂移或NaN值输出)。
- 饱和度 (Saturation): 关键资源利用率,特别是GPU利用率、VRAM使用量、以及推理队列长度。
实践:使用Prometheus Client进行指标埋点
我们将使用Python的prometheus_client库,在一个基于FastAPI的AI模型服务中进行指标埋点。
步骤一:环境准备
1 pip install fastapi uvicorn prometheus_client
步骤二:Python服务仪器化 (Instrumentation)
以下代码展示了如何定义并埋点核心的黄金指标:推理延迟、请求计数和模型错误。
我们将使用Prometheus的三种主要类型:
* Summary: 用于测量延迟(如P95, P99)。
* Counter: 用于累加请求总数和错误数。
* Gauge: 用于测量当前状态的指标(如当前的批处理大小或队列长度)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 from prometheus_client import Summary, Counter, start_http_server
from fastapi import FastAPI
import time
import uvicorn
# --- 1. 定义黄金指标(LT E) ---
# L: 延迟 - 模型推理耗时 (Summary适合延迟统计)
INFERENCE_LATENCY = Summary(
'model_inference_latency_seconds',
'Model inference time P95/P99',
['model_name']
)
# T: 流量 - 总请求计数 (Counter)
REQUEST_COUNT = Counter(
'http_requests_total',
'Total HTTP requests',
['endpoint', 'method']
)
# E: 错误 - 模型处理错误计数 (Counter)
ERROR_COUNT = Counter(
'model_errors_total',
'Total model or runtime errors',
['error_type']
)
app = FastAPI()
MODEL_NAME = "resnet_v5"
# 启动Prometheus指标服务在8000端口
start_http_server(8000)
@app.post("/predict")
async def predict_endpoint(data: dict):
# 记录流量
REQUEST_COUNT.labels(endpoint='/predict', method='POST').inc()
start_time = time.time()
try:
# --- 模拟输入数据校验 ---
if 'feature_vector' not in data or len(data['feature_vector']) < 10:
raise ValueError("Invalid input vector size")
# --- 模拟模型推理过程 ---
time.sleep(0.1 + (hash(str(data)) % 10) / 1000) # 模拟波动延迟
# --- 记录延迟 ---
inference_time = time.time() - start_time
INFERENCE_LATENCY.labels(model_name=MODEL_NAME).observe(inference_time)
if inference_time > 0.15: # 模拟极端慢请求
print(f"Warning: High latency detected: {inference_time:.3f}s")
return {"model": MODEL_NAME, "prediction": [0.9, 0.1]}
except ValueError as e:
# 记录业务错误(如输入校验失败)
ERROR_COUNT.labels(error_type='data_validation').inc()
return {"error": str(e)}, 400
except Exception as e:
# 记录运行时错误
ERROR_COUNT.labels(error_type='runtime_exception').inc()
return {"error": "Internal Server Error"}, 500
if __name__ == '__main__':
uvicorn.run(app, host="0.0.0.0", port=8080)
步骤三:监控饱和度 (S)
对于AI Infra而言,饱和度指标通常需要依赖外部工具采集:
- 系统资源(CPU/Memory/Disk I/O): 使用标准的node_exporter来采集宿主机的饱和度指标。
- GPU资源(VRAM/利用率): 必须使用专门的导出器,如nvidia-exporter(基于DCGM)或社区维护的gpu_exporter。
例如,通过Grafana查询node_exporter的指标 node_memory_MemTotal_bytes – node_memory_MemFree_bytes 可以获取内存饱和度,而DCGM_FI_DEV_GPU_UTIL则提供GPU利用率。
总结与仪表盘设计
构建黄金指标监控体系的最终目的是通过可视化工具(如Grafana)提供一个“一眼看穿”的仪表盘(Golden Dashboard)。
- 第一行(用户体验): P95/P99推理延迟曲线,以及当前QPS。
- 第二行(模型健康): 错误率(错误请求数/总请求数),以及模型质量错误计数。
- 第三行(资源健康): GPU使用率(%)和VRAM使用率(MB),以及推理队列长度(如果使用异步队列)。
通过对这些黄金指标设置警报阈值,运维团队可以在用户真正感知到问题之前,主动介入并解决AI服务中的性能瓶颈和可靠性问题。
汤不热吧