最完整指南:twitter-roberta-base-sentiment-latest日志分析与监控最佳实践
读完你将获得
- 情感分析模型(Sentiment Analysis Model)部署全流程监控方案
- 9种异常检测指标与实时告警配置
- 性能优化指南:从200ms到50ms的推理加速实践
- 生产环境故障排查决策树与案例库
- 完整监控代码库与自动化脚本(Python+Prometheus+Grafana)
1. 项目背景与监控必要性
1.1 模型定位与生产挑战
twitter-roberta-base-sentiment-latest是CardiffNLP团队开发的基于RoBERTa架构的情感分析模型(Sentiment Analysis Model),在1.24亿条推文语料上预训练,专为社交媒体文本优化。其核心优势在于:
- 三分类体系:Negative(0)/Neutral(1)/Positive(2)
- 适配Twitter特有表达方式(表情符号、俚语、话题标签)
- 与Hugging Face Transformers生态无缝集成
生产环境部署面临三大核心挑战:
1.2 监控体系建设目标
建立覆盖"数据-模型-系统"三层的监控体系,实现:
- 实时检测:异常响应时间<5秒
- 根因定位:故障诊断准确率>90%
- 性能优化:资源利用率提升30%
- 模型保障:精度下降预警提前24小时
2. 环境配置与依赖管理
2.1 基础环境要求
| 依赖项 | 最低版本 | 推荐版本 | 监控关键点 |
|---|---|---|---|
| Python | 3.7 | 3.9.10 | 解释器内存占用 |
| transformers | 4.13.0 | 4.28.1 | 模型加载时间 |
| torch | 1.7.0 | 1.11.0+cu113 | CUDA上下文切换 |
| tensorflow | 2.5.0 | 2.8.0 | 会话创建耗时 |
| numpy | 1.19.5 | 1.21.6 | 数组运算效率 |
2.2 监控工具链部署
# 基础监控组件
pip install prometheus-client==0.14.1
pip install python-dotenv==1.0.0
pip install requests==2.27.1
# 可视化依赖
pip install matplotlib==3.5.2
pip install seaborn==0.11.2
# 安装Prometheus(Ubuntu示例)
sudo apt-get update && sudo apt-get install -y prometheus
sudo systemctl enable prometheus && sudo systemctl start prometheus
3. 关键监控指标设计
3.1 系统级监控指标
| 指标名称 | 类型 | 阈值范围 | 告警级别 |
|---|---|---|---|
| CPU利用率 | Gauge | 0-100% | >80%警告,>95%严重 |
| 内存使用量 | Gauge | 动态 | >85%警告,>95%严重 |
| GPU显存占用 | Gauge | 0-100% | >90%警告 |
| 推理延迟 | Histogram | 基准值±3σ | >200ms警告 |
| 请求吞吐量 | Counter | - | <5 QPS警告 |
3.2 模型级监控指标
# 模型性能监控指标定义
MODEL_METRICS = {
"inference_latency": Histogram('model_inference_latency_ms', '推理延迟(毫秒)',
buckets=[10, 50, 100, 200, 300, 500]),
"prediction_distribution": Gauge('model_prediction_distribution', '预测分布',
['label']),
"confidence_score": Summary('model_confidence_score', '预测置信度',
['label']),
"sequence_length": Histogram('input_sequence_length', '输入序列长度',
buckets=[10, 20, 50, 100, 200, 300])
}
3.3 数据质量监控指标
| 指标ID | 描述 | 监控频率 | 异常处理 |
|---|---|---|---|
| DQ-001 | 输入文本长度分布 | 1分钟 | 95分位>300字符告警 |
| DQ-002 | 特殊字符占比 | 1分钟 | >20%触发清洗 |
| DQ-003 | 空输入频率 | 实时 | 连续5次触发熔断 |
| DQ-004 | 重复请求率 | 5分钟 | >15%启动缓存 |
4. 监控实现方案
4.1 基础监控代码框架
import time
import logging
from prometheus_client import start_http_server, Gauge, Histogram, Counter
from transformers import pipeline
import torch
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[logging.FileHandler("model_monitor.log"),
logging.StreamHandler()]
)
logger = logging.getLogger("sentiment-monitor")
# 初始化Prometheus指标
INFERENCE_LATENCY = Histogram('sentiment_inference_latency_ms', '推理延迟(毫秒)')
REQUEST_COUNT = Counter('sentiment_requests_total', '总请求数', ['status', 'label'])
MODEL_LOAD_TIME = Gauge('sentiment_model_load_seconds', '模型加载时间')
MEMORY_USAGE = Gauge('sentiment_memory_usage_mb', '内存使用量')
class MonitoredSentimentPipeline:
def __init__(self, model_path='./', device=-1):
self.model_path = model_path
self.device = device
self.pipeline = None
self._load_model()
@MODEL_LOAD_TIME.time()
def _load_model(self):
"""带监控的模型加载"""
start_time = time.time()
try:
self.pipeline = pipeline(
"sentiment-analysis",
model=self.model_path,
tokenizer=self.model_path,
device=self.device
)
logger.info(f"模型加载成功,耗时{time.time()-start_time:.2f}秒")
except Exception as e:
logger.error(f"模型加载失败: {str(e)}", exc_info=True)
raise
@INFERENCE_LATENCY.time()
def predict(self, text):
"""带监控的预测方法"""
try:
# 输入验证
if not isinstance(text, str) or len(text.strip()) == 0:
REQUEST_COUNT.labels(status='invalid', label='none').inc()
raise ValueError("无效输入文本")
# 执行预测
result = self.pipeline(text)[0]
# 更新计数器
REQUEST_COUNT.labels(status='success', label=result['label']).inc()
# 记录内存使用
import psutil
process = psutil.Process()
MEMORY_USAGE.set(process.memory_info().rss / 1024 / 1024)
return result
except Exception as e:
REQUEST_COUNT.labels(status='error', label='none').inc()
logger.error(f"预测失败: {str(e)}")
raise
4.2 模型性能监控实现
def monitor_performance(predict_func, test_cases, interval=60):
"""
定期运行性能测试用例
参数:
predict_func: 预测函数
test_cases: 测试用例列表
interval: 测试间隔(秒)
"""
performance_history = {
'latency': [],
'throughput': [],
'accuracy': [] # 需要有标注的测试集
}
while True:
start_time = time.time()
results = []
# 执行批量测试
for text, expected_label in test_cases:
try:
result = predict_func(text)
results.append({
'text': text,
'predicted': result['label'],
'expected': expected_label,
'score': result['score'],
'timestamp': time.time()
})
except Exception as e:
logger.error(f"测试用例失败: {text}, 错误: {str(e)}")
# 计算性能指标
duration = time.time() - start_time
throughput = len(results) / duration
# 计算准确率(如果有预期标签)
accuracy = None
if all('expected' in r for r in results):
correct = sum(1 for r in results if r['predicted'] == r['expected'])
accuracy = correct / len(results) if results else 0
# 记录指标
performance_history['latency'].append(duration*1000/len(results))
performance_history['throughput'].append(throughput)
if accuracy is not None:
performance_history['accuracy'].append(accuracy)
# 日志记录
logger.info(f"性能测试: 延迟={duration*1000/len(results):.2f}ms, "
f"吞吐量={throughput:.2f}qps, 准确率={accuracy:.4f}" if accuracy else "")
# 检查阈值
if len(performance_history['latency']) > 5: # 5次滑动窗口
avg_latency = sum(performance_history['latency'][-5:])/5
if avg_latency > 200: # 阈值根据实际情况调整
logger.warning(f"性能下降警告: 平均延迟{avg_latency:.2f}ms超过阈值")
# 发送告警通知(邮件/Slack等)
time.sleep(interval)
# 启动监控线程示例
if __name__ == "__main__":
# 初始化带监控的情感分析管道
sentiment_pipeline = MonitoredSentimentPipeline(device=0) # 使用GPU(0)
# 定义测试用例集(文本, 预期标签)
test_cases = [
("Covid cases are increasing fast!", "Negative"),
("I love this new feature!", "Positive"),
("The weather is nice today.", "Neutral"),
# 添加更多测试用例...
]
# 启动性能监控线程
import threading
monitor_thread = threading.Thread(
target=monitor_performance,
args=(sentiment_pipeline.predict, test_cases),
kwargs={'interval': 300}, # 每5分钟测试一次
daemon=True
)
monitor_thread.start()
# 启动Prometheus metrics端点
start_http_server(8000)
logger.info("监控服务器启动在端口8000")
# 保持主进程运行
while True:
time.sleep(3600)
5. 日志系统设计与实现
5.1 日志配置最佳实践
def configure_logging(log_dir='./logs', max_size=10*1024*1024, backup_count=10):
"""
配置结构化日志系统
参数:
log_dir: 日志目录
max_size: 单个日志文件大小上限
backup_count: 保留备份数
"""
import os
import logging.handlers
# 创建日志目录
os.makedirs(log_dir, exist_ok=True)
# 定义日志格式
log_format = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(process)d - %(thread)d - %(message)s'
)
# 根日志配置
root_logger = logging.getLogger()
root_logger.setLevel(logging.INFO)
# 控制台处理器
console_handler = logging.StreamHandler()
console_handler.setFormatter(log_format)
root_logger.addHandler(console_handler)
# 文件处理器(按大小轮转)
file_handler = logging.handlers.RotatingFileHandler(
os.path.join(log_dir, 'sentiment_service.log'),
maxBytes=max_size,
backupCount=backup_count,
encoding='utf-8'
)
file_handler.setFormatter(log_format)
root_logger.addHandler(file_handler)
# 错误日志单独处理
error_handler = logging.handlers.RotatingFileHandler(
os.path.join(log_dir, 'sentiment_errors.log'),
maxBytes=max_size,
backupCount=backup_count,
encoding='utf-8'
)
error_handler.setLevel(logging.ERROR)
error_handler.setFormatter(log_format)
root_logger.addHandler(error_handler)
logger.info(f"日志系统初始化完成,日志目录: {os.path.abspath(log_dir)}")
5.2 关键事件日志记录规范
def log_prediction_event(text, result, user_id=None, session_id=None):
"""
记录预测事件详情
参数:
text: 输入文本
result: 预测结果
user_id: 可选,用户ID
session_id: 可选,会话ID
"""
# 敏感信息过滤
sanitized_text = text.replace('\n', ' ').replace('\r', '')
if len(sanitized_text) > 200:
sanitized_text = sanitized_text[:200] + '...'
# 构建日志上下文
context = {
'text': sanitized_text,
'label': result['label'],
'score': round(result['score'], 4),
'timestamp': time.time()
}
# 添加可选上下文
if user_id:
context['user_id'] = user_id
if session_id:
context['session_id'] = session_id
# 分级日志记录
if result['score'] < 0.6: # 低置信度预测
logger.warning(f"低置信度预测: {context}")
else:
logger.info(f"预测事件: {context}")
def log_model_event(event_type, details=None):
"""
记录模型生命周期事件
参数:
event_type: 事件类型(startup/shutdown/reload/error)
details: 事件详情字典
"""
event_map = {
'startup': logging.INFO,
'shutdown': logging.INFO,
'reload': logging.WARNING,
'error': logging.ERROR,
'performance_drop': logging.WARNING,
'config_change': logging.INFO
}
log_level = event_map.get(event_type, logging.INFO)
event_details = {
'event_type': event_type,
'timestamp': time.time(),
'details': details or {}
}
logger.log(log_level, f"模型事件: {event_details}")
6. 异常检测与告警机制
6.1 多级异常检测策略
class AnomalyDetector:
def __init__(self, window_size=100, z_threshold=3.0):
"""
初始化异常检测器
参数:
window_size: 滑动窗口大小
z_threshold: Z-score阈值
"""
self.window_size = window_size
self.z_threshold = z_threshold
self.metrics_history = {
'latency': [],
'score': [],
'sequence_length': []
}
def update_metrics(self, latency, score, sequence_length):
"""更新指标历史记录"""
self._update_history('latency', latency)
self._update_history('score', score)
self._update_history('sequence_length', sequence_length)
def _update_history(self, metric_name, value):
"""更新单个指标的历史记录"""
self.metrics_history[metric_name].append(value)
if len(self.metrics_history[metric_name]) > self.window_size:
self.metrics_history[metric_name].pop(0)
def detect_anomalies(self):
"""检测异常并返回结果"""
anomalies = {}
for metric, values in self.metrics_history.items():
if len(values) < self.window_size:
continue # 窗口未填满
# 计算Z-score
mean = np.mean(values)
std = np.std(values)
if std == 0: # 避免除以零
continue
z_scores = [(x - mean) / std for x in values]
current_z = z_scores[-1]
# 判断异常
if abs(current_z) > self.z_threshold:
anomalies[metric] = {
'value': values[-1],
'mean': mean,
'std': std,
'z_score': current_z,
'is_anomaly': True
}
return anomalies if anomalies else None
6.2 告警通知系统实现
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate
class AlertSystem:
def __init__(self, config):
"""
初始化告警系统
参数:
config: 告警配置字典
"""
self.smtp_server = config.get('smtp_server')
self.smtp_port = config.get('smtp_port', 587)
self.smtp_username = config.get('smtp_username')
self.smtp_password = config.get('smtp_password')
self.recipients = config.get('recipients', [])
self.alert_thresholds = config.get('thresholds', {})
self.alert_history = []
self.cooldown_period = config.get('cooldown_seconds', 300) # 5分钟冷却
def send_alert(self, alert_type, message, severity='warning'):
"""
发送告警通知
参数:
alert_type: 告警类型
message: 告警消息
severity: 严重程度(warning/critical)
"""
# 检查冷却时间
current_time = time.time()
for alert in reversed(self.alert_history):
if (alert['type'] == alert_type and
current_time - alert['timestamp'] < self.cooldown_period):
logger.info(f"告警冷却中: {alert_type}")
return
# 记录告警历史
self.alert_history.append({
'type': alert_type,
'timestamp': current_time,
'severity': severity
})
# 保持历史记录大小
if len(self.alert_history) > 100:
self.alert_history.pop(0)
# 构建邮件内容
subject = f"[{'CRITICAL' if severity == 'critical' else 'WARNING'}] {alert_type}"
body = f"""
告警时间: {time.strftime('%Y-%m-%d %H:%M:%S')}
告警类型: {alert_type}
严重程度: {severity}
详细信息: {message}
请及时处理!
"""
# 发送邮件
try:
msg = MIMEText(body, 'plain', 'utf-8')
msg['Subject'] = subject
msg['From'] = self.smtp_username
msg['To'] = ', '.join(self.recipients)
msg['Date'] = formatdate(localtime=True)
with smtplib.SMTP(self.smtp_server, self.smtp_port) as server:
server.starttls()
server.login(self.smtp_username, self.smtp_password)
server.send_message(msg)
logger.info(f"告警邮件发送成功: {alert_type}")
except Exception as e:
logger.error(f"告警邮件发送失败: {str(e)}", exc_info=True)
7. 可视化监控面板搭建
7.1 Prometheus配置
# prometheus.yml 配置示例
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
# - "alert.rules.yml"
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
scrape_configs:
- job_name: 'sentiment-model'
static_configs:
- targets: ['localhost:8000'] # 我们的模型监控端点
7.2 Grafana面板配置
- 安装Grafana:
sudo apt-get install -y grafana
sudo systemctl enable grafana-server && sudo systemctl start grafana-server
- 导入监控面板:
{
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": "-- Grafana --",
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"type": "dashboard"
}
]
},
"editable": true,
"gnetId": null,
"graphTooltip": 0,
"id": 1,
"iteration": 1652389426433,
"links": [],
"panels": [
{
"collapsed": false,
"datasource": null,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 0
},
"id": 20,
"panels": [],
"title": "系统监控",
"type": "row"
},
// 添加完整面板配置...
],
"refresh": "5s",
"schemaVersion": 30,
"style": "dark",
"tags": [],
"templating": {
"list": []
},
"time": {
"from": "now-6h",
"to": "now"
},
"timepicker": {},
"timezone": "",
"title": "情感分析模型监控",
"uid": "sentiment-model-monitor",
"version": 1
}
7.3 自定义监控仪表盘
def generate_performance_report(history, output_path='./reports'):
"""
生成性能报告图表
参数:
history: 性能历史数据
output_path: 报告输出路径
"""
import matplotlib.pyplot as plt
import os
os.makedirs(output_path, exist_ok=True)
timestamp = time.strftime('%Y%m%d_%H%M%S')
# 创建延迟趋势图
plt.figure(figsize=(12, 6))
plt.plot(history['latency'], label='推理延迟(ms)')
plt.axhline(y=200, color='r', linestyle='--', label='阈值')
plt.title('推理延迟趋势')
plt.xlabel('样本序号')
plt.ylabel('延迟(ms)')
plt.legend()
plt.grid(True)
latency_path = os.path.join(output_path, f'latency_trend_{timestamp}.png')
plt.savefig(latency_path)
plt.close()
# 创建吞吐量图表
plt.figure(figsize=(12, 6))
plt.bar(range(len(history['throughput'])), history['throughput'])
plt.title('系统吞吐量')
plt.xlabel('测试周期')
plt.ylabel('QPS')
plt.grid(True, axis='y')
throughput_path = os.path.join(output_path, f'throughput_{timestamp}.png')
plt.savefig(throughput_path)
plt.close()
logger.info(f"性能报告生成完成: {output_path}")
return {
'latency_chart': latency_path,
'throughput_chart': throughput_path,
'timestamp': timestamp
}
8. 性能优化与故障排查
8.1 性能瓶颈分析方法
8.2 常见故障排查决策树
def troubleshoot_guide(symptom):
"""
故障排查指南
参数:
symptom: 故障现象
返回:
排查步骤列表
"""
guide = {
"高延迟": [
"1. 检查CPU/GPU利用率是否超过阈值",
"2. 验证输入批次大小是否合理(建议16-32)",
"3. 检查是否有其他进程占用资源",
"4. 使用nvidia-smi检查GPU内存使用情况",
"5. 分析推理时间分布,定位长尾请求",
"6. 考虑启用模型量化(INT8)"
],
"准确率下降": [
"1. 检查输入数据分布是否变化",
"2. 验证测试集准确率是否下降",
"3. 分析错误分类样本特征",
"4. 检查是否有数据预处理逻辑变更",
"5. 考虑模型微调或更新版本",
"6. 验证标签映射是否正确"
],
"内存泄漏": [
"1. 监控内存使用随时间变化趋势",
"2. 使用tracemalloc定位内存增长点",
"3. 检查循环引用和未释放资源",
"4. 验证transformers库版本是否有已知泄漏问题",
"5. 考虑定期重启服务(临时解决方案)",
"6. 使用objgraph分析对象创建模式"
],
"输入数据异常": [
"1. 检查文本长度分布(是否有超长文本)",
"2. 验证特殊字符处理逻辑",
"3. 检查是否有编码问题(UTF-8)",
"4. 分析空输入或重复输入频率",
"5. 加强输入验证和清洗",
"6. 添加异常输入样本到测试集"
]
}
return guide.get(symptom, ["未知故障现象,请提供更多信息"])
8.3 模型优化实施案例
def optimize_model_pipeline(original_pipeline, optimization_level=1):
"""
优化模型推理管道
参数:
original_pipeline: 原始管道对象
optimization_level: 优化级别(1-3)
返回:
优化后的管道
"""
optimized_pipeline = original_pipeline
logger.info(f"应用优化级别 {optimization_level}")
# 级别1: 基础优化
if optimization_level >= 1:
# 启用推理模式
import torch
optimized_pipeline.model.eval()
# 禁用梯度计算
torch.set_grad_enabled(False)
# 设置适当的设备
if torch.cuda.is_available():
optimized_pipeline.model = optimized_pipeline.model.cuda()
logger.info("基础优化: 启用CUDA加速")
else:
logger.info("基础优化: CPU模式运行")
# 级别2: 中级优化
if optimization_level >= 2:
try:
# 启用TorchScript优化
optimized_pipeline.model = torch.jit.script(optimized_pipeline.model)
logger.info("中级优化: 启用TorchScript")
except Exception as e:
logger.warning(f"TorchScript优化失败: {str(e)}")
# 优化批处理大小
optimized_pipeline.batch_size = 32
logger.info(f"中级优化: 设置批处理大小为 {optimized_pipeline.batch_size}")
# 级别3: 高级优化
if optimization_level >= 3:
try:
# 启用INT8量化
from torch.quantization import quantize_dynamic
optimized_pipeline.model = quantize_dynamic(
optimized_pipeline.model,
{torch.nn.Linear},
dtype=torch.qint8
)
logger.info("高级优化: 启用INT8量化")
except Exception as e:
logger.warning(f"量化优化失败: {str(e)}")
return optimized_pipeline
9. 总结与未来展望
9.1 监控体系建设成果
通过本文档实现的监控方案,您的情感分析服务将获得:
- 全方位的指标监控覆盖
- 实时异常检测与告警
- 性能瓶颈自动分析
- 可视化的监控面板
- 标准化的故障排查流程
9.2 未来改进方向
- 智能化监控: 集成机器学习模型预测性能趋势
- 自适应优化: 根据负载自动调整资源分配
- 多模型对比: 同时监控不同版本模型性能
- 用户体验监控: 关联分析预测结果对业务指标的影响
- 自动化修复: 实现常见故障的自动恢复
9.3 扩展学习资源
- 官方文档: https://huggingface.co/docs/transformers
- 性能优化指南: https://pytorch.org/tutorials/recipes/recipes/performance_tuning.html
- Prometheus文档: https://prometheus.io/docs/introduction/overview/
- 模型监控论文: https://arxiv.org/abs/2102.05095 (Model Cards for Model Reporting)
附录: 完整监控代码库
# 监控主程序: monitor.py
import time
import logging
import argparse
import threading
import numpy as np
from prometheus_client import start_http_server
from transformers import pipeline
# 导入前面章节定义的监控组件
from monitoring.metrics import initialize_metrics
from monitoring.anomaly import AnomalyDetector
from monitoring.alerting import AlertSystem
from monitoring.logging import configure_logging
from monitoring.performance import monitor_performance
def main():
parser = argparse.ArgumentParser(description='情感分析模型监控服务')
parser.add_argument('--model-path', default='./', help='模型路径')
parser.add_argument('--port', type=int, default=8000, help='监控端口')
parser.add_argument('--device', type=int, default=-1, help='设备ID(-1为CPU)')
parser.add_argument('--log-dir', default='./logs', help='日志目录')
parser.add_argument('--optimization', type=int, default=1, help='优化级别(1-3)')
args = parser.parse_args()
# 初始化日志
configure_logging(args.log_dir)
logger = logging.getLogger("sentiment-monitor")
# 初始化指标
metrics = initialize_metrics()
# 加载模型
logger.info(f"从{args.model_path}加载模型")
sentiment_pipeline = pipeline(
"sentiment-analysis",
model=args.model_path,
tokenizer=args.model_path,
device=args.device
)
# 应用优化
from optimization import optimize_model_pipeline
optimized_pipeline = optimize_model_pipeline(
sentiment_pipeline,
optimization_level=args.optimization
)
# 初始化异常检测器
anomaly_detector = AnomalyDetector(window_size=100, z_threshold=3.0)
# 初始化告警系统(从环境变量加载配置)
from dotenv import load_dotenv
import os
load_dotenv()
alert_config = {
'smtp_server': os.getenv('SMTP_SERVER'),
'smtp_port': int(os.getenv('SMTP_PORT', 587)),
'smtp_username': os.getenv('SMTP_USERNAME'),
'smtp_password': os.getenv('SMTP_PASSWORD'),
'recipients': os.getenv('ALERT_RECIPIENTS', '').split(','),
'cooldown_seconds': 300
}
alert_system = AlertSystem(alert_config)
# 启动性能监控线程
test_cases = [
("I love using this sentiment analysis model!", "Positive"),
("This is a neutral statement about the weather.", "Neutral"),
("I hate waiting for slow model inference times.", "Negative"),
# 添加更多测试用例...
]
monitor_thread = threading.Thread(
target=monitor_performance,
args=(optimized_pipeline, test_cases),
kwargs={'interval': 300},
daemon=True
)
monitor_thread.start()
# 启动Prometheus端点
start_http_server(args.port)
logger.info(f"监控服务启动在端口{args.port}")
# 主循环
try:
while True:
# 这里可以添加定期报告生成等任务
time.sleep(3600)
except KeyboardInterrupt:
logger.info("监控服务正在关闭...")
if __name__ == "__main__":
main()
请点赞👍收藏🌟关注,获取更多NLP模型工程化实践指南!下期预告:《大语言模型部署的A/B测试框架》
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



