DeepSeek-R1-Distill-Qwen-1.5B模型监控:Prometheus+Grafana实战

部署完DeepSeek-R1-Distill-Qwen-1.5B模型服务后,很多朋友可能会遇到这样的问题:服务跑得好好的,突然就变慢了,或者干脆不响应了。你只能凭感觉去猜,是显存不够了?还是请求太多了?又或者是GPU温度太高了?这种“盲人摸象”的状态,对于生产环境来说简直是灾难。

今天我就来分享一套完整的监控方案,用Prometheus和Grafana给你的模型服务装上“眼睛”和“耳朵”。这套方案不仅能让你实时看到服务的各项指标,还能在问题发生前发出预警,让你从被动救火变成主动预防。

1. 为什么模型服务需要监控?

你可能觉得,模型服务部署好了能跑就行,监控是不是有点小题大做?其实不然。模型服务跟传统的Web服务有很大不同,它有自己独特的“脾气”。

首先,GPU资源是模型服务的命脉。显存使用率、GPU利用率、温度这些指标,直接决定了服务能不能稳定运行。显存爆了,服务就挂了;GPU利用率太低,你又浪费了昂贵的硬件资源。

其次,推理性能是关键。每个请求的处理时间、吞吐量、并发数,这些指标反映了服务的实际表现。用户可不会管你后台用了多牛的模型,他们只关心响应快不快。

再者,错误率不容忽视。模型推理过程中可能会出现各种错误:显存不足、输入格式不对、模型加载失败等等。及时发现并处理这些错误,才能保证服务的可用性。

最后,资源使用情况决定了成本。CPU、内存、磁盘I/O、网络带宽,这些资源的使用情况直接影响着你的运维成本。合理分配资源,才能既保证性能又控制成本。

2. 监控方案整体设计

我们的监控方案基于Prometheus+Grafana这套经典的组合。Prometheus负责采集和存储指标数据,Grafana负责可视化展示。这套方案有几个明显的优势:

一是成熟稳定,社区活跃,遇到问题容易找到解决方案。 二是扩展性强,可以轻松添加新的监控指标。 三是开源免费,对于预算有限的团队特别友好。 四是部署简单,学习成本相对较低。

整个架构分为三层:数据采集层、数据存储层和可视化层。

在数据采集层,我们会在模型服务中暴露Prometheus格式的指标,然后通过Prometheus的抓取机制定期采集这些数据。对于GPU相关的指标,我们会使用NVIDIA的DCGM Exporter来获取。

数据存储层就是Prometheus本身,它会将采集到的指标按照时间序列的方式存储起来,并提供强大的查询语言PromQL。

可视化层则是Grafana,它可以从Prometheus中读取数据,然后以图表、仪表盘的形式展示出来,让你一目了然地看到服务的运行状态。

3. 环境准备与组件部署

3.1 安装Prometheus

首先,我们来部署Prometheus。Prometheus的安装其实很简单,这里我推荐使用Docker方式,这样既方便又干净。

# 创建Prometheus的配置文件目录
mkdir -p /opt/prometheus/config

# 创建Prometheus配置文件
cat > /opt/prometheus/config/prometheus.yml << 'EOF'
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node-exporter'
    static_configs:
      - targets: ['node-exporter:9100']

  - job_name: 'dcgm-exporter'
    static_configs:
      - targets: ['dcgm-exporter:9400']

  - job_name: 'deepseek-model'
    static_configs:
      - targets: ['deepseek-model:8000']
    metrics_path: '/metrics'
EOF

# 使用Docker运行Prometheus
docker run -d \
  --name=prometheus \
  --network=host \
  -p 9090:9090 \
  -v /opt/prometheus/config:/etc/prometheus \
  -v /opt/prometheus/data:/prometheus \
  prom/prometheus:latest \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/prometheus \
  --web.console.libraries=/etc/prometheus/console_libraries \
  --web.console.templates=/etc/prometheus/consoles \
  --web.enable-lifecycle

Prometheus启动后,你可以通过浏览器访问 http://你的服务器IP:9090 来查看Prometheus的Web界面。在这个界面上,你可以执行PromQL查询,查看服务的状态。

3.2 安装Node Exporter

Node Exporter是用来采集服务器基础指标的,比如CPU使用率、内存使用情况、磁盘I/O、网络流量等等。这些指标虽然基础,但对于了解服务器的整体负载情况非常重要。

# 使用Docker运行Node Exporter
docker run -d \
  --name=node-exporter \
  --network=host \
  -p 9100:9100 \
  -v "/proc:/host/proc:ro" \
  -v "/sys:/host/sys:ro" \
  -v "/:/rootfs:ro" \
  prom/node-exporter:latest \
  --path.procfs=/host/proc \
  --path.sysfs=/host/sys \
  --collector.filesystem.mount-points-exclude="^/(sys|proc|dev|host|etc)($|/)"

Node Exporter默认会在9100端口暴露指标。你可以在Prometheus的Targets页面看到node-exporter的状态,如果显示为UP,就说明采集正常。

3.3 安装DCGM Exporter

对于GPU监控,我们需要专门的工具。NVIDIA提供了DCGM(Data Center GPU Manager),而DCGM Exporter则是将DCGM的指标转换成Prometheus格式的工具。

# 使用Docker运行DCGM Exporter
docker run -d \
  --name=dcgm-exporter \
  --network=host \
  --gpus all \
  -p 9400:9400 \
  nvcr.io/nvidia/k8s/dcgm-exporter:3.3.4-3.1.5-ubuntu22.04

DCGM Exporter会采集GPU的各种指标,包括:

  • GPU利用率(正在执行计算的时间百分比)
  • GPU显存使用情况
  • GPU温度
  • GPU功耗
  • GPU错误信息

这些指标对于模型服务来说至关重要。你可以通过 http://你的服务器IP:9400/metrics 查看DCGM Exporter暴露的所有指标。

3.4 为模型服务添加指标暴露

现在我们需要修改DeepSeek-R1-Distill-Qwen-1.5B模型服务的部署方式,让它能够暴露Prometheus格式的指标。这里我们使用vLLM来部署模型,并启用它的指标暴露功能。

# 修改模型服务的启动命令,添加指标暴露
MODEL_NAME="DeepSeek-R1-Distill-Qwen-1.5B"
LOCAL_SAVE_PATH="/mnt/1.5B"
PORT="30000"
METRICS_PORT="8000"

# 停止原有的服务(如果存在)
docker stop ${MODEL_NAME} 2>/dev/null || true
docker rm ${MODEL_NAME} 2>/dev/null || true

# 启动新的服务,启用Prometheus指标
docker run -d -t \
  --network=host \
  --gpus all \
  --privileged \
  --ipc=host \
  --name ${MODEL_NAME} \
  -v ${LOCAL_SAVE_PATH}:/data \
  egs-registry.cn-hangzhou.cr.aliyuncs.com/egs/vllm:0.6.4.post1-pytorch2.5.1-cuda12.4-ubuntu22.04 \
  /bin/bash -c "vllm serve /data \
    --port ${PORT} \
    --served-model-name ${MODEL_NAME} \
    --tensor-parallel-size 1 \
    --max-model-len=16384 \
    --enforce-eager \
    --dtype=half \
    --metric-config '{\"namespace\": \"vllm\", \"labels\": {\"model\": \"deepseek-r1-distill-qwen-1.5b\"}}' \
    --enable-metrics \
    --metrics-port ${METRICS_PORT}"

vLLM会自动在指定的端口(这里是8000)暴露Prometheus格式的指标。这些指标包括:

  • 请求处理延迟
  • 请求吞吐量
  • 令牌生成速度
  • 缓存命中率
  • 错误计数

4. 配置Grafana可视化看板

4.1 安装Grafana

Grafana的安装也很简单,同样推荐使用Docker方式。

# 创建Grafana的数据目录
mkdir -p /opt/grafana/data

# 使用Docker运行Grafana
docker run -d \
  --name=grafana \
  --network=host \
  -p 3000:3000 \
  -v /opt/grafana/data:/var/lib/grafana \
  grafana/grafana:latest

Grafana启动后,你可以通过 http://你的服务器IP:3000 访问。默认的用户名和密码都是 admin,首次登录后会要求修改密码。

4.2 配置数据源

登录Grafana后,第一步要配置数据源。点击左侧菜单的"Configuration" -> "Data Sources" -> "Add data source",选择Prometheus。

在配置页面中,填写以下信息:

  • Name: Prometheus(可以自定义)
  • URL: http://localhost:9090
  • Access: Server(默认)

其他选项保持默认,点击"Save & Test"。如果配置正确,你会看到"Data source is working"的提示。

4.3 导入监控看板

Grafana社区有很多现成的监控看板,我们可以直接导入使用。这里我推荐几个适合模型服务监控的看板:

  1. Node Exporter Full(ID: 1860) 这个看板展示了服务器的所有基础指标,包括CPU、内存、磁盘、网络等。

  2. NVIDIA DCGM Exporter Dashboard(ID: 12239) 专门用于监控GPU的看板,展示了GPU利用率、显存、温度等关键指标。

  3. vLLM Metrics Dashboard 对于vLLM的监控,我们可以自己创建一个看板,或者使用社区提供的模板。

以Node Exporter看板为例,导入方法如下:

  • 点击左侧菜单的"Dashboards" -> "Import"
  • 在"Import via grafana.com"中输入看板ID: 1860
  • 点击"Load"
  • 选择刚才配置的Prometheus数据源
  • 点击"Import"

导入成功后,你就可以看到一个完整的服务器监控看板了。

4.4 创建自定义模型服务看板

虽然社区看板很全面,但对于模型服务的特定需求,我们最好还是创建一个自定义看板。下面是一个简单的模型服务看板配置示例:

{
  "dashboard": {
    "title": "DeepSeek Model Service Dashboard",
    "panels": [
      {
        "title": "Request Rate",
        "targets": [{
          "expr": "rate(vllm_num_prompt_tokens_total[5m])",
          "legendFormat": "Prompt Tokens"
        }, {
          "expr": "rate(vllm_num_generation_tokens_total[5m])",
          "legendFormat": "Generation Tokens"
        }],
        "type": "graph"
      },
      {
        "title": "Request Latency",
        "targets": [{
          "expr": "histogram_quantile(0.95, rate(vllm_request_duration_seconds_bucket[5m]))",
          "legendFormat": "P95 Latency"
        }, {
          "expr": "histogram_quantile(0.50, rate(vllm_request_duration_seconds_bucket[5m]))",
          "legendFormat": "P50 Latency"
        }],
        "type": "graph"
      },
      {
        "title": "GPU Memory Usage",
        "targets": [{
          "expr": "DCGM_FI_DEV_FB_USED{instance=~\"$instance\"}",
          "legendFormat": "Used"
        }, {
          "expr": "DCGM_FI_DEV_FB_FREE{instance=~\"$instance\"}",
          "legendFormat": "Free"
        }],
        "type": "graph"
      }
    ]
  }
}

这个看板包含了三个关键图表:

  1. 请求速率:显示模型处理提示令牌和生成令牌的速率
  2. 请求延迟:显示P50和P95的请求处理延迟
  3. GPU显存使用:显示GPU显存的使用情况

你可以根据实际需求,添加更多的图表,比如错误率、缓存命中率、GPU利用率等。

5. 设置告警规则

监控看板能让你看到当前的状态,但你不能一直盯着看板。这时候就需要告警功能,当出现异常时自动通知你。

5.1 配置Prometheus告警规则

首先,在Prometheus中配置告警规则。创建告警规则文件:

mkdir -p /opt/prometheus/config/rules

cat > /opt/prometheus/config/rules/alerts.yml << 'EOF'
groups:
  - name: model_service_alerts
    rules:
      - alert: HighGPUUsage
        expr: DCGM_FI_DEV_GPU_UTIL > 90
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High GPU usage on {{ $labels.instance }}"
          description: "GPU usage is above 90% for 5 minutes"

      - alert: HighGPUMemoryUsage
        expr: (DCGM_FI_DEV_FB_USED / DCGM_FI_DEV_FB_TOTAL) * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High GPU memory usage on {{ $labels.instance }}"
          description: "GPU memory usage is above 85% for 5 minutes"

      - alert: HighRequestLatency
        expr: histogram_quantile(0.95, rate(vllm_request_duration_seconds_bucket[5m])) > 10
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High request latency on model service"
          description: "P95 request latency is above 10 seconds for 5 minutes"

      - alert: HighErrorRate
        expr: rate(vllm_request_failure_total[5m]) / rate(vllm_request_total[5m]) > 0.05
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "High error rate on model service"
          description: "Error rate is above 5% for 5 minutes"
EOF

然后修改Prometheus的配置文件,添加告警规则:

# 在prometheus.yml中添加
rule_files:
  - "rules/alerts.yml"

alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - localhost:9093

5.2 安装和配置Alertmanager

Alertmanager是Prometheus的告警管理器,负责处理告警通知。

# 创建Alertmanager配置文件
mkdir -p /opt/alertmanager/config

cat > /opt/alertmanager/config/alertmanager.yml << 'EOF'
global:
  smtp_smarthost: 'smtp.example.com:587'
  smtp_from: 'alertmanager@example.com'
  smtp_auth_username: 'username'
  smtp_auth_password: 'password'

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'email-notifications'

receivers:
  - name: 'email-notifications'
    email_configs:
      - to: 'admin@example.com'
        send_resolved: true
EOF

# 使用Docker运行Alertmanager
docker run -d \
  --name=alertmanager \
  --network=host \
  -p 9093:9093 \
  -v /opt/alertmanager/config:/etc/alertmanager \
  prom/alertmanager:latest \
  --config.file=/etc/alertmanager/alertmanager.yml \
  --storage.path=/alertmanager

5.3 配置Grafana告警

除了Prometheus的告警,Grafana也提供了告警功能。在Grafana的看板中,你可以为每个图表设置告警规则。

以GPU使用率为例,设置告警的步骤:

  1. 在GPU使用率图表上,点击标题 -> Edit
  2. 切换到"Alert"标签页
  3. 点击"Create Alert"
  4. 设置告警条件:WHEN last() OF query(A, 5m, now) IS ABOVE 90
  5. 设置评估频率:Every 1m For 5m
  6. 配置通知渠道

Grafana支持多种通知渠道,包括邮件、Slack、钉钉、企业微信等。你可以在"Configuration" -> "Alerting" -> "Notification channels"中配置。

6. 监控指标详解与优化建议

6.1 关键监控指标解读

在实际使用中,你需要特别关注以下几类指标:

GPU相关指标:

  • DCGM_FI_DEV_GPU_UTIL:GPU利用率,理想值在70%-90%之间
  • DCGM_FI_DEV_FB_USED:GPU显存使用量,要留出一定的余量
  • DCGM_FI_DEV_GPU_TEMP:GPU温度,长期高于85度需要关注散热
  • DCGM_FI_DEV_POWER_USAGE:GPU功耗,影响电费和散热

模型服务指标:

  • vllm_request_duration_seconds:请求处理时间,P95值要控制在可接受范围内
  • vllm_num_prompt_tokens_total:处理的提示令牌数,反映服务负载
  • vllm_num_generation_tokens_total:生成的令牌数,反映服务输出量
  • vllm_cache_hit_ratio:缓存命中率,影响性能的关键指标

系统资源指标:

  • node_memory_MemAvailable_bytes:可用内存,要保证有足够的内存用于系统运行
  • node_filesystem_avail_bytes:磁盘可用空间,模型文件通常很大
  • node_network_receive_bytes_total:网络接收流量,影响模型加载速度

6.2 性能优化建议

基于监控数据,你可以进行针对性的优化:

如果GPU利用率过低(<50%):

  • 检查是否有请求排队,增加并发请求数
  • 调整批处理大小,提高GPU的并行计算能力
  • 检查CPU或IO是否成为瓶颈

如果GPU显存使用率过高(>90%):

  • 减少批处理大小
  • 使用更小的数据类型(如fp16)
  • 启用vLLM的PagedAttention功能,优化显存使用

如果请求延迟过高:

  • 检查GPU利用率,如果已满负荷,考虑扩容
  • 优化提示词长度,减少不必要的令牌
  • 启用请求批处理,提高吞吐量

如果缓存命中率过低:

  • 调整vLLM的KV缓存大小
  • 对于重复的提示词,考虑使用缓存机制
  • 检查请求模式,是否有大量不同的提示词

6.3 容量规划建议

通过长期的监控数据,你可以更好地进行容量规划:

  1. 确定基准负载:记录正常业务时段的各项指标,作为基准
  2. 识别峰值模式:找出业务高峰期,了解峰值负载
  3. 预测增长趋势:基于历史数据,预测未来的资源需求
  4. 设置扩容阈值:根据业务需求,设置自动扩容的阈值

例如,你可以设置这样的扩容策略:

  • 当GPU利用率连续30分钟超过85%时,自动扩容
  • 当请求延迟P95连续15分钟超过设定阈值时,自动扩容
  • 当错误率连续10分钟超过5%时,自动告警并介入处理

7. 总结

给DeepSeek-R1-Distill-Qwen-1.5B模型服务加上监控,就像给汽车装上了仪表盘。你不再需要凭感觉开车,而是可以实时看到车速、油量、水温等所有关键信息。这套Prometheus+Grafana的监控方案,不仅让你能及时发现和解决问题,更重要的是能让你提前预防问题。

实际用下来,这套方案的效果还是很明显的。部署过程不算复杂,基本上按照步骤来都能搞定。监控数据的丰富程度也足够,从GPU到模型服务再到系统资源,该有的都有了。告警功能也很实用,设置好之后就不用一直盯着看板了。

如果你刚开始接触模型服务监控,建议先从基础指标开始,把GPU和系统资源监控起来。等熟悉了之后,再逐步添加模型服务的特定指标和告警规则。监控不是一蹴而就的事情,需要根据实际运行情况不断调整和优化。

最后要提醒的是,监控数据本身也会占用资源。Prometheus的数据存储、Grafana的查询展示,都需要消耗CPU和内存。对于小规模部署,这点开销可以忽略不计。但如果监控的目标很多,数据量很大,就需要考虑监控系统的资源分配了。一般来说,给监控系统单独分配一些资源,避免跟模型服务争抢,是个不错的做法。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐