Llama-3.2V-11B-cot部署教程:Prometheus+Grafana监控推理服务指标

1. 引言:为什么需要监控你的AI服务?

想象一下,你刚刚部署了一个强大的视觉推理模型,它能看懂图片、分析内容,还能像人一样一步步推理。但问题来了:你怎么知道它现在运行得怎么样?它处理一张图片要多久?内存占用高不高?有没有出错?

这就是监控的意义。没有监控的AI服务,就像在黑暗中开车——你不知道前方是坦途还是悬崖。今天,我们就来手把手教你,如何为Llama-3.2V-11B-cot推理服务搭建一套完整的监控系统,让你随时掌握服务的“健康状况”。

Llama-3.2V-11B-cot 是一个很特别的模型。它不仅能理解图片内容,还能进行系统性推理。简单来说,你给它一张图,它不会只告诉你“这是一只猫”,而是会像侦探一样,一步步分析:“图片里有只猫,它躺在沙发上,旁边有个毛线球,所以这只猫可能刚玩过毛线球。”

这种复杂的推理能力,对计算资源的要求也更高。所以,监控就显得尤为重要。通过Prometheus+Grafana这套组合,你可以:

  • 实时查看推理延迟(处理一张图要多久)
  • 监控GPU/CPU使用率(硬件资源够不够用)
  • 统计请求成功率(服务稳不稳定)
  • 设置告警(出问题第一时间知道)

接下来,我会带你从零开始,一步步搭建这套监控系统。即使你之前没接触过Prometheus或Grafana,也能跟着做下来。

2. 环境准备与快速部署

2.1 检查基础环境

在开始之前,我们先确认一下你的环境是否准备好了。Llama-3.2V-11B-cot需要一些基础依赖,我们来快速检查一下。

打开终端,运行以下命令:

# 检查Python版本(需要3.8以上)
python3 --version

# 检查pip是否可用
pip3 --version

# 检查CUDA是否可用(如果你用GPU)
nvidia-smi

如果你看到Python版本是3.8+,pip能正常使用,GPU也识别到了(如果要用GPU),那么环境就基本没问题了。

2.2 快速启动推理服务

我们先按照最简单的方式启动服务,确保模型能正常运行。这是后续监控的基础。

# 进入项目目录
cd /root/Llama-3.2V-11B-cot

# 启动推理服务
python app.py

启动后,你应该能看到类似这样的输出:

INFO:     Started server process [12345]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:7860 (Press CTRL+C to quit)

现在,打开浏览器访问 http://你的服务器IP:7860,应该能看到一个Web界面。你可以上传一张图片试试看,模型应该能正常进行推理。

重要提示:先让服务保持运行,我们接下来要给它“装上监控眼睛”。

3. 为推理服务添加监控指标

3.1 理解监控指标:我们要监控什么?

在开始写代码之前,我们先搞清楚要监控哪些东西。对于AI推理服务来说,最重要的指标有这几类:

  1. 性能指标:处理请求要花多长时间(延迟)、每秒能处理多少请求(吞吐量)
  2. 资源指标:GPU用了多少、内存用了多少、CPU用了多少
  3. 业务指标:总共处理了多少请求、成功了多少、失败了多少
  4. 质量指标:推理结果的准确率(如果有标注数据的话)

今天我们先关注前三种,因为它们最容易实现,也最能反映服务的运行状态。

3.2 安装必要的Python库

我们需要安装几个Python库来帮助收集和暴露监控指标:

# 安装Prometheus客户端库
pip install prometheus-client

# 安装ASGI中间件(如果你的服务基于FastAPI或类似框架)
pip install prometheus-fastapi-instrumentator

如果你用的是其他Web框架,比如Flask,可以安装对应的库:

# 如果是Flask
pip install prometheus-flask-exporter

3.3 修改服务代码,添加监控

现在我们来修改 app.py,让服务能够暴露监控指标。别担心,改动不大,主要是添加一些“计数器”和“计时器”。

首先,在文件开头添加导入:

from prometheus_client import Counter, Histogram, Gauge, generate_latest, REGISTRY
from prometheus_client.exposition import MetricsHandler
import time

然后,在合适的位置定义监控指标:

# 定义监控指标
REQUEST_COUNT = Counter(
    'llama_vision_requests_total',
    'Total number of requests to the vision model'
)

REQUEST_LATENCY = Histogram(
    'llama_vision_request_duration_seconds',
    'Request latency in seconds',
    buckets=[0.1, 0.5, 1.0, 2.0, 5.0, 10.0, 30.0]
)

REQUEST_ERRORS = Counter(
    'llama_vision_request_errors_total',
    'Total number of failed requests'
)

GPU_MEMORY_USAGE = Gauge(
    'llama_vision_gpu_memory_usage_bytes',
    'GPU memory usage in bytes'
)

ACTIVE_REQUESTS = Gauge(
    'llama_vision_active_requests',
    'Number of requests currently being processed'
)

接下来,我们需要在请求处理的地方“埋点”。找到处理图片推理的函数,添加监控代码:

async def process_image_request(image_data, question):
    """处理图片推理请求,并记录监控指标"""
    
    # 记录活跃请求数增加
    ACTIVE_REQUESTS.inc()
    
    start_time = time.time()
    
    try:
        # 记录请求总数
        REQUEST_COUNT.inc()
        
        # 这里是原来的推理代码
        # result = model.process(image_data, question)
        
        # 模拟推理过程
        result = {
            "summary": "图片内容摘要",
            "caption": "图片描述",
            "reasoning": "推理过程",
            "conclusion": "最终结论"
        }
        
        # 记录请求延迟
        latency = time.time() - start_time
        REQUEST_LATENCY.observe(latency)
        
        return result
        
    except Exception as e:
        # 记录错误
        REQUEST_ERRORS.inc()
        raise e
        
    finally:
        # 记录活跃请求数减少
        ACTIVE_REQUESTS.dec()

最后,添加一个专门用于暴露监控指标的端点:

from fastapi import Response
from fastapi.responses import PlainTextResponse

@app.get("/metrics")
async def get_metrics():
    """暴露Prometheus格式的监控指标"""
    # 如果有GPU,可以在这里更新GPU使用率
    try:
        import torch
        if torch.cuda.is_available():
            gpu_memory = torch.cuda.memory_allocated()
            GPU_MEMORY_USAGE.set(gpu_memory)
    except:
        pass
    
    metrics_data = generate_latest(REGISTRY)
    return Response(content=metrics_data, media_type="text/plain")

3.4 测试监控端点

修改完成后,重启服务:

# 如果服务在运行,先按Ctrl+C停止
python app.py

等服务启动后,访问 http://你的服务器IP:7860/metrics,你应该能看到类似这样的输出:

# HELP llama_vision_requests_total Total number of requests to the vision model
# TYPE llama_vision_requests_total counter
llama_vision_requests_total 0

# HELP llama_vision_request_duration_seconds Request latency in seconds
# TYPE llama_vision_request_duration_seconds histogram
llama_vision_request_duration_seconds_bucket{le="0.1"} 0
llama_vision_request_duration_seconds_bucket{le="0.5"} 0
# ... 更多数据

这就说明监控指标已经成功暴露了!现在每次有请求过来,这些指标都会自动更新。

4. 部署Prometheus收集指标

4.1 什么是Prometheus?

简单来说,Prometheus就是一个“数据收集器”。它会定期访问你的服务(比如每15秒一次),从 /metrics 端点拉取监控数据,然后存储起来。

你可以把它想象成一个不断问“你现在怎么样?”的助手,然后把你的回答记录下来。

4.2 安装和配置Prometheus

首先,下载Prometheus:

# 创建Prometheus目录
mkdir -p /opt/prometheus
cd /opt/prometheus

# 下载最新版Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz

# 解压
tar xvfz prometheus-2.45.0.linux-amd64.tar.gz
cd prometheus-2.45.0.linux-amd64

接下来,创建配置文件。新建一个文件 prometheus.yml

global:
  scrape_interval: 15s  # 每15秒收集一次数据
  evaluation_interval: 15s  # 每15秒评估一次告警规则

# 告警规则配置(可以先留空)
rule_files:
  # - "alert.rules"

# 要监控的目标列表
scrape_configs:
  # 监控Prometheus自己
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
        labels:
          service: 'prometheus'

  # 监控我们的Llama视觉推理服务
  - job_name: 'llama-vision-service'
    static_configs:
      - targets: ['localhost:7860']  # 你的服务地址
        labels:
          service: 'llama-vision'
          model: 'llama-3.2v-11b-cot'

重要:如果你的推理服务运行在其他机器或端口上,记得修改 targets 中的地址。

4.3 启动Prometheus

现在启动Prometheus服务:

# 在前台启动(方便看日志)
./prometheus --config.file=prometheus.yml

# 或者后台启动
nohup ./prometheus --config.file=prometheus.yml > prometheus.log 2>&1 &

启动后,访问 http://你的服务器IP:9090,就能看到Prometheus的Web界面了。

4.4 验证数据收集

在Prometheus界面中,点击顶部菜单的“Status” -> “Targets”,你应该能看到两个监控目标:

  1. prometheus (localhost:9090) - 状态应该是UP
  2. llama-vision-service (localhost:7860) - 状态应该是UP

如果llama-vision-service的状态是DOWN,可能是:

  • 推理服务没启动
  • 端口不对
  • 防火墙阻止了访问

等状态都变成UP后,点击“Graph”标签,在输入框里输入 llama_vision_requests_total,然后点击“Execute”。如果能看到数据(可能是0),就说明Prometheus已经成功收集到指标了。

现在,回到推理服务的Web界面,上传几张图片进行推理。然后刷新Prometheus的查询,你应该能看到 llama_vision_requests_total 的值增加了。

5. 使用Grafana可视化监控数据

5.1 什么是Grafana?

Prometheus虽然能收集数据,但它的界面比较“工程师向”,不够直观。Grafana就是一个“仪表盘”,能把枯燥的数据变成漂亮的图表,让你一眼就能看出服务的运行状态。

5.2 安装和启动Grafana

安装Grafana很简单:

# 添加Grafana仓库
sudo apt-get install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -

# 安装Grafana
sudo apt-get update
sudo apt-get install -y grafana

# 启动Grafana服务
sudo systemctl start grafana-server
sudo systemctl enable grafana-server  # 设置开机自启

默认情况下,Grafana运行在3000端口。访问 http://你的服务器IP:3000,用默认账号密码登录:

  • 用户名:admin
  • 密码:admin

第一次登录会要求修改密码,建议设置一个强密码。

5.3 配置数据源

登录后,我们需要告诉Grafana去哪里获取数据(也就是Prometheus)。

  1. 点击左侧菜单的“Configuration”(齿轮图标)-> “Data Sources”
  2. 点击“Add data source”
  3. 选择“Prometheus”
  4. 在URL处填写 http://localhost:9090(如果Prometheus在其他机器,填对应的地址)
  5. 点击“Save & Test”,应该会显示“Data source is working”

5.4 创建监控仪表盘

现在我们来创建一个专门监控Llama推理服务的仪表盘。

  1. 点击左侧菜单的“Create”(加号图标)-> “Dashboard”
  2. 点击“Add new panel”

我们来添加第一个图表:请求数量监控

在查询框输入:

sum(rate(llama_vision_requests_total[5m]))

这个查询的意思是:计算最近5分钟内,平均每秒的请求数。

在右侧设置中:

  • 标题改为“请求速率 (QPS)”
  • 单位选择“requests/s”
  • 可以根据喜好调整图表类型(折线图、柱状图等)

点击“Apply”保存这个图表。

用同样的方法,我们再添加几个重要的图表:

2. 请求延迟分布 查询:

histogram_quantile(0.95, rate(llama_vision_request_duration_seconds_bucket[5m]))

标题:“95%请求延迟” 单位:“seconds”

3. 错误率 查询:

rate(llama_vision_request_errors_total[5m]) / rate(llama_vision_requests_total[5m])

标题:“请求错误率” 单位:“percentunit”(会自动显示为百分比)

4. 活跃请求数 查询:

llama_vision_active_requests

标题:“当前活跃请求数”

5. GPU内存使用(如果有GPU) 查询:

llama_vision_gpu_memory_usage_bytes

标题:“GPU内存使用” 单位:“bytes”

5.5 布局和美化

添加完所有图表后,你可以:

  • 拖动图表调整位置
  • 调整图表大小
  • 设置刷新间隔(比如每10秒自动刷新)
  • 添加说明文字

一个完整的监控仪表盘可能长这样:

┌─────────────────┬─────────────────┐
│  请求速率(QPS)  │   95%请求延迟   │
├─────────────────┼─────────────────┤
│    错误率       │  活跃请求数     │
├─────────────────┼─────────────────┤
│  GPU内存使用    │    (空位)       │
└─────────────────┴─────────────────┘

点击右上角的“Save”按钮,给仪表盘起个名字,比如“Llama Vision Service Monitoring”。

6. 设置告警规则

监控仪表盘能让你看到问题,但你不能一直盯着屏幕看。告警功能能在问题发生时主动通知你。

6.1 在Prometheus中定义告警规则

创建告警规则文件 alert.rules

groups:
  - name: llama_vision_alerts
    rules:
      # 规则1:错误率过高
      - alert: HighErrorRate
        expr: rate(llama_vision_request_errors_total[5m]) / rate(llama_vision_requests_total[5m]) > 0.05
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "Llama Vision服务错误率过高"
          description: "错误率已达到 {{ $value }},超过5%的阈值"
      
      # 规则2:延迟过高
      - alert: HighLatency
        expr: histogram_quantile(0.95, rate(llama_vision_request_duration_seconds_bucket[5m])) > 10
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "Llama Vision服务延迟过高"
          description: "95%请求延迟已达到 {{ $value }}秒,超过10秒阈值"
      
      # 规则3:服务宕机
      - alert: ServiceDown
        expr: up{job="llama-vision-service"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Llama Vision服务不可用"
          description: "服务已宕机超过1分钟"

修改 prometheus.yml,取消注释并指定告警规则文件:

rule_files:
  - "alert.rules"  # 取消注释这行

重启Prometheus使配置生效。

6.2 配置告警通知(以邮件为例)

Prometheus本身不发送通知,它需要配合Alertmanager。这里我们简单配置一下邮件告警。

首先安装Alertmanager:

cd /opt/prometheus
wget https://github.com/prometheus/alertmanager/releases/download/v0.25.0/alertmanager-0.25.0.linux-amd64.tar.gz
tar xvfz alertmanager-0.25.0.linux-amd64.tar.gz
cd alertmanager-0.25.0.linux-amd64

创建配置文件 alertmanager.yml

global:
  smtp_smarthost: 'smtp.gmail.com:587'  # 你的SMTP服务器
  smtp_from: 'your-email@gmail.com'
  smtp_auth_username: 'your-email@gmail.com'
  smtp_auth_password: 'your-app-password'  # 注意:不是邮箱密码,是应用专用密码

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

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

启动Alertmanager:

nohup ./alertmanager --config.file=alertmanager.yml > alertmanager.log 2>&1 &

最后,修改Prometheus配置,告诉它Alertmanager的地址:

alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - localhost:9093  # Alertmanager默认端口

现在,当服务出现问题时,你就会收到邮件通知了。

7. 总结与进阶建议

7.1 我们做了什么?

回顾一下,我们完成了以下几件事:

  1. 给推理服务添加了监控指标:让服务能“报告”自己的状态
  2. 部署了Prometheus:定期收集和存储这些监控数据
  3. 搭建了Grafana仪表盘:把数据变成直观的图表
  4. 配置了告警规则:有问题时能及时通知

现在,你有了一个完整的监控系统,可以:

  • 实时查看服务的请求量、延迟、错误率
  • 了解硬件资源的使用情况
  • 在服务出现问题时第一时间知道
  • 基于数据做容量规划(比如什么时候需要升级服务器)

7.2 进阶监控建议

如果你想让监控更完善,可以考虑:

1. 添加更多业务指标

  • 推理结果的质量评分(如果有评估方法)
  • 不同图片类型的处理时间差异
  • 用户满意度指标(如果有反馈机制)

2. 监控系统资源

# 添加CPU、内存监控
import psutil

CPU_USAGE = Gauge('llama_vision_cpu_usage_percent', 'CPU usage percentage')
MEMORY_USAGE = Gauge('llama_vision_memory_usage_bytes', 'Memory usage in bytes')

def update_system_metrics():
    CPU_USAGE.set(psutil.cpu_percent())
    MEMORY_USAGE.set(psutil.Process().memory_info().rss)

3. 日志与监控结合

  • 把重要的业务日志也收集起来
  • 在Grafana中同时查看指标和日志
  • 使用Loki+Promtail+Grafana搭建日志监控

4. 自动化运维

  • 基于监控数据自动扩缩容
  • 异常检测和自动恢复
  • 容量预测和预警

7.3 常见问题排查

问题1:Prometheus显示Target为DOWN

  • 检查推理服务是否在运行:curl http://localhost:7860/health
  • 检查防火墙设置:sudo ufw status
  • 检查Prometheus配置中的target地址是否正确

问题2:Grafana看不到数据

  • 检查数据源配置:确保URL正确,能正常连接
  • 检查查询语句:在Prometheus界面先测试查询
  • 检查时间范围:Grafana右上角的时间范围设置

问题3:告警不触发

  • 检查告警规则表达式:在Prometheus的“Alerts”页面查看状态
  • 检查Alertmanager日志:tail -f alertmanager.log
  • 检查网络连接:Prometheus能否访问Alertmanager

7.4 最后的建议

监控不是一次性的工作,而是一个持续的过程。随着业务发展,你可能需要:

  • 调整监控指标(增加新的、删除没用的)
  • 优化告警阈值(避免误报或漏报)
  • 完善仪表盘(让重要信息更突出)

记住,好的监控系统应该像汽车的仪表盘——不需要的时候你不会注意它,但需要的时候,它能立刻告诉你关键信息。

现在,你的Llama-3.2V-11B-cot推理服务已经有了“眼睛”和“耳朵”,你可以更放心地让它服务用户了。如果遇到问题,监控系统会第一时间告诉你,让你能快速响应和处理。


获取更多AI镜像

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

Logo

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

更多推荐