Qwen1.5-0.5B-Chat监控告警:Prometheus集成部署教程
1. 引言
1.1 学习目标
本文旨在指导开发者如何为基于 ModelScope 部署的Qwen1.5-0.5B-Chat轻量级对话服务构建完整的监控与告警体系。通过集成 Prometheus 和 Grafana,实现对模型推理服务的关键指标(如请求延迟、CPU 使用率、内存占用等)进行可视化监控,并结合 Alertmanager 实现异常告警。
读者在完成本教程后将能够: - 理解轻量级 AI 服务监控的核心需求 - 在 Flask 应用中暴露 Prometheus 可采集的 metrics 接口 - 部署并配置 Prometheus、Grafana 和 Alertmanager - 构建针对 AI 模型服务的告警规则 - 实现从指标采集到告警通知的完整链路
1.2 前置知识
建议读者具备以下基础: - Python 基础编程能力 - Flask 或 Web 框架使用经验 - Docker 和容器化部署基本概念 - 对 Prometheus 监控系统有初步了解
1.3 教程价值
随着 AI 模型越来越多地被部署到生产环境,传统的“能跑就行”模式已无法满足稳定性要求。尤其对于资源受限的轻量级模型服务(如 Qwen1.5-0.5B-Chat),更需要精细化的运行时监控来保障服务质量。
本教程提供了一套可复用、低侵入、易扩展的监控方案,特别适用于: - 无 GPU 环境下的 CPU 推理服务 - 边缘设备或低配服务器部署场景 - 快速验证类项目的运维支持
2. 环境准备与服务增强
2.1 扩展技术栈以支持监控
为了实现全面监控,我们需要在原有技术栈基础上引入以下组件:
| 组件 | 用途 |
|---|---|
prometheus-client | 在 Flask 中暴露 /metrics 接口 |
| Prometheus Server | 指标拉取与存储 |
| Grafana | 指标可视化展示 |
| Alertmanager | 告警通知管理 |
| Node Exporter | 主机级系统指标采集 |
2.2 增强 Qwen1.5-0.5B-Chat 服务
我们需对原始 Flask 服务进行改造,使其支持指标暴露功能。
安装依赖
conda activate qwen_env pip install prometheus-client flask-monitoringdashboard修改 app.py 添加监控中间件
from flask import Flask, request, jsonify, render_template from modelscope import AutoModelForCausalLM, AutoTokenizer import torch import time from prometheus_client import Counter, Histogram, generate_latest, CONTENT_TYPE_LATEST app = Flask(__name__) # 定义 Prometheus 指标 REQUEST_COUNT = Counter( 'flask_request_count', 'Total number of HTTP requests', ['method', 'endpoint', 'status'] ) REQUEST_LATENCY = Histogram( 'flask_request_latency_seconds', 'Request latency in seconds', ['endpoint'] ) # 初始化模型(保持原逻辑) model_id = "qwen/Qwen1.5-0.5B-Chat" tokenizer = AutoTokenizer.from_pretrained(model_id) model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.float32) @app.before_request def start_timer(): request.start_time = time.time() @app.after_request def record_metrics(response): # 计算请求耗时 latency = time.time() - request.start_time REQUEST_LATENCY.labels(endpoint=request.endpoint).observe(latency) # 增加请求计数 REQUEST_COUNT.labels( method=request.method, endpoint=request.endpoint, status=response.status_code ).inc() return response @app.route('/metrics') def metrics(): return generate_latest(), 200, {'Content-Type': CONTENT_TYPE_LATEST} @app.route("/chat", methods=["POST"]) def chat(): data = request.json input_text = data.get("text", "") inputs = tokenizer(input_text, return_tensors="pt") start_time = time.time() with torch.no_grad(): outputs = model.generate( inputs.input_ids, max_new_tokens=128, do_sample=True, temperature=0.7, ) response_text = tokenizer.decode(outputs[0], skip_special_tokens=True) inference_time = time.time() - start_time return jsonify({ "response": response_text, "inference_time": f"{inference_time:.2f}s" }) @app.route("/") def index(): return render_template("index.html") if __name__ == "__main__": app.run(host="0.0.0.0", port=8080)核心改动说明
- 引入
Counter和Histogram分别记录请求数和延迟- 使用 Flask 的
before_request和after_request钩子自动采集指标- 新增
/metrics路由供 Prometheus 抓取数据- 在推理过程中增加时间测量点
验证指标接口
启动服务后访问http://<your-host>:8080/metrics,应看到类似以下输出:
# HELP flask_request_count Total number of HTTP requests # TYPE flask_request_count counter flask_request_count{method="POST",endpoint="chat",status="200"} 3 # HELP flask_request_latency_seconds Request latency in seconds # TYPE flask_request_latency_seconds histogram flask_request_latency_seconds_sum{endpoint="chat"} 2.15 flask_request_latency_seconds_count{endpoint="chat"} 3这表明指标已成功暴露。
3. Prometheus 监控系统部署
3.1 编写 docker-compose.yml
创建docker-compose.yml文件统一管理所有监控组件:
version: '3.8' services: qwen-chat: build: context: . dockerfile: Dockerfile.qwen ports: - "8080:8080" environment: - PYTHONUNBUFFERED=1 volumes: - ./logs:/app/logs node-exporter: image: prom/node-exporter:v1.6.1 container_name: node-exporter ports: - "9100:9100" command: - '--path.rootfs=/host' volumes: - '/:/host:ro,rslave' prometheus: image: prom/prometheus:v2.47.0 container_name: prometheus ports: - "9090:9090" command: - '--config.file=/etc/prometheus/prometheus.yml' - '--web.enable-lifecycle' volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus grafana: image: grafana/grafana:10.1.0 container_name: grafana ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=admin volumes: - grafana_storage:/var/lib/grafana alertmanager: image: prom/alertmanager:v0.26.0 container_name: alertmanager ports: - "9093:9093" volumes: - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml volumes: prometheus_data: grafana_storage:3.2 配置 Prometheus 抓取任务
创建prometheus.yml配置文件:
global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: 'qwen-chat-service' static_configs: - targets: ['qwen-chat:8080'] - job_name: 'node-exporter' static_configs: - targets: ['node-exporter:9100'] rule_files: - 'alerts.yml' alerting: alertmanagers: - static_configs: - targets: ['alertmanager:9093']3.3 创建告警规则文件 alerts.yml
groups: - name: qwen-chat-alerts rules: - alert: HighInferenceLatency expr: histogram_quantile(0.95, sum(rate(flask_request_latency_seconds_bucket{endpoint="chat"}[5m])) by (le)) > 10 for: 2m labels: severity: warning annotations: summary: "高推理延迟" description: "Qwen1.5-0.5B-Chat 服务的 95% 请求延迟超过 10 秒" - alert: HighErrorRate expr: sum(rate(flask_request_count{status!="200"}[5m])) by (endpoint) / sum(rate(flask_request_count[5m])) by (endpoint) > 0.1 for: 5m labels: severity: critical annotations: summary: "高错误率" description: "Qwen 服务在过去 5 分钟内错误率超过 10%"4. Grafana 可视化与告警配置
4.1 登录并添加数据源
- 浏览器访问
http://localhost:3000 - 使用默认账号密码登录:
admin/admin - 进入Configuration > Data Sources添加 Prometheus 数据源
- URL:
http://prometheus:9090 - 点击Save & Test
4.2 导入预设仪表板
推荐导入官方 ID 为1860的"Flask App Dashboard":
- 点击+ Create > Import
- 输入 Dashboard ID:
1860 - 选择 Prometheus 数据源
- 完成导入
该仪表板将展示: - HTTP 请求速率与状态码分布 - 请求延迟 P50/P95/P99 - Python GC 次数与内存使用趋势
4.3 自定义 Qwen 专用看板
新建仪表板,添加以下关键面板:
| 面板名称 | 查询语句 | 类型 |
|---|---|---|
| 推理请求总数 | sum(flask_request_count{endpoint="chat"}) | Stat |
| 平均延迟 (P95) | histogram_quantile(0.95, sum(rate(flask_request_latency_seconds_bucket{endpoint="chat"}[5m])) by (le)) | Time series |
| 内存使用率 | 1 - node_memory_free_bytes{instance="node-exporter:9100"} / node_memory_memtotal_bytes{instance="node-exporter:9100"} | Gauge |
| CPU 使用率 | 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) | Graph |
5. 告警通知渠道配置
5.1 配置 Alertmanager 发送邮件告警
编辑alertmanager.yml:
route: receiver: email-notifications group_by: [alertname] group_wait: 30s group_interval: 5m repeat_interval: 1h receivers: - name: email-notifications email_configs: - to: your-email@example.com from: alertmanager@yourdomain.com smarthost: smtp.gmail.com:587 auth_username: "your-email@gmail.com" auth_identity: "your-email@gmail.com" auth_password: "your-app-password"注意:若使用 Gmail,请提前开启两步验证并生成应用专用密码。
5.2 测试告警流程
可通过临时修改告警阈值触发测试告警,例如将延迟阈值改为 1 秒:
expr: histogram_quantile(0.95, ...) > 1 # 原为 10观察 Alertmanager UI (http://localhost:9093) 是否出现激活告警,并检查邮箱是否收到通知。
6. 总结
6.1 实践经验总结
本文完成了从 Qwen1.5-0.5B-Chat 服务增强到完整监控告警体系搭建的全过程。核心收获包括:
- 低侵入式指标注入:通过 Flask 钩子函数实现自动化指标采集,无需修改业务逻辑。
- 轻量级部署友好:整套监控系统可在单台 2GB 内存机器上稳定运行,适合边缘部署。
- 端到端可观测性:覆盖了应用层(推理延迟)、服务层(HTTP 状态)、系统层(CPU/内存)三大维度。
6.2 最佳实践建议
- 定期审查告警规则:避免“告警疲劳”,确保每条告警都有明确处理流程。
- 设置合理的采样间隔:对于 CPU 推理服务,15s 的 scrape_interval 已足够平衡精度与开销。
- 保留历史日志:建议将
/metrics访问日志持久化,便于事后分析性能退化问题。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。