MLOps 上线治理:模型版本管理与 A/B 测试实践 MLOps 上线治理模型版本管理与 A/B 测试实践一、模型上线的开盲盒风险训练出一个新模型指标比旧的好。兴冲冲推上线结果线上用户投诉变多。回头一看离线指标好线上分布却偏了。模型不同于普通代码它吃数据也受数据反噬。直接全量替换是拿生产当实验场。没版本管理、没灰度出事只能回滚到上次凑合。模型版本管理与 A/B 测试是把上线变成可控实验。本文探讨在 MLOps 中落地这两件事。二、版本与实验的机制模型版本管理记录的不只是权重文件。还有训练数据版本、超参、评估指标、上线时间。任何一项变了都是新版本可追溯、可回退。A/B 测试把流量分给新旧两版。按业务指标而非仅离线准确率判胜负。胜出版全量落败版下线过程可逆。下面是上线的链路关键在业务指标为准。离线指标好不等于线上好。最终判据应是用户真实反馈而非排行榜分数。三、生产级实现下面用代码描述模型版本注册与路由。from dataclasses import dataclass, field from typing import Optional dataclass class ModelVersion: version: str dataversion: str metrics: dict[str, float] stable: bool False class Registry: def __init__(self) - None: self._versions: dict[str, ModelVersion] {} def register(self, v: ModelVersion) - None: # 记录完整元数据保证任何版本可回溯 self._versions[v.version] v def promote(self, version: str) - None: for v in self._versions.values(): v.stable False self._versions[version].stable True def current(self) - Optional[ModelVersion]: for v in self._versions.values(): if v.stable: return v return None def route(ab_enabled: bool, control: str, treatment: str, uid: int) - str: 按 uid 哈希分流保证同一用户始终落到同版本 if not ab_enabled: return control return treatment if uid % 100 50 else control if __name__ __main__: reg Registry() reg.register(ModelVersion(v2, d-07, {offline_acc: 0.91})) reg.promote(v2) print(稳定版:, reg.current().version)真实系统接特征存储与监控。A/B 期间实时比业务指标超置信再放量。并设自动回退指标异常立即切回 control。四、MLOps 上线治理的代价与边界版本与实验必要但有成本。元数据不完整则不可回溯。只存权重丢了数据版本。出问题无法复现训练条件。应把数据、超参、指标一并入版本。A/B 的样本与周期。流量太小结论不显著。周期太短赶不上分布变化。需按统计功效算最小样本与最短时长。分流的一致性。同一用户时 v1 时 v2体验割裂。必须按稳定标识uid哈希保证 sticky。否则 A/B 结果被噪声污染。回退的干净度。模型下线要清缓存与路由。残留路由会把流量导到已删版本。回退流程要纳入发版清单。模型上线的监控闭环决定能否及时发现问题。A/B 期间若只盯准确率可能漏掉延迟、成本、用户反感等副作用。建议上线后同时监控业务指标与系统指标任一项异常都触发复盘。另一个实践是影子模式新模型先与旧模型并行跑、只记录不生效对比两者输出差异确认新模型在真实流量上确实更优再进 A/B降低直接上线的风险。最后模型退役要有清单下线旧版本、清理路由与缓存、归档元数据避免僵尸版本在回退时被误召留下隐患。结论MLOps 上线治理本质是用版本与实验把盲盒变实验。机制上以完整元数据保证可追溯以 A/B 按业务指标判胜负。工程上 sticky 分流、自动回退保安全。落地路线先建模型版本注册录全元数据小流量 A/B 比业务指标胜出逐步放量异常自动回退。上线不再是赌而是可观测的实验。

本月热点