news 2026/3/29 9:27:37

DeepSeek-R1-Distill-Qwen-1.5B实操教程:集成Prometheus+Grafana监控GPU利用率与QPS

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek-R1-Distill-Qwen-1.5B实操教程:集成Prometheus+Grafana监控GPU利用率与QPS

DeepSeek-R1-Distill-Qwen-1.5B实操教程:集成Prometheus+Grafana监控GPU利用率与QPS

1. 为什么需要监控一个1.5B模型的运行状态?

你可能已经试过直接跑起那个轻巧的 DeepSeek-R1-Distill-Qwen-1.5B 模型——它启动快、响应快、显存占用低,甚至能在 RTX 3060 这样的入门卡上流畅对话。但当你开始连续提问、开启多轮长思维链推理、或者想把它长期挂为本地服务时,问题就悄悄浮现了:

  • 显存用了多少?是不是越聊越多,最后卡死?
  • 每次请求实际耗时多久?是模型慢,还是 Streamlit 渲染拖了后腿?
  • QPS(每秒查询数)稳定在 0.8 还是 1.2?有没有突发抖动?
  • 如果明天要加个 API 接口供其他程序调用,怎么知道它扛不扛得住?

这些都不是“能不能跑”的问题,而是“能不能稳、能不能扩、能不能信”的问题。
本教程不讲大道理,也不堆参数,就带你从零部署一套真实可用的监控体系:用 Prometheus 抓取 GPU 利用率、显存占用、推理延迟、请求计数等核心指标,再用 Grafana 做出清晰直观的看板。所有组件全部本地运行,不依赖云服务,不上传任何数据,和你的 DeepSeek 对话服务一样,完全私有、可控、可复现。

你不需要是运维专家,只要会敲几行命令、能看懂图表,就能把这套监控搭起来。整个过程控制在 15 分钟内,且后续可无缝接入更多模型服务。

2. 环境准备与服务基础架构

2.1 当前服务结构回顾

我们先理清已有的服务链路,这是监控埋点的前提:

  • 模型层DeepSeek-R1-Distill-Qwen-1.5B,加载路径/root/ds_1.5b,使用transformers+accelerate加载,device_map="auto"自动分配设备
  • 应用层:Streamlit Web 应用,主文件为app.py,通过st.chat_messagest.chat_input实现对话交互
  • 运行时:Python 3.10+,PyTorch 2.3+,CUDA 12.1(适配主流 NVIDIA 显卡)

这个结构干净、轻量,但缺少可观测性。我们要做的,不是改模型,也不是重写 UI,而是在不侵入业务逻辑的前提下,给它装上“仪表盘”

2.2 监控栈选型说明(为什么是 Prometheus + Grafana)

组件作用为什么选它
Prometheus时间序列数据库 + 数据抓取器轻量、纯拉取模式(无需在应用里开推送端口)、原生支持 Python 客户端、社区生态成熟
Grafana可视化看板工具免费开源、支持多种数据源、模板丰富、可一键导入预设看板
prometheus-client (Python)在 Streamlit 中暴露指标端点零配置嵌入、自动 HTTP metrics 端点(默认/metrics)、支持 Counter/Gauge/Histogram 多种类型

注意:我们不使用 Node Exporter 或 GPU Exporter——它们监控的是系统级 GPU 状态,但无法关联到“当前这次推理请求”。我们要的是应用级指标:比如“本次请求耗时 1.24s”、“本次推理显存峰值 3.1GB”,这样才能真正回答“模型性能瓶颈在哪”。

2.3 快速安装依赖(3 条命令搞定)

在你运行 Streamlit 的同一环境中执行:

pip install prometheus-client pip install psutil # 用于获取进程级 GPU 显存信息(需 nvidia-ml-py3 支持) pip install nvidia-ml-py3

注意:nvidia-ml-py3是 NVIDIA 提供的官方 Python 封装,比pynvml更稳定,且兼容 CUDA 12.x。如果提示权限错误,请加--user;如遇编译失败,可直接下载 wheel 安装:pip install https://download.pytorch.org/whl/cu121/nvidia_ml_py3-12.553.53-py3-none-manylinux1_x86_64.whl

安装完成后,验证是否可用:

python -c "import pynvml; pynvml.nvmlInit(); print(' NVML 初始化成功'); pynvml.nvmlShutdown()"

输出NVML 初始化成功即表示 GPU 监控底层已就绪。

3. 在 Streamlit 中嵌入监控指标埋点

3.1 修改app.py:添加指标定义与采集逻辑

打开你的app.py文件,在最顶部 import 区块下方插入以下代码(位置很关键,必须在import streamlit as st之后、st.set_page_config之前):

# --- 🔧 监控埋点初始化 --- from prometheus_client import Counter, Gauge, Histogram, start_http_server import psutil import time import threading # 定义指标(全局变量,确保单例) REQUEST_COUNT = Counter('ds15b_request_total', 'Total number of requests to DS1.5B') REQUEST_DURATION = Histogram('ds15b_request_duration_seconds', 'Request duration in seconds') GPU_MEMORY_USED = Gauge('ds15b_gpu_memory_used_bytes', 'GPU memory used in bytes', ['device']) GPU_UTILIZATION = Gauge('ds15b_gpu_utilization_percent', 'GPU utilization in percent', ['device']) ACTIVE_REQUESTS = Gauge('ds15b_active_requests', 'Number of currently active requests') # 启动 Prometheus metrics server(监听 9090 端口) start_http_server(9090) # ---

这段代码做了三件事:

  1. 定义了 5 个核心指标(请求总数、请求耗时、GPU 显存、GPU 利用率、并发请求数)
  2. 使用start_http_server(9090)开启一个独立 HTTP 服务,暴露/metrics端点
  3. 所有指标都带命名空间ds15b_,避免和其他服务冲突

小技巧:端口 9090 是 Prometheus 默认抓取端口,不冲突;若被占用,可改为9091,后续 Prometheus 配置同步修改即可。

3.2 在推理函数中注入耗时与显存统计

找到你执行模型生成的核心函数(通常类似generate_response()get_model_output()),在生成逻辑前后加入指标更新:

def generate_response(user_input: str) -> str: # 👇 开始计时 & 并发计数 REQUEST_COUNT.inc() ACTIVE_REQUESTS.inc() start_time = time.time() try: # 👇 获取 GPU 显存与利用率(仅在有 GPU 时执行) if torch.cuda.is_available(): handle = pynvml.nvmlDeviceGetHandleByIndex(0) mem_info = pynvml.nvmlDeviceGetMemoryInfo(handle) util = pynvml.nvmlDeviceGetUtilizationRates(handle) GPU_MEMORY_USED.labels(device='gpu0').set(mem_info.used) GPU_UTILIZATION.labels(device='gpu0').set(util.gpu) # 执行原始推理逻辑(保持不变) inputs = tokenizer.apply_chat_template( [{"role": "user", "content": user_input}], return_tensors="pt" ).to(model.device) output = model.generate( inputs, max_new_tokens=2048, temperature=0.6, top_p=0.95, do_sample=True, pad_token_id=tokenizer.eos_token_id, ) response = tokenizer.decode(output[0][inputs.shape[1]:], skip_special_tokens=True) # 👇 记录耗时 duration = time.time() - start_time REQUEST_DURATION.observe(duration) return response finally: # 👇 请求结束,释放并发计数 ACTIVE_REQUESTS.dec() # 👇 再次采集 GPU 状态(观察推理后显存是否释放) if torch.cuda.is_available(): handle = pynvml.nvmlDeviceGetHandleByIndex(0) mem_info = pynvml.nvmlDeviceGetMemoryInfo(handle) GPU_MEMORY_USED.labels(device='gpu0').set(mem_info.used)

关键说明:

  • try/finally确保无论推理成功或失败,并发计数都会正确减一
  • GPU_MEMORY_USEDGPU_UTILIZATION在推理前后各采一次,方便对比“推理峰值显存”
  • REQUEST_DURATION.observe(duration)是直方图类型,Prometheus 会自动分桶统计(如 0.1s、0.5s、1s、2s 等区间请求数)

3.3 启动时自动加载指标(可选但推荐)

app.py最底部、if __name__ == "__main__":之前,添加一个后台线程,每 2 秒主动刷新一次 GPU 状态(即使没请求,也能看到空闲时的基础负载):

def gpu_monitor_loop(): while True: if torch.cuda.is_available(): try: handle = pynvml.nvmlDeviceGetHandleByIndex(0) mem_info = pynvml.nvmlDeviceGetMemoryInfo(handle) util = pynvml.nvmlDeviceGetUtilizationRates(handle) GPU_MEMORY_USED.labels(device='gpu0').set(mem_info.used) GPU_UTILIZATION.labels(device='gpu0').set(util.gpu) except Exception as e: pass # 忽略临时异常,不影响主流程 time.sleep(2) # 启动监控线程(守护线程,随主程序退出) threading.Thread(target=gpu_monitor_loop, daemon=True).start()

这样,你的/metrics端点就始终有最新 GPU 数据,Grafana 看板不会出现“无数据”断点。

4. 部署 Prometheus 并配置抓取任务

4.1 下载并运行 Prometheus(单机轻量版)

访问 Prometheus 官网下载页,选择对应系统的二进制包(Linux amd64 推荐)。解压后进入目录:

# 创建配置文件 cat > prometheus.yml << 'EOF' global: scrape_interval: 5s evaluation_interval: 5s scrape_configs: - job_name: 'deepseek-15b' static_configs: - targets: ['localhost:9090'] metrics_path: '/metrics' EOF # 启动 Prometheus(后台运行) nohup ./prometheus --config.file=prometheus.yml --web.listen-address=":9090" > prometheus.log 2>&1 &

验证:打开浏览器访问http://localhost:9090/targets,应看到deepseek-15b状态为 UP;访问http://localhost:9090/metrics,应能看到以ds15b_开头的指标列表(如ds15b_request_total 12)。

4.2 配置关键抓取项说明

配置项说明
scrape_interval5s每 5 秒拉取一次指标,平衡实时性与开销
job_namedeepseek-15b任务名,后续 Grafana 查询时会用到
targets['localhost:9090']指向 Streamlit 暴露的 metrics 端点
metrics_path/metrics默认路径,与prometheus-client一致

无需额外配置远程写入或 Alertmanager——本教程聚焦基础可观测性,够用即止。

5. 搭建 Grafana 看板实现可视化

5.1 安装 Grafana(Docker 一键启动)

docker run -d \ -p 3000:3000 \ --name=grafana \ -v "$PWD/grafana-storage:/var/lib/grafana" \ -e "GF_SECURITY_ADMIN_PASSWORD=admin" \ grafana/grafana-enterprise:10.4.0

验证:浏览器访问http://localhost:3000,用账号admin/ 密码admin登录,首次登录会提示修改密码,可设为ds15b-monitor

5.2 添加 Prometheus 数据源

  1. 左侧菜单 →ConnectionsData sourcesAdd data source
  2. 搜索Prometheus→ 选择 → 填写 URL:http://host.docker.internal:9090(Mac/Win Docker Desktop)或http://172.17.0.1:9090(Linux Docker)

    Linux 用户如遇网络不通,可在宿主机运行ip addr show docker0查看 bridge IP,替换172.17.0.1

  3. 点击Save & test,显示Data source is working即成功。

5.3 导入预设看板(1 分钟完成)

我们为你准备了一个专为 DeepSeek-R1-Distill-Qwen-1.5B 优化的 Grafana 看板 JSON(含 6 个核心面板),直接导入:

  1. 左侧菜单 →DashboardsImport
  2. 点击Upload JSON file,选择以下内容保存为ds15b-dashboard.json后上传:
{ "dashboard": { "title": "DeepSeek-R1-Distill-Qwen-1.5B 运行监控", "panels": [ { "title": "QPS(每秒请求数)", "type": "stat", "targets": [{ "expr": "rate(ds15b_request_total[1m])" }] }, { "title": "平均请求耗时(P95)", "type": "stat", "targets": [{ "expr": "histogram_quantile(0.95, sum(rate(ds15b_request_duration_seconds_bucket[5m])) by (le))" }] }, { "title": "GPU 显存使用(GB)", "type": "gauge", "targets": [{ "expr": "ds15b_gpu_memory_used_bytes{device=\"gpu0\"} / 1024 / 1024 / 1024" }] }, { "title": "GPU 利用率(%)", "type": "gauge", "targets": [{ "expr": "ds15b_gpu_utilization_percent{device=\"gpu0\"}" }] }, { "title": "请求耗时分布", "type": "heatmap", "targets": [{ "expr": "sum by (le) (rate(ds15b_request_duration_seconds_bucket[5m]))" }] }, { "title": "并发请求数", "type": "timeseries", "targets": [{ "expr": "ds15b_active_requests" }] } ] } }

导入后,你会看到一个清爽的 2×3 看板,实时展示:

  • 当前 QPS 数值(如0.92
  • P95 耗时(如1.38s,表示 95% 请求在 1.38 秒内完成)
  • GPU 显存使用量(如3.21 GB
  • GPU 利用率(如68%
  • 耗时热力图(横轴时间、纵轴耗时区间、颜色深浅代表请求数量)
  • 并发请求数曲线(观察是否堆积)

所有面板均支持点击下钻、时间范围切换、全屏查看,无需任何额外配置。

6. 实战验证:用监控发现真实问题

现在,打开你的 Streamlit 对话界面,进行三组测试,观察看板变化:

6.1 测试 1:单次短请求(验证基础链路)

  • 输入:“你好”
  • 观察看板:QPS 瞬间跳至1ds15b_active_requests出现一个尖峰,ds15b_request_duration_seconds显示约0.3~0.6s,GPU 显存微升后回落
    结论:基础监控链路通,指标采集准确

6.2 测试 2:长思维链推理(定位性能瓶颈)

  • 输入:“请用中文详细推导一元二次方程求根公式的完整过程,要求每一步写出数学依据”
  • 观察看板:
    • ds15b_request_duration_secondsP95 跳至2.1s,热力图显示大量请求落在1.5~2.5s区间
    • ds15b_gpu_memory_used_bytes峰值达3.8GB(比“你好”高0.6GB
    • GPU 利用率维持在75~85%,未满载
      结论:长文本推理主要消耗显存与计算时间,但 GPU 仍有余量,可考虑提升max_new_tokens或启用flash_attention

6.3 测试 3:连续快速提问(检验稳定性)

  • 连续输入 5 个不同问题(如“写首诗”“解释量子纠缠”“Python 列表去重”…),间隔 < 2 秒
  • 观察看板:
    • ds15b_active_requests曲线出现多个重叠波峰,最高达3
    • QPS 稳定在0.8~1.0,未明显下降
    • GPU 显存未持续攀升,每次请求后回落至3.1GB左右
      结论:服务具备基本并发能力,显存管理有效,无内存泄漏迹象

进阶提示:若你发现ds15b_active_requests持续高于1且不回落,说明 Streamlit 会话未正确清理——检查st.session_state是否残留大对象,或torch.no_grad()是否生效。

7. 总结:你已掌握一套可落地的 AI 服务监控方法论

回看整个过程,你并没有改动模型权重、没有重写推理引擎、也没有引入复杂中间件。你只是:
在 Streamlit 应用里加了 20 行监控埋点代码
用 3 条命令装好 Prometheus 和 Grafana
通过一个 JSON 文件,1 分钟导入专业看板

这背后是一套轻量、安全、可复制的 AI 服务可观测性实践:

  • 轻量:总依赖仅 3 个 Python 包,Prometheus 二进制 100MB,Grafana Docker 镜像 300MB,对资源友好
  • 安全:所有组件本地运行,指标不出内网,/metrics端点默认无认证(如需加固,可加 Nginx Basic Auth)
  • 可复制:同一套prometheus.yml和看板 JSON,稍作修改即可用于 Qwen2-0.5B、Phi-3-mini 等任意轻量模型服务

更重要的是,你现在拥有了决策依据

  • 当用户反馈“响应变慢”,你不再靠猜,而是看 P95 耗时曲线
  • 当显存爆掉,你立刻知道是单次推理峰值过高,还是存在缓慢泄漏
  • 当想升级硬件,你清楚当前 GPU 利用率只有 60%,说明瓶颈可能在 CPU 或 PCIe 带宽

这才是工程化落地 AI 应用的第一步——让一切可衡量,才能持续优化。


获取更多AI镜像

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/16 2:08:40

小白也能玩转AI绘画:李慕婉造相模型快速入门指南

小白也能玩转AI绘画&#xff1a;李慕婉造相模型快速入门指南 1. 这不是遥不可及的黑科技&#xff0c;而是你马上就能用上的画笔 你有没有想过&#xff0c;不用学画画、不用装专业软件、甚至不用打开Photoshop&#xff0c;只要敲几行字&#xff0c;就能生成一张仙气飘飘的李慕…

作者头像 李华
网站建设 2026/3/27 1:31:37

英雄联盟助手:提升游戏效率的智能辅助工具

英雄联盟助手&#xff1a;提升游戏效率的智能辅助工具 【免费下载链接】LeagueAkari ✨兴趣使然的&#xff0c;功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari 作为一名英雄联盟玩家…

作者头像 李华
网站建设 2026/3/26 22:04:27

NCM音频格式转换工具使用教程:无损转换与批量处理完全指南

NCM音频格式转换工具使用教程&#xff1a;无损转换与批量处理完全指南 【免费下载链接】NCMconverter NCMconverter将ncm文件转换为mp3或者flac文件 项目地址: https://gitcode.com/gh_mirrors/nc/NCMconverter 告别网易云音乐NCM格式限制&#xff0c;让你的音乐自由播放…

作者头像 李华
网站建设 2026/3/25 15:36:30

小白必看!Qwen3-TTS语音克隆5分钟入门教程

小白必看&#xff01;Qwen3-TTS语音克隆5分钟入门教程 你是不是也想过&#xff0c;只用3秒录音&#xff0c;就能让AI模仿你的声音读出任意文字&#xff1f;不用专业设备、不装复杂环境、不调参数——今天这篇教程&#xff0c;就是为你准备的。我们用的是刚上线不久的 Qwen3-TT…

作者头像 李华