如何为大模型推理服务定义 SLA 并使用 Prometheus + Grafana 实现精细化性能监控
在 AI 推理(Inference)领域,性能监控不再仅仅是简单的 CPU/内存占用。对于大语言模型(LLM)而言,SLA(服务等级协议)的定义需要深入到 Token 级别。本文将教你如何针对 AI 推理服务的特性设定 SLA,并结合 Prometheus 和 Grafana 实现生产级的 APM 监控。
1. 定义 AI 推理的 SLA 核心指标
与传统 Web 服务不同,AI 推理的性能高度依赖于输入输出长度和 GPU 资源。你应当关注以下核心指标来构建 SLA:
- TTFT (Time to First Token): 首字延迟。对于流式输出,这直接影响用户感知的交互性,通常 SLA 要求 P95 < 200ms。
- TPOT (Time Per Output Token): 每个输出 Token 的平均耗时。衡量生成过程中的平滑度。
- P99 Latency: 99% 的请求总耗时。用于衡量长尾延迟情况。
- Throughput (Tokens/sec): 每秒处理的总 Token 数,反映系统负载能力。
- Error Rate: 排除由于用户输入违规导致的 4xx 错误后的系统级错误率。
2. 实战:为推理服务埋点 (Python + Prometheus)
我们使用 FastAPI 构建一个模拟推理服务,并使用 prometheus_client 库上报 TTFT 和总耗时。此代码展示了如何在异步流式接口中进行埋点。
import time
import asyncio
from fastapi import FastAPI, Response
from prometheus_client import Counter, Histogram, generate_latest, CONTENT_TYPE_LATEST
app = FastAPI()
# 定义 Prometheus 指标
REQUEST_COUNT = Counter('ai_inference_requests_total', 'Total inference requests', ['model_name', 'status'])
# 定义 Latency Histogram,设置合理的 Buckets 用于计算 P99
INFERENCE_LATENCY = Histogram(
'ai_inference_duration_seconds',
'Inference latency metrics',
['model_name', 'metric_type'],
buckets=(.05, .1, .25, .5, 1.0, 2.5, 5.0, 10.0)
)
@app.get("/metrics")
async def metrics():
return Response(generate_latest(), media_type=CONTENT_TYPE_LATEST)
@app.post("/v1/chat/completions")
async def chat_completions(model_name: str = "llama-3"):
start_time = time.perf_counter()
try:
# 1. 模拟模型加载/前处理延迟
await asyncio.sleep(0.05)
# 2. 模拟首字生成 (TTFT)
await asyncio.sleep(0.1)
ttft = time.perf_counter() - start_time
INFERENCE_LATENCY.labels(model_name=model_name, metric_type="ttft").observe(ttft)
# 3. 模拟后续生成过程 (TPOT 累计)
await asyncio.sleep(0.4)
total_duration = time.perf_counter() - start_time
INFERENCE_LATENCY.labels(model_name=model_name, metric_type="total").observe(total_duration)
REQUEST_COUNT.labels(model_name=model_name, status="success").inc()
return {"status": "success", "latency": total_duration}
except Exception as e:
REQUEST_COUNT.labels(model_name=model_name, status="error").inc()
raise e
3. 配置 Prometheus 抓取数据
在你的 Prometheus 配置文件 prometheus.yml 中添加抓取任务,指向推理服务的接口:
scrape_configs:
- job_name: 'ai-inference-service'
scrape_interval: 15s
static_configs:
- targets: ['localhost:8000']
4. 在 Grafana 中实现 SLA 可视化
一旦数据流入,你可以通过 PromQL 编写监控面板。以下是两个核心查询语句:
- P95 TTFT (关键 SLA 指标):
histogram_quantile(0.95, sum(rate(ai_inference_duration_seconds_bucket{metric_type="ttft"}[5m])) by (le, model_name)) - 推理成功率 (Availability SLA):
sum(rate(ai_inference_requests_total{status="success"}[5m])) / sum(rate(ai_inference_requests_total[5m])) * 100
5. 总结
传统的 APM 监控无法直接反映 LLM 服务的用户体验。通过在推理框架(如 vLLM, Triton)或自定义 API 封装层中埋入 TTFT 和 TPOT 指标,你可以精确地在 Grafana 中观察模型是否达到了 SLA 承诺。建议针对不同的模型规模设置差异化的阈值告警,以便在 GPU 算力瓶颈或显存碎片化严重时及时扩容。
汤不热吧