生产型机器学习系统
理解静态与动态训练、批量与在线推理、部署测试、监控和系统级风险。
- 选择训练与推理模式
- 制定重新训练条件
- 设计部署测试
- 监控数据与模型
简介
生产机器学习系统远不只是模型代码,还包括采集、验证、特征、服务、监控和流程编排。
生产系统包含数据采集、清洗、特征变换、训练、验证、发布、推理、监控和回滚。模型文件只是其中一个环节。很多事故来自特征口径变化、数据源故障和线上线下处理不一致。
定义数据契约:每列是什么、单位是什么、允许缺失吗、何时更新、异常值如何处理。训练和线上服务都遵循同一契约,才有机会让离线指标在真实流量中成立。
你需要理解
- 模型往往只是整个代码库的一小部分。
- 上游数据和下游业务逻辑同样可能造成失败。
训练时把收入单位当作“元”,线上突然改成“万元”,模型代码没有变化,预测也可能大幅失真。
静态训练与动态训练
静态训练离线定期生成模型;动态训练持续用新数据更新。选择取决于变化速度、成本和风险。
静态训练按计划或条件用固定数据集重新训练并发布新版本,容易复现和审核。动态训练不断吸收新数据,适合分布快速变化的任务,但错误数据也会更快污染模型。
选择时比较业务变化速度、标签到达时间、训练成本和可回滚要求。很多团队先用静态训练建立可靠发布流程,再逐步提高频率。
你需要理解
- 静态训练更容易复现和审核。
- 动态训练适应更快,但对数据质量和回滚要求更高。
- 多数系统从可靠的定期训练开始。
房屋长期价值趋势可每周训练;广告点击行为变化快,可能需要更频繁更新。但“每天训练”也不意味着每秒都要在线学习。
静态推理与动态推理
批量推理提前计算结果;在线推理在请求到来时实时计算。
静态推理(批量推理)提前对大量对象计算结果,在线请求读取缓存;成本和延迟较低,但结果可能滞后。动态推理在请求到来时实时计算,可以使用最新特征,但要求稳定的低延迟服务。
有些系统采用混合方式:夜间批量计算基础分数,用户访问时再用实时行为做少量调整。必须标明结果的更新时间,避免用户误认为它始终是实时的。
你需要理解
- 批量方案延迟低、成本可控,但结果可能过期。
- 在线推理更及时,但依赖高可用服务和特征。
- 混合方案可以预计算候选并在线重排。
每天凌晨生成推荐列表适合批量;识别刚发生的异常交易通常需要在线推理。
何时转换数据与重新训练
重新训练应由数据变化、性能下降、业务规则或固定周期触发,而不是只因为时间过去。
特征变换可在数据准备阶段预先完成,也可在模型服务时实时完成。无论位置在哪里,训练与推理必须用同一套版本化逻辑,否则会出现训练—应用偏差。
重新训练可以由性能下降、输入分布变化、业务规则改变或固定周期触发。触发后先检查标签是否可靠,再决定是修数据、改特征还是训练新模型。
你需要理解
- 检测特征分布和标签分布漂移。
- 比较新旧模型并保留回滚能力。
- 确保训练数据窗口与业务节奏匹配。
训练时年龄按出生年月精确计算,线上却只用年份相减,会让生日未到的用户年龄偏大。
部署测试
离线指标通过后仍要测试数据契约、延迟、容量、回退和真实流量中的业务影响。
上线前先保证训练可复现:保存训练数据的版本和时间范围、代码提交、特征处理版本、随机种子、超参数、评估报告及模型产物。另一位同事据此应能复跑出可解释的接近结果;如果训练数据已经被覆盖,只保存模型文件还不够。
把测试分层。单元测试检查“金额以元还是分存储”“缺失值如何填补”等特征规则;API 测试检查必填字段、类型、响应格式、超时与非法输入;集成测试让采集、特征、模型服务和结果消费端一起跑一笔请求。还要用目标硬件测试延迟、内存和并发。
发布门槛要有两道:相对当前线上模型不能明显退步,还要达到业务规定的绝对下限。例如某组召回率不能低于事先约定的阈值。这里的具体数值需由真实业务与风险决定;一个模型即使比旧版提高,也可能仍不够安全。
模型可先以“影子模式”接真实请求但不影响用户,比较新旧输出;再对小流量灰度发布,确认特征一致、线上延迟、错误率和业务指标。出现异常时,按预先演练的步骤恢复旧模型与旧特征版本。离线 AUC 改善不一定带来业务收益。
你需要理解
- 影子流量不影响用户地比较新模型。
- 金丝雀发布只向少量流量开放。
- A/B 测试衡量真实业务结果。
新的垃圾邮件模型离线准确率更高,却把重要邮件误杀。先用历史上“重要联系人”的固定样本集做回归测试,再让 1% 流量试运行,按用户群体查看误杀率;一旦超过约定界限,立刻回滚。
监控流水线
需要同时监控输入数据、特征变换、服务性能、预测分布和延迟到达的真实标签。
监控从输入开始。数据契约写清每列的类型、单位、合法范围、允许缺失率和更新时间;每批数据都做模式检查。例如交易金额约定单位是“分”、不得为负,若某天的 99 分位突然扩大 100 倍,应优先排查上游单位变化,而不是马上重训。
第二层检查特征处理:用固定样例分别跑离线训练流水线和线上推理流水线,比较输出是否一致;记录每个特征的缺失率、分位数和类别比例。训练—应用偏差表示两边处理不一致。标签泄漏则是训练时使用了预测时刻本不可能知道的信息,通常会造成离线成绩虚高。
第三层看模型和服务:总体与关键人群的召回率、误报率或误差,预测分数分布,接口错误率与 P95 延迟,模型版本和训练距今时间,以及输出中 NaN、无穷大或不合法值。总体平均数正常,不代表每个地区、设备或新老用户都正常。分群样本太少时还需展示样本量,避免把随机波动当故障。
真实标签可能在数天后才出现。当天可以先监控无标签信号,例如输入分布、分数分布和服务故障;等标签到达后再计算实际准确率、召回率或业务结果。输入分布改变只是预警,不自动等于模型质量下降;应结合延迟标签和人工抽样判断。
每项告警都要有阈值、负责人和处理手册。排查顺序可以是:核对采集与单位 → 对比训练和线上特征 → 检查模型版本及服务 → 按群体核对效果。若新版本造成严重退化,先回滚止损,再分析是数据修复、特征变更还是需要重训,并保留事故时间线。
你需要理解
- 检查缺失率、范围、类别和漂移。
- 监控延迟、吞吐、错误率和资源。
- 切片查看关键群体而非只看总体。
- 告警必须对应明确的排查和回滚动作。
风控标签要 3 天后才能确认。周一看到交易金额 99 分位从 8 万分跳到 800 万分,立即核对采集口径并暂缓发布;周四标签补齐后,再检验各地区误报率是否真的变化。
监控漂移时要保存参照窗口、样本量和业务活动背景。节假日造成的真实流量变化与数据管道故障需要不同处理。
要问的问题
上线评审要覆盖目标、数据、指标、退化方式、所有者和人工兜底。
上线评审可逐项问:这个功能解决了什么问题?数据源能持续提供吗?预测是否会反过来影响未来训练数据?谁负责故障处理?没有模型时的基线是什么?
反馈循环尤其重要:推荐系统总推热门内容,就只会收集热门内容的点击;模型可能越来越确信冷门内容不受欢迎。要通过探索流量、随机抽样或因果评估减少自我强化。
你需要理解
- 模型失败时谁受到影响?
- 没有标签时用什么代理信号监控?
- 系统能否安全降级到规则或旧模型?
- 数据和模型版本能否完整追溯?
如果“被推荐”本身增加点击,拿点击直接训练下一版模型时,标签并不是完全独立的用户偏好。
把异常交易模型送到线上
假设 10,000 笔交易只有 100 笔异常。离线训练完分类器,现在要让它可靠地参与线上判断。
锁定预测时刻
交易刚发生时可用金额、设备、过去 24 小时交易次数;不能使用“事后是否被追回”作为特征。后者是未来信息,训练时可见而线上不可见,会造成标签泄漏。
改用合适指标
全部预测正常可获得 99% 准确率,却漏掉全部异常。应看异常类召回率、精确率、误报数与人工复核容量,并按时间切分训练和测试。
准确率=9,900/10,000=99%;异常召回率=0/100=0%统一特征口径
把金额单位、缺失值、时区和时间窗口写成版本化数据契约。训练时的“过去 24 小时”若排除当前交易,线上必须相同,避免训练—应用偏差。
影子运行与小流量发布
先接真实请求但不改变现有决策,记录新旧输出差异、服务延迟和错误;达到门槛后再启用小流量,保留旧版随时回滚。
按切片监控
持续看输入缺失率、预测分布、召回与误报、服务延迟,并按设备、地区、渠道切片。真实标签常延迟到来,短期先看无标签预警,长期再看真实效果。告警时先查数据管道,再决定回滚还是重训。
把它串起来:上线不是复制模型文件;数据口径、发布流程、监控、回滚和负责人共同决定模型能否持续工作。
本页依据 Google Machine Learning Crash Course 的课程结构与概念重新编写,文字和图示经过中文化重构。查看 Google 官方对应模块。Google 页面文字通常采用 CC BY 4.0,代码示例采用 Apache 2.0;第三方图片未直接复制。