
Nanbeige4.1-3B可观测性Prometheus监控vLLM指标Chainlit用户行为日志分析1. 引言为什么需要监控你的AI模型当你把Nanbeige4.1-3B这样的文本生成模型部署到生产环境让它通过Chainlit前端为用户提供服务时你可能会遇到这样的问题用户反馈“响应太慢了”但你不知道是模型推理慢还是网络问题服务器突然卡顿你无法快速定位是内存泄漏还是GPU过载想了解用户最常问什么问题但只有零散的聊天记录模型服务半夜挂了直到第二天早上用户投诉你才发现这就是为什么我们需要“可观测性”——不仅要能监控系统的技术指标还要能分析用户的行为模式。今天我将带你搭建一套完整的监控分析方案用Prometheus监控vLLM的各项性能指标同时用Chainlit的日志功能分析用户行为。2. Nanbeige4.1-3B与部署环境概览2.1 模型简介Nanbeige4.1-3B是一个基于Nanbeige4-3B-Base构建的增强版本。它通过监督微调和强化学习优化在小参数规模下实现了强大的推理能力和智能体行为。简单来说这是一个“小而精”的模型能在资源有限的情况下提供不错的文本生成效果。2.2 部署架构我们的部署架构很简单但实用后端使用vLLM部署Nanbeige4.1-3B模型前端使用Chainlit构建Web聊天界面监控Prometheus Grafana监控技术指标日志Chainlit内置日志 自定义分析3. 部署验证与基础使用在开始监控之前我们先确保模型部署成功并能正常使用。3.1 检查模型服务状态使用webshell查看部署日志确认服务是否正常运行# 查看vLLM服务日志 cat /root/workspace/llm.log如果看到类似下面的输出说明模型加载成功并已启动服务INFO 07-28 14:30:15 llm_engine.py:73] Initializing an LLM engine... INFO 07-28 14:30:18 model_runner.py:96] Loading model weights... INFO 07-28 14:30:25 llm_engine.py:189] Model loaded successfully. INFO 07-28 14:30:25 api_server.py:150] Starting API server on http://0.0.0.0:80003.2 通过Chainlit测试模型打开Chainlit前端界面你可以看到一个简洁的聊天窗口。让我们先问一个简单的问题来验证模型工作正常Which number is bigger, 9.11 or 9.8?模型应该能正确回答9.11更大。如果一切正常恭喜你基础部署已经完成但这才刚刚开始接下来我们要让这个系统变得“透明”和“可控”。4. 配置Prometheus监控vLLM指标4.1 为什么选择PrometheusPrometheus是目前最流行的开源监控系统特别适合监控微服务和容器化应用。对于vLLM这样的AI推理服务Prometheus能帮我们实时监控每秒收集一次数据及时发现异常历史数据保存所有历史指标方便分析趋势灵活告警当指标超过阈值时自动发送通知可视化与Grafana无缝集成创建漂亮的监控面板4.2 安装和配置Prometheus首先我们需要安装Prometheus。如果你使用的是Linux系统可以这样安装# 下载Prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.51.0/prometheus-2.51.0.linux-amd64.tar.gz # 解压 tar xvfz prometheus-2.51.0.linux-amd64.tar.gz cd prometheus-2.51.0.linux-amd64/ # 创建配置文件 cat prometheus.yml EOF global: scrape_interval: 15s # 每15秒收集一次数据 evaluation_interval: 15s scrape_configs: - job_name: vllm static_configs: - targets: [localhost:8000] # vLLM的metrics端点 metrics_path: /metrics # vLLM暴露指标的路径 EOF # 启动Prometheus ./prometheus --config.fileprometheus.yml 4.3 配置vLLM暴露指标默认情况下vLLM已经内置了Prometheus指标支持。我们只需要确保在启动vLLM时启用这个功能。修改你的启动命令# 原来的启动命令可能类似这样 # python -m vllm.entrypoints.api_server --model Nanbeige4.1-3B # 修改为启用metrics端点 python -m vllm.entrypoints.api_server \ --model Nanbeige4.1-3B \ --port 8000 \ --enable-metrics \ --metrics-port 8001关键参数说明--enable-metrics启用Prometheus指标收集--metrics-port 8001指标暴露的端口与API端口分开4.4 关键监控指标解析vLLM暴露的指标很多我们重点关注以下几个核心指标4.4.1 性能指标vllm:requests_processed_total处理的请求总数vllm:request_latency_seconds请求延迟P50、P90、P99分位数vllm:tokens_generated_total生成的token总数4.4.2 资源指标vllm:gpu_utilization_percentGPU利用率vllm:gpu_memory_used_bytesGPU内存使用量vllm:cpu_utilization_percentCPU利用率vllm:memory_used_bytes系统内存使用量4.4.3 队列指标vllm:requests_in_queue排队中的请求数vllm:waiting_requests等待处理的请求数你可以通过浏览器访问http://localhost:8001/metrics查看所有可用的指标。5. 使用Grafana可视化监控数据5.1 安装和配置GrafanaPrometheus收集了数据但我们需要一个更好的方式来查看这些数据。Grafana就是最佳选择# 在Ubuntu/Debian上安装 sudo apt-get install -y software-properties-common sudo add-apt-repository deb https://packages.grafana.com/oss/deb stable main wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - sudo apt-get update sudo apt-get install grafana # 启动Grafana sudo systemctl start grafana-server sudo systemctl enable grafana-server5.2 创建监控仪表板登录Grafana默认地址http://localhost:3000默认账号admin/admin然后添加数据源选择PrometheusURL填http://localhost:9090导入仪表板Grafana社区有很多现成的vLLM监控面板你可以直接导入使用或自定义创建我建议自己创建这样更符合你的需求5.3 关键监控面板设计我通常创建以下几个面板5.3.1 性能概览面板请求速率rate(vllm:requests_processed_total[5m])平均延迟vllm:request_latency_secondsToken生成速率rate(vllm:tokens_generated_total[5m])5.3.2 资源使用面板GPU利用率vllm:gpu_utilization_percentGPU内存vllm:gpu_memory_used_bytes队列长度vllm:requests_in_queue5.3.3 错误率面板错误请求率rate(vllm:request_errors_total[5m]) / rate(vllm:requests_processed_total[5m])5.4 设置告警规则当指标异常时我们需要及时知道。在Prometheus中配置告警规则# 创建alert.rules.yml groups: - name: vllm_alerts rules: - alert: HighRequestLatency expr: vllm:request_latency_seconds{p99} 5 for: 5m labels: severity: warning annotations: summary: 高请求延迟 description: P99请求延迟超过5秒当前值 {{ $value }}秒 - alert: GPUHighMemoryUsage expr: vllm:gpu_memory_used_bytes / vllm:gpu_memory_total_bytes 0.9 for: 2m labels: severity: critical annotations: summary: GPU内存使用过高 description: GPU内存使用率超过90%当前 {{ $value | humanizePercentage }} - alert: RequestQueueFull expr: vllm:requests_in_queue 10 for: 3m labels: severity: warning annotations: summary: 请求队列堆积 description: 排队请求数超过10个当前 {{ $value }}个6. Chainlit用户行为日志分析技术指标监控很重要但了解用户如何使用你的应用同样关键。Chainlit内置了日志功能我们可以充分利用它。6.1 启用Chainlit详细日志修改你的Chainlit配置文件通常是chainlit.md或通过环境变量# 在Chainlit应用代码中添加 import chainlit as cl import logging # 配置日志 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(chainlit_user_behavior.log), logging.StreamHandler() ] ) cl.on_chat_start async def on_chat_start(): # 记录用户开始聊天 logging.info(f用户 {cl.user_session.get(id)} 开始新的会话) cl.on_message async def on_message(message: cl.Message): # 记录用户消息 user_id cl.user_session.get(id, anonymous) logging.info(f用户 {user_id} 提问: {message.content[:100]}...) # 处理消息并获取响应 response await get_model_response(message.content) # 记录模型响应 logging.info(f模型回复用户 {user_id}: {response[:100]}...) await cl.Message(contentresponse).send()6.2 日志分析的关键维度收集到日志后我们可以从多个角度分析用户行为6.2.1 使用频率分析每天/每周/每月的活跃用户数每个用户的平均会话次数高峰使用时间段6.2.2 交互深度分析平均每个会话的消息数量用户提问的平均长度模型响应的平均长度6.2.3 内容主题分析最常被问到的关键词问题类型分布技术问题、创意写作、咨询等对话主题的变化趋势6.3 使用Python进行日志分析这里是一个简单的日志分析脚本示例import re from collections import Counter from datetime import datetime import pandas as pd def analyze_chainlit_logs(log_filechainlit_user_behavior.log): 分析Chainlit用户行为日志 # 读取日志文件 with open(log_file, r, encodingutf-8) as f: logs f.readlines() # 初始化统计 stats { total_sessions: 0, total_messages: 0, users: set(), questions: [], responses: [], time_distribution: {hour: 0 for hour in range(24)} } # 解析日志 for log in logs: # 解析时间戳 time_match re.search(r(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}), log) if time_match: timestamp datetime.strptime(time_match.group(1), %Y-%m-%d %H:%M:%S) stats[time_distribution][timestamp.hour] 1 # 统计用户 user_match re.search(r用户 (\S), log) if user_match: stats[users].add(user_match.group(1)) # 统计问题和回答 if 提问: in log: stats[total_messages] 1 # 提取问题内容简化示例 question_match re.search(r提问: (.*?)\.\.\., log) if question_match: stats[questions].append(question_match.group(1)) if 开始新的会话 in log: stats[total_sessions] 1 # 计算基本指标 stats[unique_users] len(stats[users]) stats[avg_messages_per_session] stats[total_messages] / max(stats[total_sessions], 1) # 分析热门问题 if stats[questions]: word_counter Counter() for question in stats[questions]: words question.lower().split() word_counter.update(words) stats[top_keywords] word_counter.most_common(10) return stats # 运行分析 if __name__ __main__: results analyze_chainlit_logs() print(f总会话数: {results[total_sessions]}) print(f独立用户数: {results[unique_users]}) print(f总消息数: {results[total_messages]}) print(f平均每会话消息数: {results[avg_messages_per_session]:.2f}) if top_keywords in results: print(\n最常问到的关键词:) for word, count in results[top_keywords]: print(f {word}: {count}次) # 输出使用时间分布 print(\n按小时的使用分布:) for hour in range(24): count results[time_distribution][hour] if count 0: print(f {hour:02d}:00 - {count}次交互)6.4 可视化用户行为数据使用Matplotlib或Plotly创建用户行为可视化import matplotlib.pyplot as plt import seaborn as sns def visualize_user_behavior(stats): 可视化用户行为数据 fig, axes plt.subplots(2, 2, figsize(12, 10)) # 1. 使用时间分布 hours list(range(24)) counts [stats[time_distribution][h] for h in hours] axes[0, 0].bar(hours, counts) axes[0, 0].set_title(用户活跃时间分布) axes[0, 0].set_xlabel(小时) axes[0, 0].set_ylabel(交互次数) axes[0, 0].set_xticks(range(0, 24, 3)) # 2. 消息长度分布如果有数据 if stats[questions]: question_lengths [len(q) for q in stats[questions]] axes[0, 1].hist(question_lengths, bins20, alpha0.7) axes[0, 1].set_title(用户问题长度分布) axes[0, 1].set_xlabel(问题长度字符) axes[0, 1].set_ylabel(频次) # 3. 关键词词云需要额外安装wordcloud库 # from wordcloud import WordCloud # 这里省略具体实现 # 4. 会话统计 session_data { 总会话数: stats[total_sessions], 独立用户数: stats[unique_users], 总消息数: stats[total_messages] } axes[1, 0].bar(session_data.keys(), session_data.values()) axes[1, 0].set_title(基础会话统计) axes[1, 0].tick_params(axisx, rotation45) plt.tight_layout() plt.savefig(user_behavior_analysis.png, dpi300, bbox_inchestight) plt.show() # 使用示例 # stats analyze_chainlit_logs() # visualize_user_behavior(stats)7. 整合监控与日志分析7.1 创建综合监控仪表板现在我们有技术指标和用户行为数据可以创建一个综合仪表板来全面了解系统状态技术指标区显示vLLM的性能和资源使用情况用户行为区显示活跃用户、热门问题、使用模式业务指标区显示用户满意度、响应质量等需要额外收集7.2 自动化报告生成我们可以创建一个定期运行的脚本自动生成监控报告import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import schedule import time def generate_daily_report(): 生成每日监控报告 # 1. 收集Prometheus数据 import requests prometheus_url http://localhost:9090/api/v1/query # 查询关键指标 queries { total_requests: sum(rate(vllm:requests_processed_total[24h])), avg_latency: avg(vllm:request_latency_seconds), error_rate: sum(rate(vllm:request_errors_total[24h])) / sum(rate(vllm:requests_processed_total[24h])), max_gpu_usage: max_over_time(vllm:gpu_memory_used_bytes[24h]) } metrics {} for name, query in queries.items(): response requests.get(prometheus_url, params{query: query}) if response.status_code 200: result response.json() if result[data][result]: metrics[name] result[data][result][0][value][1] # 2. 分析用户日志 user_stats analyze_chainlit_logs() # 3. 生成报告内容 report f Nanbeige4.1-3B 监控日报 技术指标 - 24小时总请求数: {metrics.get(total_requests, N/A)} - 平均响应延迟: {metrics.get(avg_latency, N/A)}秒 - 错误率: {float(metrics.get(error_rate, 0)) * 100:.2f}% - 最大GPU内存使用: {int(float(metrics.get(max_gpu_usage, 0)) / 1024**3):.2f} GB 用户行为 - 活跃会话数: {user_stats[total_sessions]} - 独立用户数: {user_stats[unique_users]} - 总消息数: {user_stats[total_messages]} - 平均每会话消息数: {user_stats[avg_messages_per_session]:.2f} 热门话题 if top_keywords in user_stats: for word, count in user_stats[top_keywords][:5]: report f - {word}: {count}次\n # 4. 发送邮件需要配置SMTP # send_email_report(report) print(report) return report def send_email_report(report_content): 发送邮件报告需要配置SMTP服务器 # 这里省略具体的邮件发送代码 # 你需要配置SMTP服务器信息 pass # 设置每天上午9点生成报告 schedule.every().day.at(09:00).do(generate_daily_report) # 保持脚本运行 while True: schedule.run_pending() time.sleep(60)7.3 异常检测与自动响应结合技术指标和用户行为我们可以实现更智能的异常检测def detect_anomalies(metrics, user_stats): 检测系统异常 anomalies [] # 检测技术异常 error_rate float(metrics.get(error_rate, 0)) if error_rate 0.05: # 错误率超过5% anomalies.append(f高错误率: {error_rate*100:.1f}%) avg_latency float(metrics.get(avg_latency, 0)) if avg_latency 3: # 平均延迟超过3秒 anomalies.append(f高延迟: {avg_latency:.1f}秒) # 检测用户行为异常 if user_stats[total_sessions] 0: anomalies.append(24小时内无用户会话) # 检测使用模式变化 # 这里可以添加更复杂的检测逻辑 return anomalies # 在监控循环中调用 current_metrics get_current_metrics() # 从Prometheus获取 current_user_stats analyze_recent_logs() # 分析最近日志 anomalies detect_anomalies(current_metrics, current_user_stats) if anomalies: print(检测到异常:) for anomaly in anomalies: print(f - {anomaly}) # 可以触发告警或自动修复8. 总结8.1 监控方案的价值回顾通过本文介绍的方案你现在拥有了一个完整的Nanbeige4.1-3B模型可观测性系统技术监控层面Prometheus实时监控vLLM的性能指标Grafana提供可视化让你随时了解模型服务的健康状态用户分析层面Chainlit日志分析帮你理解用户行为发现使用模式优化产品体验告警响应层面基于规则的告警和异常检测让你在问题影响用户前就能发现并处理8.2 实际应用建议根据我的经验这里有几点实用建议对于小型项目先从基础监控开始重点关注请求延迟和错误率定期查看用户日志了解用户最常问的问题设置简单的阈值告警如延迟5秒时通知对于中型项目建立完整的监控仪表板包含技术指标和业务指标实现自动化日报让团队每天了解系统状态开始分析用户行为模式优化提示词和模型配置对于大型项目考虑使用更专业的APM工具如Datadog、New Relic建立A/B测试框架对比不同模型版本的效果实现预测性监控基于历史数据预测未来负载8.3 下一步探索方向如果你已经实现了基础监控可以考虑以下进阶方向成本优化监控监控每个请求的GPU使用和成本优化资源分配质量监控通过用户反馈或自动评估监控回复质量安全监控检测异常输入或潜在的安全风险多模型对比如果你部署了多个模型对比它们的性能和效果记住监控不是目的而是手段。真正的目标是通过监控数据做出更好的决策提供更稳定的服务创造更好的用户体验。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。