一、为什么要清理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版本,熟练后再调整规则,结合定时任务实现全自动管理。关键是一定要先测试,再执行,避免影响业务。