Phi-3-Mini-128K实操手册:如何监控GPU显存占用与推理吞吐量(含Prometheus集成)

张开发
2026/4/7 12:49:22 15 分钟阅读

分享文章

Phi-3-Mini-128K实操手册:如何监控GPU显存占用与推理吞吐量(含Prometheus集成)
Phi-3-Mini-128K实操手册如何监控GPU显存占用与推理吞吐量含Prometheus集成当你成功部署了Phi-3-Mini-128K对话工具看着它流畅地生成回答时一个很自然的问题会浮现在脑海它到底占用了多少显存推理速度有多快模型在后台是高效运行还是在“负重前行”对于任何在本地运行大模型的开发者来说监控都是不可或缺的一环。它不仅是了解系统健康状况的“仪表盘”更是优化性能、排查问题的“指南针”。本文将手把手带你为Phi-3-Mini-128K搭建一套从基础到进阶的监控体系让你对模型的资源消耗和推理能力了如指掌。1. 为什么需要监控Phi-3-Mini-128K在深入技术细节之前我们先搞清楚监控的价值。Phi-3-Mini-128K虽然以“轻量化”著称但在128K超长上下文下进行推理对显存和计算资源依然有相当的要求。几个典型的监控场景资源预警你的8GB显存显卡在加载模型后还剩多少能否支持更长的对话性能瓶颈分析为什么这次推理花了10秒而上次只用了2秒是输入太长还是系统有其他负载容量规划你想同时为多个用户提供服务需要多少GPU算力监控数据是扩容决策的核心依据。问题排查对话突然中断或响应极慢是模型崩溃了还是显存溢出了没有监控这些问题的排查就像在黑暗中摸索。接下来我们将从最简单的命令行工具开始逐步构建一个可视化的监控仪表盘。2. 基础监控使用命令行工具实时查看对于快速检查和临时诊断命令行工具是最直接有效的方式。我们主要使用nvidia-smi和psutil这两个利器。2.1 监控GPU显存与利用率NVIDIA显卡自带的nvidia-smi命令能提供最权威的GPU状态信息。打开你的终端输入以下命令可以每秒刷新一次GPU状态watch -n 1 nvidia-smi你会看到一个动态更新的表格重点关注这几列Memory-Usage当前显存使用量例如7856MiB / 8192MiB表示使用了7.8GB显卡总显存为8GB。GPU-UtilGPU计算核心的利用率百分比。如果模型正在生成文本这个值通常会显著升高。Volatile GPU-Util更精确的GPU利用率指标。如何为Phi-3-Mini-128K解读这些数据启动后静默显存加载完bfloat16精度的模型后显存占用通常在7-8GB左右取决于你的显卡。这是模型的“基础重量”。推理时动态增长当你开始对话尤其是处理长文本时Memory-Usage会随着计算图的展开和KV Cache的占用而上升。这是正常现象。GPU-Util波动发送请求时GPU-Util会瞬间飙升可能到80%-100%生成结束后回落。这反映了模型“计算-等待”的间歇性工作模式。2.2 监控系统内存与进程GPU监控之外系统内存和Python进程本身也值得关注。我们可以写一个简单的Python脚本来获取这些信息。创建一个名为monitor_basic.py的文件import psutil import time import subprocess import re def get_gpu_memory_usage(): 使用nvidia-smi获取GPU显存使用情况 try: result subprocess.run( [nvidia-smi, --query-gpumemory.used,memory.total, --formatcsv,noheader,nounits], capture_outputTrue, textTrue ) if result.returncode 0: # 输出格式如7856, 8192 match re.search(r(\d)\s*,\s*(\d), result.stdout) if match: used int(match.group(1)) total int(match.group(2)) return used, total except Exception as e: print(f获取GPU信息失败: {e}) return None, None def get_process_memory(pidNone): 获取当前Python进程的内存占用RSS if pid is None: pid psutil.Process().pid process psutil.Process(pid) memory_info process.memory_info() # 返回驻留集大小Resident Set Size单位MB return memory_info.rss / (1024 ** 2) def main(): print(开始基础资源监控 (按 CtrlC 退出)) print(时间戳 | GPU显存(MB) | 进程内存(MB) | 系统内存使用率(%)) print(- * 70) try: while True: # 获取GPU信息 gpu_used, gpu_total get_gpu_memory_usage() gpu_info f{gpu_used}/{gpu_total} if gpu_used else N/A # 获取进程内存 process_mem get_process_memory() # 获取系统内存 system_mem psutil.virtual_memory() system_usage system_mem.percent timestamp time.strftime(%H:%M:%S) print(f{timestamp} | {gpu_info:15} | {process_mem:13.1f} | {system_usage:20.1f}) time.sleep(2) # 每2秒采样一次 except KeyboardInterrupt: print(\n监控已停止。) if __name__ __main__: main()运行这个脚本你就能看到一个简单的实时监控台。它告诉你Phi-3进程占用了多少系统内存以及整个系统的内存压力情况。如果系统内存使用率持续高于90%可能需要警惕因为这会触发操作系统的Swap交换严重拖慢整体速度。3. 进阶监控集成Prometheus与Grafana实现可视化命令行工具适合临时查看但对于长期运行的服务我们需要一个能够历史回溯、可视化展示的监控系统。这里我们引入云原生监控领域的“黄金搭档”Prometheus数据采集与存储和Grafana数据可视化。3.1 设计监控指标Metrics首先我们需要明确要监控什么。对于Phi-3-Mini-128K推理服务我们定义以下几个核心指标phi3_gpu_memory_used_bytes: GPU显存使用量字节。这是最重要的资源指标。phi3_gpu_utilization_percent: GPU计算利用率百分比。反映GPU的忙碌程度。phi3_inference_request_duration_seconds: 推理请求耗时秒。记录从收到请求到返回结果的总时间。phi3_inference_tokens_per_second: 推理吞吐量Tokens/秒。衡量模型生成文本的效率。phi3_requests_total: 总请求数计数器。用于计算QPS每秒查询率。3.2 使用Prometheus Client暴露指标我们需要在Phi-3的Streamlit应用或你封装的API服务中集成prometheus_client库将上述指标暴露出来。首先安装必要的库pip install prometheus-client然后修改或创建你的Phi-3服务主文件例如app_with_metrics.py集成监控代码import streamlit as st from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline import torch from prometheus_client import start_http_server, Gauge, Counter, Histogram, Summary import time import threading # Prometheus Metrics 定义 # 定义指标 GPU_MEMORY_USED Gauge(phi3_gpu_memory_used_bytes, GPU memory used by Phi-3 model in bytes) GPU_UTILIZATION Gauge(phi3_gpu_utilization_percent, GPU utilization percentage) INFERENCE_DURATION Histogram(phi3_inference_request_duration_seconds, Duration of inference requests in seconds, buckets(0.1, 0.5, 1.0, 2.0, 5.0, 10.0, 30.0)) TOKENS_PER_SECOND Gauge(phi3_inference_tokens_per_second, Inference throughput in tokens per second) REQUESTS_TOTAL Counter(phi3_requests_total, Total number of inference requests) # 启动一个独立的HTTP服务器来暴露指标默认端口8000 def start_metrics_server(): start_http_server(8000) print(Prometheus metrics server started on port 8000) # 在后台线程中启动指标服务器 metrics_thread threading.Thread(targetstart_metrics_server, daemonTrue) metrics_thread.start() # Phi-3 模型加载与推理逻辑 st.cache_resource def load_model(): 加载Phi-3模型并设置监控初始值 model_id microsoft/Phi-3-mini-128k-instruct print(正在加载模型...) model AutoModelForCausalLM.from_pretrained( model_id, torch_dtypetorch.bfloat16, device_mapauto, trust_remote_codeTrue ) tokenizer AutoTokenizer.from_pretrained(model_id, trust_remote_codeTrue) pipe pipeline( text-generation, modelmodel, tokenizertokenizer, max_new_tokens512, do_sampleTrue, temperature0.7, top_p0.9, ) # 模型加载后尝试获取初始GPU内存可能需要通过其他方式此处为示例 # 在实际中你可能需要调用nvidia-smi或pynvml来获取 # 这里我们设置一个初始值或通过一个后台线程定期更新 GPU_MEMORY_USED.set(7.5 * 1024**3) # 假设初始占用7.5GB转换为字节 print(模型加载成功) return pipe # 初始化模型 pipe load_model() # Streamlit 应用界面 st.title(Phi-3-Mini-128K 对话工具 (带监控)) # 初始化对话历史 if messages not in st.session_state: st.session_state.messages [] # 显示历史消息 for message in st.session_state.messages: with st.chat_message(message[role]): st.markdown(message[content]) # 聊天输入 if prompt : st.chat_input(请输入您的问题): # 用户消息 with st.chat_message(user): st.markdown(prompt) st.session_state.messages.append({role: user, content: prompt}) # 助手回复 with st.chat_message(assistant): message_placeholder st.empty() message_placeholder.markdown(Phi-3 正在飞速思考...) # 记录推理开始时间 start_time time.time() # 构建对话格式使用pipeline自动处理 full_prompt pipe.tokenizer.apply_chat_template( st.session_state.messages, tokenizeFalse, add_generation_promptTrue ) # 执行推理 outputs pipe( full_prompt, max_new_tokens512, do_sampleTrue, temperature0.7, top_p0.9, ) response outputs[0][generated_text][len(full_prompt):].strip() # 记录推理结束时间计算耗时和吞吐量 end_time time.time() duration end_time - start_time # 计算生成的token数量近似值 # 注意更精确的做法是使用tokenizer统计outputs中的token数 approx_tokens len(response.split()) * 1.3 # 粗略估算 tokens_per_sec approx_tokens / duration if duration 0 else 0 # 更新Prometheus指标 INFERENCE_DURATION.observe(duration) TOKENS_PER_SECOND.set(tokens_per_sec) REQUESTS_TOTAL.inc() # 更新响应内容包含简单的监控信息 final_response f{response}\n\n---\n*本次推理耗时: {duration:.2f}秒 | 生成速度: {tokens_per_sec:.1f} tokens/秒* message_placeholder.markdown(final_response) st.session_state.messages.append({role: assistant, content: response}) # 在侧边栏显示实时监控数据示例 with st.sidebar: st.header(实时监控) st.metric(label总请求数, valueREQUESTS_TOTAL._value.get()) # 注意GPU内存和利用率需要额外线程定期更新这里仅作展示 st.write(访问 http://localhost:8000 查看完整Prometheus指标)这个增强版的应用做了几件事启动了一个独立的HTTP服务器端口8000用于暴露Prometheus格式的指标。定义了5个核心监控指标。在每次推理请求时记录耗时、计算吞吐量并更新计数器。在Streamlit侧边栏展示了简单的监控数据。启动这个应用后除了原来的聊天界面你还可以通过访问http://localhost:8000看到所有监控指标的原始数据。3.3 配置Prometheus抓取数据接下来我们需要配置Prometheus服务器来定期抓取我们应用暴露的指标。安装Prometheus从官网下载对应版本或使用Docker。配置prometheus.yml在Prometheus的配置文件中添加一个抓取任务。# prometheus.yml global: scrape_interval: 15s # 每15秒抓取一次数据 scrape_configs: - job_name: phi-3-monitoring static_configs: - targets: [localhost:8000] # 你的Streamlit应用暴露指标的地址 metrics_path: / # 指标暴露的路径默认为根路径启动Prometheus./prometheus --config.fileprometheus.yml现在Prometheus会每15秒访问一次http://localhost:8000拉取并存储所有监控指标。3.4 使用Grafana创建炫酷仪表盘有了数据最后一步就是可视化。Grafana是完成这一步的最佳工具。安装并启动Grafana。添加数据源在Grafana界面中添加Prometheus作为数据源地址为http://localhost:9090Prometheus默认端口。创建仪表盘新建一个Dashboard然后添加面板Panel。以下是一些核心面板的配置建议面板1GPU显存占用趋势图查询语句phi3_gpu_memory_used_bytes / (1024^3)转换为GB显示可视化Time series graph标题GPU显存使用量 (GB)阈值线可以添加一条你显卡总显存如8GB的参考线。面板2推理请求耗时分布查询语句rate(phi3_inference_request_duration_seconds_sum[5m]) / rate(phi3_inference_request_duration_seconds_count[5m])可视化Time series graph标题平均推理延迟 (秒)说明这个公式计算的是平均耗时。你还可以直接用直方图来查看耗时的分布情况。面板3推理吞吐量 (Tokens/Second)查询语句phi3_inference_tokens_per_second可视化Stat 或 Time series graph标题实时推理吞吐量单位tokens/s面板4请求速率 (QPS)查询语句rate(phi3_requests_total[5m])可视化Time series graph标题请求速率 (QPS)面板5系统状态概览创建一个Stat面板显示最新的phi3_gpu_memory_used_bytes、phi3_gpu_utilization_percent和phi3_requests_total值。将这些面板合理排列你就能得到一个功能强大、一目了然的Phi-3推理服务监控仪表盘。你可以清晰地看到显存使用是否随着对话轮数增加而缓慢增长可能存在的内存泄漏。在高峰期推理延迟是否显著增加。模型的平均吞吐量是多少是否达到预期。4. 总结从监控到洞察与优化通过本文的步骤你为Phi-3-Mini-128K搭建了一套从基础到生产的监控体系。让我们回顾一下关键收获基础监控是起点nvidia-smi和自定义脚本能快速回答“现在怎么样了”的问题适合开发和调试阶段。PrometheusGrafana是专业之选它们提供了历史数据存储、强大的查询语言PromQL和丰富的可视化能力是服务长期稳定运行的基石。监控指标是核心我们定义了显存、利用率、延迟、吞吐量、请求数这五个黄金指标它们基本覆盖了服务性能与健康度的所有关键维度。监控的最终目的不是看数据而是驱动决策和优化。当你拥有这些数据后可以设置告警在Grafana中设置规则当显存使用超过95%或平均延迟超过5秒时通过邮件、Slack等渠道通知你。性能调优发现吞吐量偏低时可以尝试调整max_new_tokens、batch_size如果支持等参数或检查是否有CPU瓶颈、IO等待。容量规划根据历史QPS和资源使用率精确计算出需要多少GPU实例才能满足预期的用户访问量。监控让Phi-3-Mini-128K从一个黑盒变成了一个透明的、可观测、可优化的系统。现在你不仅可以愉快地使用它还能真正地理解和管理它。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章