必须显式配置MLflow后端存储才能实现真正版本控制,否则模型注册等功能不可用;本地用SQLite快速验证,生产环境需PostgreSQL/MySQL;log_model仅存档,register_model才注册版本;Git信息需在仓库根目录运行或通过环境变量注入;注册模型须显式设stage才能用于生产。

直接用 mlflow.start_run() 就能开始版本控制?不,得先配好后端
MLflow 默认把实验存到本地 mlruns/ 目录,这种模式下你根本没法做真正的“版本控制”——没有统一存储、无法多人协作、模型注册表(Model Registry)功能直接不可用。必须显式配置后端存储,否则后续所有版本管理操作都会失败。
常见错误现象:mlflow.register_model() 报错 InvalidInputError: Model registry functionality is not supported with the current backend;或者 UI 里看不到 “Models” 标签页。
- 本地开发快速验证:用 SQLite,一行命令启动服务:
mlflow server --backend-store-uri sqlite:///mlflow.db --default-artifact-root ./artifacts --host 0.0.0.0 --port 5000 - 团队协作或生产环境:必须用 PostgreSQL 或 MySQL,不能只靠文件系统;
sqlite:///在并发写入时会锁死,且不支持模型阶段(Staging/Production)切换 -
--default-artifact-root路径必须可写,且建议用绝对路径(如/home/user/mlflow-artifacts),相对路径在不同工作目录下容易指向错位置
mlflow.log_model() 和 mlflow.register_model() 的区别到底在哪?
前者只是把模型文件存进 artifact 存储(比如 ./artifacts/1/abc123/model),后者才是创建一个带版本号、可查可管的“注册模型”。没调 register_model,就等于没进版本库——你在 UI 里看到的只是散落的模型快照,不是受控的版本实体。
使用场景:只有注册后的模型才能打标签、切阶段、做 AB 测试对比、被下游服务稳定加载。
立即学习“Python免费学习笔记(深入)”;
-
mlflow.sklearn.log_model(model, "my_model")→ 保存模型到当前 run 的 artifacts 下 -
mlflow.register_model("models:/my_model/1", "MyIrisModel")→ 把 run 中第 1 版本的模型注册为名为MyIrisModel的注册模型,自动生成 v1 - 注册时名字(如
"MyIrisModel")是全局唯一的标识符,后续所有版本都挂在这个名字下,不是随便起的字符串
怎么让每次训练自动对应 Git 提交?别手动填 git.sha
MLflow 默认会尝试读取当前目录的 Git 信息,但前提是:代码必须在 Git 仓库根目录下运行,且未处于 detached HEAD 状态。很多人在子目录跑脚本或用 Jupyter notebook,结果 source_version 字段为空,导致实验失去可复现锚点。
参数差异:mlflow.start_run(source_version="abc123") 可强制指定,但更稳妥的是用 mlflow.set_tracking_uri() 配合环境变量驱动。
- 确保训练脚本在 Git 仓库根目录执行,或设置
os.chdir()到仓库根 - CI/CD 场景下,推荐用环境变量注入:
MLFLOW_GIT_REPO_URL+MLFLOW_GIT_COMMIT,MLflow 会自动识别并记录 - 如果用
mlflow.projects.run()启动,它会自动打包当前 Git HEAD,比手写start_run更可靠
模型版本升级后,旧版本还能用吗?小心 get_model_version() 返回 None
注册模型后,新版本默认是 None 阶段(即未指定),不是自动变成 Staging。如果你代码里写 client.get_model_version(name="MyIrisModel", version=1) 却返回 None,大概率是这个版本还没被显式 transition 过阶段,或者名字拼错了。
性能影响:频繁调用 get_model_version() 不会慢,但若传错 name 或 version,会抛异常而非静默失败,下游服务可能直接 crash。
- 阶段切换必须显式调用:
client.transition_model_version_stage(name="MyIrisModel", version=1, stage="Staging") -
name区分大小写,且不能含空格或特殊字符;version是整数,不是字符串 "1" - 加载生产模型时,建议用 stage 加载而非硬编码 version:
models:/MyIrisModel/Production,避免上线后还要改代码


















