MLOps实战:机器学习模型从训练到上线的全流程管理

去年一个客户,数据科学团队花三个月训练了一个推荐模型,离线测试指标很漂亮,上线后效果却很差。CTR不仅没涨,反而跌了。业务方问:“你们的模型是不是有问题?”
数据科学家很委屈:“离线测试AUC 0.82,没问题啊。”
后来发现,离线训练用的特征分布和线上实时特征分布不一样。训练时用的是用户过去30天的平均点击率,线上用的是当天的实时点击率。两个分布差异很大,模型懵了。
这是ML落地最常见的悲剧:模型训练好了,不知道该怎么上线;上线了,不知道该怎么监控。
今天聊聊MLOps。不是那种“ML很重要”的入门课,而是帮你理清楚:从训练到上线,模型怎么管理、怎么部署、怎么监控、怎么防止效果衰减。
01 实验追踪:别让你的训练变玄学
数据科学团队经常遇到这种情况:三个月前跑出一个好模型,但当时用的数据版本、参数、代码分支都不记得了。想复现,复现不出来。
实验追踪要记录什么:
代码版本(Git commit)
数据版本(数据快照或DVC版本)
超参数(学习率、batch size、层数)
模型评估指标(AUC、准确率、召回率)
环境依赖(库版本、CUDA版本)
工具:MLflow、Weights & Biases、Neptune
那家客户后来用MLflow记录每次实验。数据版本用DVC管理。三个月后复现,一模一样。
02 数据验证:坏数据进,坏模型出
模型训练用的数据,质量怎么样?有没有空值?分布有没有变?有没有数据泄露?
数据验证检查项:
空值比例:某个特征空值率突然从1%涨到50%
分布漂移:特征分布和训练时差异大(PSI指标)
数据泄露:训练时用了未来数据
标签泄漏:预测时不该出现的特征出现在训练集
工具:Great Expectations、TensorFlow Data Validation、Deequ
那家客户的特征漂移问题,如果在训练前跑数据验证,就能发现当天的点击率分布和过去30天不一样。但他们没做,模型上线后才发现。
03 模型CI:上线前先验证
代码要跑单元测试,模型也要。
模型CI要做的事:
模型推理时间测试:单个请求耗时是否在预期内
模型大小检查:是否超出部署限制
效果验证:用小批量线上数据测试,对比基线模型
鲁棒性测试:缺失特征、异常值输入,模型会不会崩
那家客户后来加了模型CI:每次训练完,自动用小批量线上数据跑推理,对比当前生产模型的CTR预测分布。差异过大,阻止上线。
04 模型部署:不只是把pkl文件放上去
模型部署有几个选项:
在线API:实时推理,低延迟。用TensorFlow Serving、TorchServe、Seldon、BentoML
批处理:定时跑,高吞吐。用Spark、Airflow调度
边缘部署:端侧推理,模型量化、蒸馏
部署策略:
金丝雀:先放5%流量,观察没问题再放大
蓝绿:新旧模型同时在线,一键切换
A/B测试:随机分流,对比效果
那家客户之前直接把pkl文件上传到Flask应用,没有版本管理、没有回滚。后来换成TensorFlow Serving + MLflow Model Registry,版本可追溯,切换一键完成。
05 监控:上线只是开始
模型上线后,效果会衰减。原因:
特征漂移:用户行为模式变了,特征分布和训练时不一样
概念漂移:特征和标签的关系变了(比如疫情前后,用户消费习惯变了)
数据质量:上游数据管道出问题,特征缺失或错误
监控指标:
模型性能:准确率、AUC、召回率(需要有标签反馈)
特征分布:PSI(群体稳定性指标),超过阈值告警
推理延迟:P99响应时间
数据质量:空值率、异常值率
工具:Evidently、WhyLogs、SageMaker Model Monitor
那家客户后来加了特征漂移监控。当天的点击率特征分布和过去30天差异超过阈值,自动告警,触发模型重新训练。
06 一个真实案例:模型衰减被提前发现
一个金融风控模型,上线后前3个月效果稳定。第4个月,逾期率开始上升。
监控系统发现:其中一个特征“近30天登录次数”的分布变了。原来用户平均登录10次,现在变成了5次。产品改了登录策略,用户登录频率下降,模型没适应。
数据科学团队用新数据重新训练模型,AUC从0.75恢复到0.82。如果没有监控,可能要等逾期坏账发生才知道模型失效。
风控负责人说:“以前模型上线就结束了,现在才知道,上线才是监控的开始。”
写在最后
MLOps不是把模型塞进API就完事。
那家客户的CTO后来总结:“数据版本、代码版本、超参数要记牢;上线前要验效果;上线后要防漂移;模型衰减早知道。”
你的模型,从训练到上线,还有多少步没走通?