
在大语言模型(LLM)部署的生产环境中,有效的监控系统是确保服务稳定性、可靠性和性能的关键。随着LLM模型规模的不断扩大和应用场景的日益复杂,传统的监控手段已难以满足需求。Prometheus作为当前最流行的开源监控系统之一,凭借其强大的时序数据收集、查询和告警能力,已成为LLM部署监控的首选工具。
本文将深入探讨Prometheus在LLM部署监控中的应用,重点关注警报设置与指标选择的最佳实践。我们将从Prometheus基础架构出发,系统介绍LLM部署中的关键监控指标、告警规则配置、可视化仪表盘设计以及与其他工具的集成方案。通过本文的学习,读者将能够构建全面、高效的LLM部署监控系统,确保模型服务的稳定运行和性能优化。
Prometheus是一个开源的监控和告警系统,专为云原生环境设计。其核心组件包括:
Prometheus的架构设计具有以下特点:
LLM部署监控面临以下特殊挑战:
在2025年的LLM部署实践中,监控系统不仅需要关注传统的系统指标,还需要深入了解模型特定的性能指标和业务指标。
一个完善的LLM部署监控系统应实现以下核心目标:
一个完整的LLM部署监控架构应包含以下层次:
监控对象 → 数据采集层 → 存储层 → 分析查询层 → 可视化/告警层具体组件包括:
这种分层架构设计使得监控系统具有良好的扩展性和可维护性。
系统级指标反映了底层基础设施的运行状态,是监控的基础层面:
对于LLM部署,GPU/TPU资源监控尤为重要:
LLM服务有其独特的性能和业务指标:
业务指标反映了LLM服务对业务的实际影响:
在选择监控指标时,应遵循以下原则:
在2025年的LLM部署实践中,推荐使用以下核心指标组合:
指标类别 | 关键指标 | 监控目的 |
|---|---|---|
GPU资源 | GPU利用率、GPU内存使用率、功耗 | 资源瓶颈检测、成本优化 |
性能 | P95延迟、吞吐量、每秒Token数 | 服务质量保障、容量规划 |
可靠性 | 错误率、可用性、恢复时间 | SLA保障、故障检测 |
效率 | 每Token计算成本、缓存命中率 | 成本优化、性能调优 |
质量 | 输出评分、幻觉率、拒绝率 | 模型健康评估、用户体验 |
Prometheus的配置文件(prometheus.yml)是整个监控系统的核心,定义了数据采集、存储和告警的行为:
# 全局配置
global:
scrape_interval: 15s # 抓取间隔
evaluation_interval: 15s # 规则评估间隔
# 告警管理配置
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
# 告警规则文件
rule_files:
- "alert_rules.yml"
# 抓取配置
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets: ['node-exporter:9100']
- job_name: 'gpu_exporter'
static_configs:
- targets: ['gpu-exporter:9400']
- job_name: 'llm_service'
metrics_path: '/metrics'
scrape_interval: 5s # LLM服务指标抓取更频繁
static_configs:
- targets: ['llm-service:8000']Node Exporter用于收集系统级指标,是监控基础设施的基础:
# prometheus.yml中的Node Exporter配置
srape_configs:
- job_name: 'node_exporter'
scrape_interval: 10s
static_configs:
- targets: ['node-exporter:9100']
relabel_configs:
- source_labels: [__address__]
target_label: instance
regex: '(.*):9100'
replacement: '${1}'Node Exporter默认提供了丰富的系统指标,包括CPU、内存、磁盘、网络等。对于LLM部署,我们特别关注以下指标:
# CPU使用率
node_cpu_seconds_total{mode!="idle"}
# 内存使用率
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes
# 磁盘使用率
node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}
# 网络流量
rate(node_network_receive_bytes_total{device!="lo"}[1m])
rate(node_network_transmit_bytes_total{device!="lo"}[1m])对于GPU监控,我们可以使用nvidia_gpu_exporter或dcgm-exporter:
# prometheus.yml中的GPU Exporter配置
srape_configs:
- job_name: 'gpu_exporter'
scrape_interval: 5s # GPU指标变化快,抓取更频繁
static_configs:
- targets: ['gpu-exporter:9400']
metrics_relabel_configs:
- source_labels: [__name__]
regex: 'nvidia_smi_.*'
action: keep关键GPU指标包括:
# GPU利用率
nvidia_smi_gpu_utilization
# GPU内存使用率
nvidia_smi_gpu_memory_used_bytes / nvidia_smi_gpu_memory_total_bytes
# GPU温度
nvidia_smi_gpu_temperature
# GPU功耗
nvidia_smi_gpu_power_usage为LLM服务暴露自定义指标是监控的关键环节。以下是使用FastAPI和Prometheus客户端库暴露指标的示例:
# requirements.txt
fastapi==0.104.1
uvicorn==0.24.0.post1
prometheus-client==0.17.1# llm_service.py
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import time
from prometheus_client import Counter, Histogram, Gauge, start_http_server
import threading
# 创建FastAPI应用
app = FastAPI()
# 定义Prometheus指标
REQUEST_COUNT = Counter(
'llm_requests_total',
'Total number of LLM requests',
['endpoint', 'model', 'status']
)
REQUEST_LATENCY = Histogram(
'llm_request_latency_seconds',
'LLM request latency in seconds',
['endpoint', 'model'],
buckets=(0.1, 0.5, 1.0, 2.0, 5.0, 10.0, 30.0, 60.0)
)
ACTIVE_REQUESTS = Gauge(
'llm_active_requests',
'Number of active LLM requests',
['endpoint', 'model']
)
TOKENS_PROCESSED = Counter(
'llm_tokens_processed_total',
'Total number of tokens processed',
['type', 'model'] # type: input/output
)
GPU_MEMORY_USAGE = Gauge(
'llm_gpu_memory_usage_bytes',
'GPU memory usage for LLM inference',
['gpu_id']
)
# 中间件:记录请求指标
@app.middleware("http")
async def prometheus_middleware(request: Request, call_next):
endpoint = request.url.path
model = request.query_params.get("model", "default")
# 增加活跃请求数
ACTIVE_REQUESTS.labels(endpoint=endpoint, model=model).inc()
# 记录请求开始时间
start_time = time.time()
try:
# 处理请求
response = await call_next(request)
status = str(response.status_code)
# 记录请求计数
REQUEST_COUNT.labels(endpoint=endpoint, model=model, status=status).inc()
return response
except Exception as e:
# 记录错误
REQUEST_COUNT.labels(endpoint=endpoint, model=model, status="error").inc()
return JSONResponse(
status_code=500,
content={"detail": str(e)}
)
finally:
# 计算延迟并记录
latency = time.time() - start_time
REQUEST_LATENCY.labels(endpoint=endpoint, model=model).observe(latency)
# 减少活跃请求数
ACTIVE_REQUESTS.labels(endpoint=endpoint, model=model).dec()
# LLM推理端点
@app.post("/api/v1/generate")
async def generate_text(request: dict):
model = request.get("model", "default")
prompt = request.get("prompt", "")
max_tokens = request.get("max_tokens", 100)
# 记录输入token数(简化计算)
input_tokens = len(prompt.split())
TOKENS_PROCESSED.labels(type="input", model=model).inc(input_tokens)
# 模拟LLM推理过程
# 实际应用中这里会调用真实的模型推理
time.sleep(0.5) # 模拟延迟
# 模拟输出
output = f"Response to your prompt: {prompt[:20]}..."
output_tokens = len(output.split())
# 记录输出token数
TOKENS_PROCESSED.labels(type="output", model=model).inc(output_tokens)
# 模拟GPU内存使用(实际应用中应从GPU监控库获取)
GPU_MEMORY_USAGE.labels(gpu_id="0").set(1024 * 1024 * 1024 * 12) # 12GB
return {
"model": model,
"output": output,
"tokens": {
"input": input_tokens,
"output": output_tokens
}
}
# 健康检查端点
@app.get("/health")
async def health_check():
return {"status": "healthy"}
# 在单独线程中启动Prometheus指标服务器
def start_metrics_server():
start_http_server(8000)
# 启动指标服务器
threading.Thread(target=start_metrics_server, daemon=True).start()
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8080)在Kubernetes环境中部署LLM服务时,Prometheus Operator提供了更便捷的配置方式:
# service-monitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: llm-service-monitor
namespace: monitoring
labels:
release: prometheus
spec:
selector:
matchLabels:
app: llm-service
namespaceSelector:
matchNames:
- default
endpoints:
- port: metrics
interval: 5s
path: /metrics
scrapeTimeout: 4s# llm-service.yaml
apiVersion: v1
kind: Service
metadata:
name: llm-service
labels:
app: llm-service
spec:
selector:
app: llm-service
ports:
- name: http
port: 8080
- name: metrics
port: 8000通过这种配置,Prometheus可以自动发现并监控Kubernetes集群中的LLM服务实例。