一、为什么要清理MLflow里过期的模型版本?
1.1 模型版本堆积的麻烦
很多用MLflow管理模型的开发者,时间久了都会遇到一个头疼的问题:模型注册表像堆满旧快递的储物柜,各种版本挤在一起——上周测试过的旧模型、上个月跑崩没上线的版本、甚至半年前还在实验的冷门模型,不仅占着服务器的存储空间,找真正在用的模型时还容易被干扰,万一误调用旧模型,轻则结果不准,重则影响业务。
1.2 过期模型的判定标准
过期模型不是靠“感觉”定的,得结合业务场景和平台规则:比如电商推荐模型,超过90天没被调用、且没标注成生产可用(Production)的版本就算过期;风控模型虽然保留周期长,但测试阶段(Staging)的版本超过60天没更新也要清。核心是“没用且没价值”,还要避开正在用的版本。
二、MLflow模型过期清理的常用方法
2.1 手动清理(不推荐)
直接在MLflow的Web界面里挨个找过期版本删,适合只有几个模型的小项目,但如果有几十个、上百个模型,不仅效率低,还容易删错——比如把刚归档的备用版本当成过期删了,新手很容易踩坑。
2.2 自动清理脚本(核心方案)
用MLflow的Python SDK写一段脚本,自动扫描所有模型版本,按规则判断是否过期后执行删除,适合中大型项目。这里用Python作为单一技术栈,完整示例如下:
# 导入MLflow核心工具包
import mlflow
from mlflow.tracking import MlflowClient
from datetime import datetime, timedelta
# -------------------------- 【必须修改】自定义配置项 --------------------------
MLFLOW_TRACKING_URI = "http://你的MLflow服务器地址:5000" # 替换成实际服务器地址
CLEANUP_THRESHOLD_DAYS = 90 # 超过多少天未更新判定为过期
PROTECTED_STAGES = ["Production", "Staging"] # 这些阶段的模型绝对不能删
DRY_RUN = True # 先试运行,只打印要删除的版本,不真删!确认后改成False
# -------------------------------------------------------------------------
# 初始化MLflow客户端,连接到指定服务器
client = MlflowClient(tracking_uri=MLFLOW_TRACKING_URI)
def clean_expired_model_versions():
# 1. 获取注册表中所有已注册的模型
all_models = client.search_registered_models()
for model in all_models:
model_name = model.name
print(f"正在检查模型:{model_name}")
# 2. 获取当前模型的所有版本
model_versions = client.search_model_versions(f"name='{model_name}'")
for version in model_versions:
version_num = version.version
current_stage = version.current_stage
# MLflow的时间戳是毫秒级,转成可读的日期格式
create_time = datetime.fromtimestamp(version.creation_timestamp / 1000)
# 计算距离创建的天数
days_since_create = (datetime.now() - create_time).days
# 3. 判定是否符合删除条件:超期+非保护阶段
if days_since_create > CLEANUP_THRESHOLD_DAYS and current_stage not in PROTECTED_STAGES:
print(f"即将{'删除' if not DRY_RUN else '模拟删除'}:模型{model_name} V{version_num},创建于{create_time.date()},已超{days_since_create}天,阶段:{current_stage}")
# 试运行阶段只打印,正式执行才删
if not DRY_RUN:
try:
client.delete_model_version(name=model_name, version=version_num)
print(f"成功删除:模型{model_name} V{version_num}")
except Exception as e:
print(f"删除失败,原因:{str(e)}")
else:
# 不符合条件的跳过,打印原因
reason = f"在保护阶段:{current_stage}" if current_stage in PROTECTED_STAGES else f"未超{GLEANUP_THRESHOLD_DAYS}天"
print(f"跳过:模型{model_name} V{version_num},原因:{reason}")
if __name__ == "__main__":
clean_expired_model_versions()
这个脚本的关键是加了DRY_RUN开关,新手一定要先开着试运行,确认要删的都是没用的版本,再关闭开关正式执行。
2.3 定时自动执行
把上面的脚本放到定时任务里,比如用Linux的crontab,设置每周一凌晨2点执行,既能保证定期清理,又不会影响业务高峰。比如crontab的规则可以写成:0 2 * * 1 /usr/bin/python3 /路径/清理脚本.py,每周凌晨2点自动跑一次。
三、应用场景
3.1 电商平台推荐模型
电商的推荐模型迭代快,每周都会出2-3个新版本,这些版本上线后,旧版本如果超过90天没被调用,说明已经被新模型替代,适合用上面的脚本清理,避免注册表堆满没用的版本,影响后续模型查找和上线速度。
3.2 实时风控模型
实时风控模型需要高可用,一般Production阶段的版本不能删,但测试阶段的版本,超过60天没更新也没被调用,就可以清理——既保证了核心风控模型的安全,又释放了测试版本占用的存储空间。
四、技术优缺点
4.1 优点
- 效率高:比手动清理快10倍以上,适合多模型的项目;
- 出错率低:只要规则配置对,不会出现手动删错的问题;
- 自动化:结合定时任务后,不需要人工干预,减少运维成本;
- 可读性强:脚本清晰,方便后续调整清理规则。
4.2 缺点
- 容错率低:如果规则配置错,比如把Production阶段的模型也放进可删范围,会直接影响业务;
- 依赖服务器:脚本需要在能访问MLflow服务器的环境运行,比如运维服务器;
- 备份缺失:如果没有提前备份要删除的版本,误删后无法恢复,所以一定要加备份步骤。
五、注意事项
5.1 先试运行再执行
一定要把DRY_RUN设为True先跑一遍,确认要删除的版本都是过期且没用的,再改成False执行正式清理,避免删错业务模型。
5.2 禁止删除正在用的版本
必须保护Production和Staging阶段的模型,还要注意:有些模型虽然标了Archive,但最近刚被调用过(可以加最后调用时间的判断),这种也要临时保护。
5.3 加备份机制
删除之前,先把要清理的模型版本下载备份到本地或其他存储,比如在脚本里加一句mlflow.registered_models.get_model_version_download_uri(...),把模型文件下载下来,万一删错可以恢复。
六、总结
MLflow模型注册表的过期清理,本质是给模型版本做“断舍离”,核心是用自动化脚本替代手动操作,既节省存储空间,又提升模型管理的效率。新手可以先从简单的规则入手,比如先清理超过90天的非Production版本,熟练后再调整规则,结合定时任务实现全自动管理。关键是一定要先测试,再执行,避免影响业务。
评论
围绕“MLflow Model Registry模型过期清理:生命周期管理中的废弃版本清理机制”参与讨论