Phi-4-mini-reasoning模型服务监控方案:Prometheus+Grafana实战
Phi-4-mini-reasoning模型服务监控方案:Prometheus+Grafana实战
如果你正在用Phi-4-mini-reasoning这类推理模型做实际应用,有没有遇到过这样的场景:半夜突然收到用户反馈说服务响应变慢了,但你完全不知道是什么时候开始的,也不知道是哪个环节出了问题。或者更糟,服务直接挂了,你只能凭感觉去猜是GPU内存不够了,还是推理请求太多了。
这种“盲人摸象”的感觉,相信很多做模型部署的朋友都经历过。模型跑起来只是第一步,真正让它稳定可靠地服务用户,才是更大的挑战。今天我就来分享一套完整的监控方案,用Prometheus+Grafana这两个开源工具,帮你把Phi-4-mini-reasoning服务的运行状态看得清清楚楚。
1. 为什么模型服务需要监控?
你可能觉得,模型能正常返回结果不就行了吗?干嘛还要搞监控这么麻烦。但实际情况是,没有监控的服务就像没有仪表盘的汽车——你只知道车在跑,但不知道油还剩多少、发动机温度多高、车速是多少。
对于Phi-4-mini-reasoning这样的推理服务,有几个关键指标你肯定想知道:
- 推理延迟:用户等一个回答要多久?是稳定的几秒钟,还是偶尔会飙到几十秒?
- GPU利用率:你的显卡真的在全力工作吗?还是大部分时间在“摸鱼”?
- 内存使用:模型加载后占了多少显存?会不会因为内存泄漏导致服务崩溃?
- 请求量:现在有多少人在用你的服务?高峰期是什么时候?
- 错误率:有多少请求失败了?失败的原因是什么?
有了这些数据,你就能提前发现问题。比如看到GPU利用率持续在90%以上,就知道该考虑扩容了;看到错误率突然升高,就能立刻排查是不是模型文件损坏了。
2. 监控方案整体设计
我们的方案很简单,就三个核心组件:
- 数据采集:在Phi-4-mini-reasoning服务里埋点,收集各种指标数据
- 数据存储:用Prometheus定时拉取并存储这些指标
- 数据展示:用Grafana把数据变成直观的图表和仪表盘
整个流程就像工厂的生产线监控:传感器(埋点)收集数据,记录仪(Prometheus)存储数据,监控大屏(Grafana)展示数据。
2.1 需要监控哪些指标?
针对Phi-4-mini-reasoning服务,我建议重点关注这几类指标:
性能指标
- 推理延迟(从收到请求到返回结果的时间)
- 每秒处理的请求数(QPS)
- 并发请求数
资源指标
- GPU利用率(百分比)
- GPU内存使用量
- 系统内存使用量
- CPU使用率
业务指标
- 总请求数
- 成功/失败请求数
- 各错误类型的数量
模型特定指标
- 输入token数量
- 输出token数量
- 推理步数(对于多步推理特别有用)
3. 环境准备与部署
3.1 安装Prometheus
Prometheus的安装很简单,我们直接用Docker来跑:
# 创建配置文件目录
mkdir -p /opt/prometheus/config
# 创建Prometheus配置文件
cat > /opt/prometheus/config/prometheus.yml << 'EOF'
global:
scrape_interval: 15s # 每15秒采集一次数据
evaluation_interval: 15s
scrape_configs:
- job_name: 'phi4-mini-reasoning'
static_configs:
- targets: ['host.docker.internal:8000'] # 你的模型服务地址
metrics_path: '/metrics' # 指标暴露的路径
- job_name: 'node-exporter'
static_configs:
- targets: ['host.docker.internal:9100'] # 系统指标采集器
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
EOF
# 启动Prometheus容器
docker run -d \
--name=prometheus \
-p 9090:9090 \
-v /opt/prometheus/config:/etc/prometheus \
prom/prometheus
启动后,访问 http://你的服务器IP:9090 就能看到Prometheus的界面了。
3.2 安装Grafana
Grafana同样用Docker部署:
# 创建数据目录
mkdir -p /opt/grafana/data
# 启动Grafana容器
docker run -d \
--name=grafana \
-p 3000:3000 \
-v /opt/grafana/data:/var/lib/grafana \
grafana/grafana
默认账号密码都是 admin,第一次登录会要求修改密码。
3.3 安装Node Exporter(可选)
如果你想监控服务器本身的资源使用情况(CPU、内存、磁盘等),可以安装Node Exporter:
docker run -d \
--name=node-exporter \
-p 9100:9100 \
--net="host" \
--pid="host" \
quay.io/prometheus/node-exporter
4. 为Phi-4-mini-reasoning服务添加监控
假设你的Phi-4-mini-reasoning服务是用Python Flask写的,下面是一个简单的示例,展示如何添加监控埋点。
4.1 安装必要的Python库
pip install prometheus-client psutil pynvml
prometheus-client 是用来暴露指标的,psutil 用来获取系统资源信息,pynvml 用来获取GPU信息。
4.2 创建监控中间件
在你的Flask应用里添加一个监控模块:
# monitoring.py
from prometheus_client import Counter, Gauge, Histogram, generate_latest, REGISTRY
from prometheus_client.exposition import make_wsgi_app
from werkzeug.middleware.dispatcher import DispatcherMiddleware
import psutil
import pynvml
import time
from threading import Thread
import time as time_module
# 初始化GPU监控(如果有GPU的话)
try:
pynvml.nvmlInit()
gpu_count = pynvml.nvmlDeviceGetCount()
HAS_GPU = True
except:
HAS_GPU = False
gpu_count = 0
# 定义监控指标
# 请求相关指标
REQUEST_COUNT = Counter(
'phi4_requests_total',
'Total number of requests',
['method', 'endpoint', 'status']
)
REQUEST_LATENCY = Histogram(
'phi4_request_duration_seconds',
'Request latency in seconds',
['endpoint']
)
# 资源使用指标
GPU_UTILIZATION = Gauge('phi4_gpu_utilization_percent', 'GPU utilization percentage', ['gpu_id'])
GPU_MEMORY_USED = Gauge('phi4_gpu_memory_used_mb', 'GPU memory used in MB', ['gpu_id'])
GPU_MEMORY_TOTAL = Gauge('phi4_gpu_memory_total_mb', 'GPU total memory in MB', ['gpu_id'])
# 模型推理指标
INPUT_TOKENS = Counter('phi4_input_tokens_total', 'Total input tokens processed')
OUTPUT_TOKENS = Counter('phi4_output_tokens_total', 'Total output tokens generated')
INFERENCE_STEPS = Counter('phi4_inference_steps_total', 'Total inference steps')
# 错误指标
ERROR_COUNT = Counter('phi4_errors_total', 'Total number of errors', ['error_type'])
class ResourceMonitor(Thread):
"""后台线程,定期收集资源使用情况"""
def __init__(self, interval=5):
super().__init__(daemon=True)
self.interval = interval
def run(self):
while True:
try:
# 收集系统资源
cpu_percent = psutil.cpu_percent(interval=None)
memory = psutil.virtual_memory()
# 如果有GPU,收集GPU信息
if HAS_GPU:
for i in range(gpu_count):
handle = pynvml.nvmlDeviceGetHandleByIndex(i)
util = pynvml.nvmlDeviceGetUtilizationRates(handle)
memory_info = pynvml.nvmlDeviceGetMemoryInfo(handle)
GPU_UTILIZATION.labels(gpu_id=str(i)).set(util.gpu)
GPU_MEMORY_USED.labels(gpu_id=str(i)).set(memory_info.used / 1024 / 1024)
GPU_MEMORY_TOTAL.labels(gpu_id=str(i)).set(memory_info.total / 1024 / 1024)
except Exception as e:
print(f"Error collecting resource metrics: {e}")
time_module.sleep(self.interval)
def setup_monitoring(app):
"""设置应用监控"""
# 启动资源监控线程
monitor = ResourceMonitor()
monitor.start()
# 添加请求监控中间件
@app.before_request
def before_request():
request.start_time = time.time()
@app.after_request
def after_request(response):
# 记录请求延迟
if hasattr(request, 'start_time'):
latency = time.time() - request.start_time
REQUEST_LATENCY.labels(endpoint=request.path).observe(latency)
# 记录请求计数
REQUEST_COUNT.labels(
method=request.method,
endpoint=request.path,
status=response.status_code
).inc()
return response
# 添加/metrics端点
@app.route('/metrics')
def metrics():
return generate_latest(REGISTRY)
return app
def record_inference_metrics(input_tokens=0, output_tokens=0, steps=0):
"""记录推理相关的指标"""
if input_tokens > 0:
INPUT_TOKENS.inc(input_tokens)
if output_tokens > 0:
OUTPUT_TOKENS.inc(output_tokens)
if steps > 0:
INFERENCE_STEPS.inc(steps)
def record_error(error_type):
"""记录错误"""
ERROR_COUNT.labels(error_type=error_type).inc()
4.3 在模型服务中使用监控
在你的主应用文件中这样使用:
# app.py
from flask import Flask, request, jsonify
from monitoring import setup_monitoring, record_inference_metrics, record_error
import ollama
import time
app = Flask(__name__)
# 设置监控
app = setup_monitoring(app)
@app.route('/api/chat', methods=['POST'])
def chat():
try:
data = request.json
prompt = data.get('prompt', '')
# 记录输入token数(这里需要根据实际tokenizer计算)
# 简单估算:英文大约1个token对应0.75个单词
input_tokens = len(prompt.split()) * 0.75
start_time = time.time()
# 调用Phi-4-mini-reasoning模型
response = ollama.chat(
model='phi4-mini-reasoning',
messages=[{'role': 'user', 'content': prompt}],
)
latency = time.time() - start_time
# 记录输出token数
output_text = response['message']['content']
output_tokens = len(output_text.split()) * 0.75
# 记录推理指标
# 注意:实际推理步数需要从模型返回中获取,这里用1作为示例
record_inference_metrics(
input_tokens=int(input_tokens),
output_tokens=int(output_tokens),
steps=1
)
return jsonify({
'response': output_text,
'latency': latency,
'input_tokens': int(input_tokens),
'output_tokens': int(output_tokens)
})
except Exception as e:
# 记录错误
record_error(str(type(e).__name__))
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000, debug=False)
4.4 配置Prometheus抓取
修改之前创建的Prometheus配置文件,确保它能找到你的服务:
# /opt/prometheus/config/prometheus.yml
scrape_configs:
- job_name: 'phi4-mini-reasoning'
static_configs:
- targets: ['你的服务器IP:8000'] # 改成实际IP
scrape_interval: 10s # 每10秒采集一次
metrics_path: '/metrics'
重启Prometheus容器让配置生效:
docker restart prometheus
5. 配置Grafana仪表盘
现在数据已经采集并存储到Prometheus了,接下来我们用Grafana来可视化这些数据。
5.1 添加数据源
- 登录Grafana(
http://你的服务器IP:3000) - 点击左侧菜单的 Connections → Data sources
- 点击 Add data source,选择 Prometheus
- 在URL处填写
http://你的服务器IP:9090 - 点击 Save & test,应该显示"Data source is working"
5.2 导入预制的仪表盘
Grafana社区有很多现成的仪表盘模板,我们可以找一个适合的来修改。这里我推荐使用Node Exporter的仪表盘作为基础。
- 点击左侧菜单的 Dashboards → New → Import
- 输入仪表盘ID
1860(Node Exporter Full) - 选择刚才添加的Prometheus数据源
- 点击 Import
5.3 创建自定义的模型监控面板
Node Exporter的仪表盘主要监控系统资源,我们还需要添加专门针对Phi-4-mini-reasoning的监控面板。
创建请求监控面板
- 在仪表盘页面点击右上角的 Add → Add new panel
- 在Metrics浏览器中输入:
rate(phi4_requests_total[5m]) - 设置面板标题为"请求速率(QPS)"
- 在Legend处输入:
{{method}} {{endpoint}} - 点击右上角的 Apply
创建延迟监控面板
- 同样添加新面板
- Metrics输入:
histogram_quantile(0.95, rate(phi4_request_duration_seconds_bucket[5m])) - 标题设为"95%请求延迟"
- 单位选择"seconds"
- 点击 Apply
创建GPU监控面板
- 添加新面板
- Metrics输入:
phi4_gpu_utilization_percent - 标题设为"GPU利用率"
- 单位选择"percent"
- 点击 Apply
创建Token统计面板
- 添加新面板
- Metrics输入:
rate(phi4_input_tokens_total[5m]) - 点击 + Query 添加第二个查询:
rate(phi4_output_tokens_total[5m]) - 标题设为"Token处理速率"
- 点击 Apply
5.4 最终仪表盘布局
一个完整的模型服务监控仪表盘应该包含以下几个部分:
- 概览区域:显示当前QPS、平均延迟、错误率等关键指标
- 性能监控:请求延迟分布图、QPS趋势图
- 资源监控:GPU利用率、GPU内存使用、CPU使用率
- 业务监控:输入输出Token统计、推理步数
- 错误监控:各类错误的数量和趋势
你可以根据自己的需求调整面板的位置和大小,Grafana的拖拽式编辑非常方便。
6. 实际使用中的技巧与建议
6.1 设置告警规则
监控不只是为了看,更是为了及时发现问题。Grafana支持设置告警规则,当指标异常时通过邮件、Slack、钉钉等方式通知你。
比如设置这些告警:
- GPU内存使用超过90%:可能很快会OOM(内存溢出)
- 平均延迟超过10秒:用户体验会变差
- 错误率超过5%:服务可能出现了严重问题
- 连续5分钟无请求:服务可能挂了
设置方法:在面板编辑界面,点击 Alert 标签,配置告警条件和通知渠道。
6.2 监控数据的保留策略
Prometheus默认只保留15天的数据,对于长期趋势分析可能不够。你可以:
- 调整保留时间:启动Prometheus时加上
--storage.tsdb.retention.time=90d参数 - 使用长期存储:将数据定期备份到对象存储(如S3)
- 降采样存储:旧数据用较低精度保存,节省空间
6.3 性能优化建议
监控系统本身也会消耗资源,特别是当你的服务QPS很高时。几个优化建议:
- 调整采集频率:非关键指标可以降低采集频率(比如从15秒改为60秒)
- 使用采样:对于Histogram类型的指标,可以适当减少bucket数量
- 分离监控实例:将Prometheus和Grafana部署在单独的服务器上
- 清理旧指标:定期清理不再使用的指标定义
6.4 针对Phi-4-mini-reasoning的特殊监控
Phi-4-mini-reasoning是一个专门用于复杂推理的模型,有些特殊的指标值得关注:
- 推理步数监控:记录每个请求的实际推理步数,分析不同复杂度问题的资源消耗
- 缓存命中率:如果使用了推理结果缓存,监控缓存命中率可以优化性能
- 模型加载时间:监控模型热加载、冷启动的时间
- 量化版本对比:如果你尝试了不同的量化版本(如Q4_K_M、Q8_0),可以对比它们的性能差异
7. 总结
给Phi-4-mini-reasoning这样的模型服务加上监控,就像给汽车装上了仪表盘和行车记录仪。你不仅能实时了解服务的运行状态,还能在出现问题时有据可查,快速定位原因。
这套Prometheus+Grafana的方案虽然需要一些初始配置,但一旦搭建起来,就能为你节省大量的排查时间。更重要的是,它能帮你建立对服务性能的直觉——看到某个指标的变化,你就能大概猜到背后发生了什么。
实际用下来,最大的感受就是“心里有底”了。以前服务出问题只能靠猜,现在打开Grafana仪表盘,所有指标一目了然。特别是设置了告警之后,很多问题都能在用户反馈之前被发现和解决。
如果你刚开始接触模型服务监控,建议先从最核心的几个指标开始:延迟、错误率、GPU使用率。等熟悉了再逐步添加更多维度的监控。监控系统本身也需要“迭代开发”,根据实际运行中遇到的问题不断调整和完善。
最后提醒一点,监控数据也是敏感数据,记得做好权限控制,不要暴露给不相关的人。特别是如果你的服务处理的是用户数据,更要确保监控系统不会泄露隐私信息。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐




所有评论(0)