SiameseUniNLU部署教程:Prometheus+Grafana监控指标接入(QPS/延迟/显存/错误率)

SiameseUniNLU部署教程:Prometheus+Grafana监控指标接入(QPS/延迟/显存/错误率) SiameseUniNLU部署教程PrometheusGrafana监控指标接入QPS/延迟/显存/错误率1. 引言当你把SiameseUniNLU这个强大的通用自然语言理解模型部署到服务器上让它开始处理各种文本分析任务时心里可能会冒出几个问题现在有多少人在用我的服务每次请求处理得快不快模型占用了多少显存有没有请求处理失败了这些问题如果靠人工盯着日志看不仅效率低还容易错过关键信息。今天我就带你一步步给SiameseUniNLU服务装上“仪表盘”用PrometheusGrafana这套业界标准的监控组合实时掌握服务的运行状态。学完这篇教程你就能像看汽车仪表盘一样一眼看清服务的QPS每秒查询率、响应延迟、GPU显存使用率和错误率等关键指标。2. 监控方案设计2.1 为什么选择PrometheusGrafana在开始动手之前我们先简单了解一下这套监控方案为什么适合SiameseUniNLU服务。Prometheus是一个开源的监控系统和时序数据库专门为收集和存储时间序列数据而设计。它通过“拉取”的方式从你的应用获取指标数据然后存储起来。Grafana则是一个强大的数据可视化平台它能从Prometheus读取数据然后生成各种漂亮的图表和仪表盘。这套组合有几个明显的优势开源免费完全免费使用社区活跃配置简单相比其他监控方案部署和配置相对容易可视化强大Grafana的图表非常美观而且支持自定义生态丰富有大量的现成仪表盘模板可以直接使用2.2 我们要监控哪些指标对于SiameseUniNLU这样的AI推理服务我们需要重点关注以下几类指标性能指标QPSQueries Per Second每秒处理的请求数反映服务吞吐量请求延迟Latency从收到请求到返回响应的耗时包括P50、P90、P95、P99等分位数请求处理时间Processing Time模型实际推理的耗时资源指标GPU显存使用率模型推理时占用的显存大小GPU利用率GPU计算核心的忙碌程度CPU使用率CPU的负载情况内存使用率系统内存的占用情况业务指标请求总数Total Requests累计处理的请求数量成功请求数Successful Requests处理成功的请求数量错误请求数Error Requests处理失败的请求数量错误率Error Rate错误请求占总请求的比例服务健康指标服务可用性Service Availability服务是否正常运行服务运行时间Uptime服务持续运行的时间3. 环境准备与部署3.1 基础环境检查在开始部署监控系统之前我们先确认一下基础环境。假设你已经按照之前的教程部署好了SiameseUniNLU服务。# 检查SiameseUniNLU服务是否正常运行 curl http://localhost:7860/health # 检查Python环境 python3 --version # 检查pip版本 pip3 --version # 检查Docker如果使用Docker部署 docker --version如果SiameseUniNLU服务还没有部署你可以先按照以下命令快速启动# 进入模型目录 cd /root/nlp_structbert_siamese-uninlu_chinese-base # 启动服务后台运行 nohup python3 app.py server.log 21 # 检查服务是否启动成功 sleep 3 curl http://localhost:7860/health3.2 安装PrometheusPrometheus的安装有多种方式这里我们选择使用Docker方式这样最方便也最干净。# 创建Prometheus配置文件目录 mkdir -p /opt/prometheus cd /opt/prometheus # 创建Prometheus配置文件 cat prometheus.yml EOF global: scrape_interval: 15s # 每15秒采集一次数据 evaluation_interval: 15s # 每15秒评估一次规则 # 告警规则配置可选 rule_files: # - first_rules.yml # - second_rules.yml # 告警管理器配置可选 alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # 数据采集配置 scrape_configs: # Prometheus自身监控 - job_name: prometheus static_configs: - targets: [localhost:9090] # SiameseUniNLU服务监控 - job_name: siamese-uninlu static_configs: - targets: [host.docker.internal:8000] # 监控服务地址 metrics_path: /metrics # 指标端点路径 scrape_interval: 10s # 每10秒采集一次 EOF # 使用Docker运行Prometheus docker run -d \ --nameprometheus \ -p 9090:9090 \ -v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \ prom/prometheus # 检查Prometheus是否运行正常 docker ps | grep prometheus等待几秒钟后你可以在浏览器中访问http://你的服务器IP:9090如果能看到Prometheus的Web界面说明安装成功了。3.3 安装GrafanaGrafana同样使用Docker方式安装这样最方便。# 创建Grafana数据目录 mkdir -p /opt/grafana/data chmod 777 /opt/grafana/data # 使用Docker运行Grafana docker run -d \ --namegrafana \ -p 3000:3000 \ -v /opt/grafana/data:/var/lib/grafana \ grafana/grafana # 检查Grafana是否运行正常 docker ps | grep grafanaGrafana启动后访问http://你的服务器IP:3000默认用户名和密码都是admin。首次登录会要求修改密码。3.4 为SiameseUniNLU添加指标暴露现在我们需要修改SiameseUniNLU的服务代码让它能够暴露监控指标。Prometheus通过HTTP端点来收集指标数据所以我们需要在服务中添加一个/metrics端点。首先安装必要的Python包pip install prometheus_client psutil pynvmlprometheus_clientPrometheus的Python客户端库psutil用于获取系统资源信息CPU、内存等pynvml用于获取GPU信息如果服务器有GPU接下来我们需要修改SiameseUniNLU的服务代码。找到app.py文件在合适的位置添加监控相关的代码# 在文件开头添加导入 from prometheus_client import Counter, Histogram, Gauge, generate_latest, CONTENT_TYPE_LATEST import psutil import time from functools import wraps import threading import json # 初始化Prometheus指标 # 请求相关指标 REQUEST_COUNT Counter(siamese_uninlu_requests_total, Total number of requests) REQUEST_LATENCY Histogram(siamese_uninlu_request_latency_seconds, Request latency in seconds) REQUEST_ERRORS Counter(siamese_uninlu_request_errors_total, Total number of request errors) # 资源使用指标 GPU_MEMORY_USAGE Gauge(siamese_uninlu_gpu_memory_usage_bytes, GPU memory usage in bytes) GPU_UTILIZATION Gauge(siamese_uninlu_gpu_utilization_percent, GPU utilization percentage) CPU_USAGE Gauge(siamese_uninlu_cpu_usage_percent, CPU usage percentage) MEMORY_USAGE Gauge(siamese_uninlu_memory_usage_bytes, Memory usage in bytes) # 模型相关指标 MODEL_LOAD_TIME Gauge(siamese_uninlu_model_load_time_seconds, Model loading time in seconds) MODEL_INFERENCE_TIME Histogram(siamese_uninlu_model_inference_time_seconds, Model inference time in seconds) # 尝试导入pynvml获取GPU信息 try: import pynvml pynvml.nvmlInit() HAS_GPU True GPU_HANDLE pynvml.nvmlDeviceGetHandleByIndex(0) # 假设使用第一个GPU except ImportError: HAS_GPU False print(pynvml not installed, GPU metrics will not be available) except Exception as e: HAS_GPU False print(fFailed to initialize GPU monitoring: {e}) def update_system_metrics(): 更新系统资源指标 # 更新CPU使用率 cpu_percent psutil.cpu_percent(intervalNone) CPU_USAGE.set(cpu_percent) # 更新内存使用率 memory_info psutil.virtual_memory() MEMORY_USAGE.set(memory_info.used) # 更新GPU指标如果可用 if HAS_GPU: try: # GPU内存使用 gpu_memory_info pynvml.nvmlDeviceGetMemoryInfo(GPU_HANDLE) GPU_MEMORY_USAGE.set(gpu_memory_info.used) # GPU利用率 gpu_utilization pynvml.nvmlDeviceGetUtilizationRates(GPU_HANDLE) GPU_UTILIZATION.set(gpu_utilization.gpu) except Exception as e: print(fFailed to get GPU metrics: {e}) # 10秒后再次更新 threading.Timer(10.0, update_system_metrics).start() # 启动系统指标更新线程 update_system_metrics_thread threading.Thread(targetupdate_system_metrics, daemonTrue) update_system_metrics_thread.start() def monitor_request(func): 请求监控装饰器 wraps(func) def wrapper(*args, **kwargs): # 记录请求开始时间 start_time time.time() # 增加请求计数 REQUEST_COUNT.inc() try: # 调用原始函数 result func(*args, **kwargs) # 记录请求延迟 latency time.time() - start_time REQUEST_LATENCY.observe(latency) return result except Exception as e: # 记录错误 REQUEST_ERRORS.inc() raise e return wrapper # 在Flask应用中添加/metrics端点 app.route(/metrics) def metrics(): Prometheus指标端点 return generate_latest(), 200, {Content-Type: CONTENT_TYPE_LATEST} # 在预测接口上添加监控装饰器 app.route(/api/predict, methods[POST]) monitor_request def predict(): # 原有的预测逻辑 # ... 这里是你原有的预测代码 ... # 在模型推理前后记录时间 inference_start time.time() # 模型推理代码 result model.predict(text, schema) inference_time time.time() - inference_start # 记录模型推理时间 MODEL_INFERENCE_TIME.observe(inference_time) return jsonify(result) # 添加健康检查端点可选但推荐 app.route(/health) def health(): 健康检查端点 return jsonify({ status: healthy, timestamp: time.time(), service: SiameseUniNLU })修改完成后重启SiameseUniNLU服务# 停止原有服务 pkill -f app.py # 启动新服务 cd /root/nlp_structbert_siamese-uninlu_chinese-base nohup python3 app.py server.log 21 # 检查服务是否正常 sleep 3 curl http://localhost:7860/health curl http://localhost:7860/metrics如果一切正常访问/metrics端点应该能看到Prometheus格式的指标数据。4. 配置数据采集与可视化4.1 配置Prometheus采集目标现在我们需要告诉Prometheus去哪里采集SiameseUniNLU的指标数据。编辑Prometheus的配置文件# 编辑Prometheus配置文件 cd /opt/prometheus # 备份原配置 cp prometheus.yml prometheus.yml.backup # 创建新的配置文件 cat prometheus.yml EOF global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: # Prometheus自身监控 - job_name: prometheus static_configs: - targets: [localhost:9090] # SiameseUniNLU服务监控 - job_name: siamese-uninlu static_configs: - targets: [你的服务器IP:7860] # 修改为你的实际IP metrics_path: /metrics scrape_interval: 10s honor_labels: true # 节点监控系统资源 - job_name: node static_configs: - targets: [你的服务器IP:9100] # Node Exporter的地址 EOF注意上面的配置中需要将你的服务器IP替换为实际的服务器IP地址。重启Prometheus使配置生效# 重启Prometheus容器 docker restart prometheus # 检查配置是否生效 docker logs prometheus --tail 204.2 安装Node Exporter可选但推荐Node Exporter是Prometheus官方提供的系统指标采集器可以采集CPU、内存、磁盘、网络等系统级指标。虽然我们的SiameseUniNLU服务已经暴露了一些系统指标但Node Exporter提供的信息更全面。# 使用Docker运行Node Exporter docker run -d \ --namenode-exporter \ --nethost \ --pidhost \ -v /:/host:ro,rslave \ quay.io/prometheus/node-exporter:latest \ --path.rootfs/host # 检查Node Exporter是否运行正常 docker ps | grep node-exporter curl http://localhost:9100/metricsNode Exporter默认运行在9100端口访问该端点的/metrics可以查看采集到的系统指标。4.3 配置Grafana数据源现在我们需要在Grafana中添加Prometheus作为数据源。打开浏览器访问http://你的服务器IP:3000使用admin/admin登录首次登录需要修改密码点击左侧菜单的Configuration齿轮图标→Data Sources点击Add data source按钮选择Prometheus配置数据源Name: Prometheus可以自定义URL: http://你的服务器IP:9090其他保持默认点击Save Test如果看到 Data source is working 的提示说明配置成功4.4 导入监控仪表盘Grafana社区有很多现成的仪表盘模板我们可以直接导入使用。这里我推荐使用Node Exporter的官方仪表盘。在Grafana中点击左侧菜单的Dashboards四个方块图标→Browse点击New→Import在Import via grafana.com输入框中输入仪表盘ID1860这是Node Exporter的官方仪表盘点击Load选择刚才添加的Prometheus数据源点击Import现在你应该能看到一个完整的系统监控仪表盘包含了CPU、内存、磁盘、网络等各项指标。4.5 创建SiameseUniNLU专属仪表盘虽然Node Exporter的仪表盘很好但它主要是系统级别的监控。我们还需要一个专门针对SiameseUniNLU服务的仪表盘。下面我来教你创建一个。在Grafana中点击New→New dashboard然后按照以下步骤添加面板4.5.1 QPS监控面板点击Add new panel在Query选项卡中输入以下PromQL查询rate(siamese_uninlu_requests_total[1m])在Panel options中设置Title: 请求QPS每秒查询率Unit: requests/sec选择可视化类型为Graph点击Apply4.5.2 请求延迟面板点击Add new panel在Query选项卡中输入以下PromQL查询# P50延迟 histogram_quantile(0.5, rate(siamese_uninlu_request_latency_seconds_bucket[5m])) # P90延迟 histogram_quantile(0.9, rate(siamese_uninlu_request_latency_seconds_bucket[5m])) # P99延迟 histogram_quantile(0.99, rate(siamese_uninlu_request_latency_seconds_bucket[5m]))在Panel options中设置Title: 请求延迟分布Unit: seconds选择可视化类型为Graph点击Apply4.5.3 GPU显存使用面板点击Add new panel在Query选项卡中输入以下PromQL查询siamese_uninlu_gpu_memory_usage_bytes在Panel options中设置Title: GPU显存使用Unit: bytes选择SI前缀如MB、GB选择可视化类型为Stat点击Apply4.5.4 错误率面板点击Add new panel在Query选项卡中输入以下PromQL查询# 错误率计算 rate(siamese_uninlu_request_errors_total[5m]) / rate(siamese_uninlu_requests_total[5m])在Panel options中设置Title: 请求错误率Unit: percent0.0-1.0选择可视化类型为Gauge设置阈值Green: 0-0.011%以下Yellow: 0.01-0.051%-5%Red: 0.05-15%以上点击Apply4.5.5 请求总数面板点击Add new panel在Query选项卡中输入以下PromQL查询siamese_uninlu_requests_total在Panel options中设置Title: 总请求数Unit: none选择可视化类型为Stat点击Apply4.5.6 模型推理时间面板点击Add new panel在Query选项卡中输入以下PromQL查询# 平均推理时间 rate(siamese_uninlu_model_inference_time_seconds_sum[5m]) / rate(siamese_uninlu_model_inference_time_seconds_count[5m])在Panel options中设置Title: 模型平均推理时间Unit: seconds选择可视化类型为Graph点击Apply将所有面板排列整齐后点击右上角的Save按钮给仪表盘起个名字比如 SiameseUniNLU监控仪表盘。5. 监控指标详解与告警配置5.1 关键监控指标解读现在你的监控仪表盘已经搭建好了但你知道每个指标代表什么意义吗什么时候需要关注我来详细解释一下QPS每秒查询率正常范围取决于你的服务器配置和模型复杂度关注点突然的峰值或持续下降都可能有问题行动建议如果QPS持续低于预期检查是否有性能瓶颈请求延迟P50中位数一半的请求在这个时间内完成P9090%的请求在这个时间内完成P9999%的请求在这个时间内完成关注点P99延迟突然升高通常意味着有问题行动建议如果P99延迟超过1秒需要检查模型推理或网络状况GPU显存使用正常范围应该稳定在某个水平不会持续增长关注点显存泄漏会导致使用率持续上升直到OOM内存溢出行动建议如果显存使用率超过90%考虑优化模型或增加GPU内存错误率正常范围应该接近0%最好低于1%关注点任何非零的错误率都需要关注行动建议错误率超过5%需要立即检查服务日志5.2 配置告警规则监控不仅要能看还要能在出问题时及时通知我们。Grafana支持配置告警规则当指标超过阈值时发送通知。5.2.1 配置告警通道首先我们需要配置告警通知的通道。Grafana支持多种通知方式这里以邮件为例在Grafana中点击Alerting铃铛图标→Notification channels点击Add channel选择类型为Email配置邮件服务器信息Name: Email AlertsType: EmailEmail addresses: 你的邮箱地址配置SMTP服务器信息点击Test发送测试邮件点击Save5.2.2 创建告警规则现在我们来创建几个关键的告警规则规则1高错误率告警在刚才创建的SiameseUniNLU仪表盘中编辑错误率面板点击Alert选项卡 →Create alert配置告警规则Rule name: 高错误率告警Evaluate every: 1mFor: 5m配置条件WHEN:last()OF:query(A, 1m, now)IS ABOVE:0.05错误率超过5%配置通知Send to: Email AlertsMessage: SiameseUniNLU服务错误率超过5%当前值{{ $value }}点击Save规则2高延迟告警编辑请求延迟面板P99点击Alert选项卡 →Create alert配置告警规则Rule name: 高延迟告警Evaluate every: 1mFor: 5m配置条件WHEN:last()OF:query(A, 1m, now)IS ABOVE:2P99延迟超过2秒配置通知Send to: Email AlertsMessage: SiameseUniNLU服务P99延迟超过2秒当前值{{ $value }}秒点击Save规则3高GPU显存使用告警编辑GPU显存使用面板点击Alert选项卡 →Create alert配置告警规则Rule name: 高GPU显存使用告警Evaluate every: 1mFor: 5m配置条件WHEN:last()OF:query(A, 1m, now)IS ABOVE:0.9显存使用超过90%配置通知Send to: Email AlertsMessage: SiameseUniNLU服务GPU显存使用超过90%当前值{{ $value }} bytes点击Save5.2.3 测试告警配置好告警规则后我们可以模拟一些异常情况来测试告警是否正常工作# 测试脚本模拟高错误率 import requests import time url http://localhost:7860/api/predict # 发送一些正常请求 for i in range(10): data { text: 这是一个测试文本, schema: {分类: null} } try: response requests.post(url, jsondata, timeout5) print(f正常请求 {i1}: {response.status_code}) except Exception as e: print(f请求失败: {e}) time.sleep(0.5) # 发送一些会失败的请求使用错误的schema格式 for i in range(5): data { text: 这是一个测试文本, schema: 错误的schema格式 # 故意使用错误格式 } try: response requests.post(url, jsondata, timeout5) print(f错误请求 {i1}: {response.status_code}) except Exception as e: print(f请求失败: {e}) time.sleep(0.5)运行这个脚本后观察Grafana的告警状态并检查是否收到告警邮件。6. 高级监控技巧6.1 自定义业务指标除了系统级别的监控我们还可以添加一些业务相关的自定义指标。比如监控不同任务类型的请求分布# 在app.py中添加自定义指标 from prometheus_client import Counter # 按任务类型统计的请求计数器 TASK_TYPE_REQUESTS Counter(siamese_uninlu_task_requests_total, Total requests by task type, [task_type]) # 在预测函数中记录任务类型 app.route(/api/predict, methods[POST]) monitor_request def predict(): data request.get_json() text data.get(text, ) schema_str data.get(schema, ) # 解析schema判断任务类型 try: schema json.loads(schema_str) # 根据schema结构判断任务类型 if 人物 in schema and 地理位置 in schema: task_type ner # 命名实体识别 elif 情感分类 in schema: task_type sentiment # 情感分类 elif 分类 in schema: task_type text_classification # 文本分类 else: task_type other # 记录任务类型 TASK_TYPE_REQUESTS.labels(task_typetask_type).inc() except: task_type unknown TASK_TYPE_REQUESTS.labels(task_typetask_type).inc() # ... 原有的预测逻辑 ...6.2 监控数据持久化与备份默认情况下Prometheus的数据保存在容器内部如果容器被删除数据也会丢失。我们可以将数据持久化到宿主机# 创建数据目录 mkdir -p /opt/prometheus/data chmod 777 /opt/prometheus/data # 重新运行Prometheus挂载数据卷 docker stop prometheus docker rm prometheus docker run -d \ --nameprometheus \ -p 9090:9090 \ -v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \ -v /opt/prometheus/data:/prometheus \ prom/prometheus6.3 配置监控数据保留策略Prometheus默认只保留15天的数据我们可以修改这个配置# 修改prometheus.yml添加存储配置 global: scrape_interval: 15s evaluation_interval: 15s # 存储配置 storage: tsdb: retention: 90d # 保留90天数据 # ... 其他配置 ...6.4 使用Grafana变量实现动态筛选Grafana支持使用变量可以让仪表盘更加灵活。比如我们可以添加一个时间范围变量在仪表盘设置中点击Variables→New配置变量Name: time_rangeType: CustomCustom options: 1h,6h,12h,24h,7d,30d在面板查询中使用变量rate(siamese_uninlu_requests_total[$time_range])7. 常见问题与故障排查7.1 Prometheus无法采集指标问题现象Prometheus的Targets页面显示SiameseUniNLU服务状态为DOWN可能原因和解决方案网络不通# 检查端口是否开放 curl http://localhost:7860/metrics # 如果本地可以访问但Prometheus不能检查防火墙 sudo ufw status sudo ufw allow 7860/tcp服务未运行# 检查服务状态 ps aux | grep app.py # 重启服务 cd /root/nlp_structbert_siamese-uninlu_chinese-base pkill -f app.py nohup python3 app.py server.log 21 /metrics端点未正确暴露# 检查端点是否可访问 curl http://localhost:7860/metrics | head -20 # 检查app.py中是否添加了/metrics路由 grep -n metrics app.py7.2 Grafana无法显示数据问题现象Grafana面板显示No data可能原因和解决方案数据源配置错误检查Prometheus地址是否正确检查Prometheus是否正常运行# 检查Prometheus docker ps | grep prometheus curl http://localhost:9090查询语句错误检查PromQL查询语法在Prometheus的Graph页面测试查询# 测试查询 siamese_uninlu_requests_total时间范围设置问题检查Grafana右上角的时间范围确保时间范围内有数据7.3 指标数据不更新问题现象指标数据停止更新时间戳不再变化可能原因和解决方案服务进程卡死# 检查服务日志 tail -f /root/nlp_structbert_siamese-uninlu_chinese-base/server.log # 重启服务 pkill -f app.py cd /root/nlp_structbert_siamese-uninlu_chinese-base nohup python3 app.py server.log 21 Prometheus采集间隔过长# 检查prometheus.yml中的scrape_interval scrape_configs: - job_name: siamese-uninlu scrape_interval: 10s # 确保不是太长系统资源不足# 检查系统资源 free -h df -h top7.4 告警不触发问题现象指标超过阈值但没有收到告警可能原因和解决方案告警规则配置错误检查告警条件是否正确检查评估间隔和持续时间通知通道配置错误测试通知通道检查邮箱配置告警状态问题在Grafana的Alerting页面检查告警状态查看告警历史记录8. 总结通过这篇教程我们完成了SiameseUniNLU服务的完整监控体系建设。现在你不仅能看到服务的实时运行状态还能在出现问题时及时收到告警。让我简单总结一下我们完成的工作监控体系搭建完成部署了Prometheus作为监控数据存储部署了Grafana作为数据可视化平台修改了SiameseUniNLU服务代码暴露监控指标配置了数据采集和目标发现关键监控指标覆盖性能指标QPS、请求延迟、模型推理时间资源指标GPU显存使用、GPU利用率、CPU使用率、内存使用业务指标请求总数、错误率、任务类型分布健康指标服务可用性、运行时间告警机制建立配置了关键指标的告警规则设置了邮件通知通道实现了异常自动检测和通知高级功能扩展添加了业务自定义指标配置了数据持久化实现了动态筛选功能这套监控系统不仅适用于SiameseUniNLU稍作修改就可以应用到其他AI服务上。监控是服务稳定运行的眼睛有了它你就能在问题影响用户之前及时发现并解决。最后提醒一点监控系统本身也需要监控。建议你定期检查Prometheus和Grafana的运行状态确保监控系统本身是健康的。现在你的SiameseUniNLU服务已经具备了生产级的监控能力可以更加自信地提供服务了。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。