Skip to content

监控与可观测性

本页速览 没有监控的模型部署等于裸奔。本文讲清推理服务的四类黄金指标、ML 特有的数据/概念漂移检测、日志指标追踪三支柱,以及告警与 On-call 机制。

监控与可观测性

一句话定义:监控(monitoring)是对生产推理服务的指标、日志、追踪做持续采集与告警,并在模型失效前发现它——可观测性让"模型有没有在好好干活"从玄学变成数据。

行业洞察:监控模型比监控普通服务难得多,因为普通服务的故障特征是"代码不动、行为不变";而模型的"代码"(权重)也是不动,但数据会变——用户习惯变了、推荐热点变了、输入的文本风格变了,模型的效果就在无声中下滑。等业务方反馈"最近推荐越来越不准"时,往往已经滑了一两周。业界的共识是:推理服务的监控要同时看"系统健康"和"模型健康"两本账——系统挂了要马上知道(分钟级),模型变差了要尽早发现(小时~天级,靠漂移检测 + 效果回捞)。

一、为什么模型监控更难

text
普通服务: 代码 ──► 行为(不变)    故障 = 代码/基础设施坏了,重启/回滚即恢复
模型服务: 代码 + 权重(不变)──► 行为(随数据漂移)
                   输入分布 ──► 效果(可能渐变恶化)

模型监控必须回答三类问题:

  1. 系统层面:服务还活着吗?够快吗?还有资源吗?
  2. 数据层面:输入分布变了吗(数据漂移)?目标概念变了吗(概念漂移)?
  3. 效果层面:模型指标(AUC/点击率/翻译质量)下滑了吗?

二、四类黄金指标(USE Method)

经典的四类黄金指标(RED/Latency 流派)在推理服务里同样适用:

类别指标示例告警经验值
延迟(Latency)P50/P99/P999、TTFT/TPOTP99 超 SLO 阈值即告警;连续 5 分钟
流量(Traffic)QPS、并发、输入 bytes突增/突降 5 倍以上要查
错误(Errors)5xx 率、超时率、OOM 数错误率 > 1% 即 P1
饱和度(Saturation)GPU 利用率、队列深度、显存水位队列深度持续增长 / 显存 > 85%

USE 方法在 GPU 服务的用法

对推理服务,饱和度用两个指标:GPU 利用率(SM%)与显存占用。但注意推理多为带宽受限,SM% 低不等于空闲——真正要看的是"排队等待数"是否在涨。详见 性能优化与容量规划

三、ML 特有的监控:漂移检测

1. 数据漂移(feature drift)vs 概念漂移(concept drift)

类型定义例子后果
数据漂移输入特征分布变了新用户激增、天气突变、文本风格变化模型见过/没见过的分布比例失衡
概念漂移输入分布没变,但"输入→标签"的关系变了用户口味整体转向;汇率政策变化模型学到的规律过时了

区分两者的意义在于对策不同:数据漂移 → 重采样训练数据、加强归一化;概念漂移 → 重新训练模型。

2. 检测手段

方法适用阈值经验值
PSI(Population Stability Index)单维特征的分布偏移PSI > 0.2 告警(0.1~0.2 关注,<0.1 正常)
KS 检验(Kolmogorov-Smirnov)两分布是否显著不同p < 0.05 认为有漂移
Embedding 分布距离(MMD、KL)高维语义分布相对基线设定
预测分布监控输出概率分布变化常是概念漂移的早期信号
python
# PSI 计算示意(按分箱统计)
def psi(expected, actual, bins=10):
    # 把两分布按同一分位点切 10 箱
    # psi += (actual_ratio - expected_ratio) * ln(actual_ratio / expected_ratio)
    # 经验:>0.2 视为显著漂移
    return psi_value

漂移检测的两个陷阱

  1. 监控什么特征:只监控"模型真正依赖且线上会变的特征",全量监控只会刷屏;
  2. 基线要定期更新:把"上月"当基线,漂移检测才有意义;拿"训练集"当永久基线,正常的产品演进也会触发告警。

3. 效果回捞:漂移检测的补充

漂移检测是"代理指标",最终要落到效果指标上。做法:

  • 在线 A/B 或影子打分(shadow scoring)持续记录模型输出与真实反馈(如点击率);
  • 抽样人工标注(如翻译质量、审核准确率);
  • 周期性离线评估(batch scoring),对生产数据跑评估集。

四、可观测性三支柱

支柱工具推理服务的关注点
指标(Metrics)Prometheus + Grafana黄金指标、漂移指标、GPU 指标
日志(Logs)结构化日志 + Loki/ELK请求级 detail、错误堆栈、特征快照
追踪(Traces)OpenTelemetry + Jaeger/Tempo一次推理请求跨网关/服务/模型的完整链路

三支柱在推理服务的落地要点:

  1. 追踪必须带上模型版本与输入概要:查问题时"这个请求用的是 v2 模型还是 v3"是最高频问题;
  2. 结构化日志:JSON 格式、带 trace_idmodel_versionlatency_ms 字段,方便聚合;
  3. 请求采样:全量日志成本高,P99 慢请求全量记录 + 正常请求 1% 采样是常用组合。

完整落地方法见 可观测性落地

五、告警设计:SLO 燃烧率与分级

1. SLO 燃烧率(burn rate)

Google SRE 的告警框架:按"多快会耗尽错误预算"来告警。若 SLO 是"30 天 P99 < 100ms 达标率 99.9%":

  • 燃烧率 = 实际错误率 ÷ 允许错误率(0.1%);
  • 燃烧率 ≥ 14.4 持续 1 小时 → 页面告警(因为 14.4×1h ≈ 30 天的 2% 错误预算被烧光);
  • 燃烧率 ≥ 6 持续 6 小时 → 告警。

2. 分级告警,避免告警疲劳

级别含义例子响应
P1服务不可用/严重推理服务 5xx > 5%、GPU 掉卡立即 On-call
P2功能受损漂移告警、P99 持续超标工作时间内处理
P3潜在风险显存水位 80%、错误预算剩余 10%记录跟进

告警疲劳是真实事故

告警太多 → 没人认真看 → 真 P1 也被忽略。经验法则:每名 On-call 每周被分页唤醒不应超过 1~2 次。超过就调阈值或删指标。

六、模型上线后的监控清单(前 30 天)

新模型上线后的监控重点与成熟模型不同,前 30 天重点看:

时间窗重点原因
第 1 天加载/预热是否成功、首小时延迟分布扩容、缓存未热,最容易暴露配置问题
第 1 周P99 稳定性、错误率、显存水位排查资源估算偏差
第 2 周特征分布 vs 训练分布、效果指标基线上线时的分布代差显现
第 30 天与旧版本做全量 A/B 效果对比决定是否回滚或固化新版本

与 MLOps 的关联:上线与回滚流程见 发布策略:灰度与回滚,完整流水线见 MLOps 部署流水线

权衡与取舍

决策点选项怎么选
指标数量精简 vs 全量黄金指标打底,每加一个指标都要有用途
采样 vs 全量省钱 vs 完整慢请求全量、正常请求采样
漂移检测频率实时 vs 小时级在线高价值场景实时;一般场景小时级够
告警阈值敏感 vs 宽松以"每周唤醒 ≤1~2 次"倒推
自建 vs 托管自己搭栈 vs SaaS团队规模与预算决定,工具见 资源

一句话总结:推理服务要同时盯系统健康与模型健康两本账——黄金指标保"活着",漂移检测保"还有效",三支柱提供追查能力,分级告警保证有人响应

延伸阅读

参考资料