mlflow start_run() 必须显式调用 end_run() 或使用 with 语句包裹,否则指标不落盘;mlflow_tracking_uri 需设为 http 地址而非文件路径;log_model() 必须显式指定 conda_env;set_experiment() 非线程安全,应改用 experiment_id 参数。

MLflow start_run() 必须显式结束,否则指标不会落盘
很多用户发现写进 log_metric() 或 log_param() 的数据在 UI 里看不到,根本原因是没调用 end_run() —— MLflow 不靠上下文管理器自动收尾,也不靠进程退出触发持久化。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 始终用
with mlflow.start_run():包裹训练逻辑,这是最安全的方式;手动调用end_run()容易漏在异常分支里 - 如果必须手动控制生命周期,确保每个
start_run()都有对应end_run(),且放在finally块中 - 注意:
start_run()在已有活跃 run 时会报mlflow.exceptions.MlflowException: Run with ID 'xxx' is already active,不是警告,是硬错误
本地跟踪服务器启动后,MLFLOW_TRACKING_URI 必须指向 HTTP 地址而非文件路径
本地跑 mlflow server --backend-store-uri sqlite:///mlflow.db --default-artifact-root ./artifacts 后,直接设 MLFLOW_TRACKING_URI=./mlruns 会导致所有 log 操作静默失败,UI 显示空实验列表,但无任何报错提示。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 服务端启动后,客户端必须用
http://127.0.0.1:5000(或你指定的 host:port)作为MLFLOW_TRACKING_URI -
file:///协议仅适用于不启 server、纯本地文件后端场景(即直接mlflow.set_tracking_uri("file:///path")),和 server 模式互斥 - 检查是否生效:运行
mlflow.get_tracking_uri(),返回值应为http://...,不是file://或相对路径
log_model() 保存 sklearn 模型时,conda_env 参数不能省略或传空字典
省略 conda_env 或传 {} 会导致模型加载时报 ModuleNotFoundError: No module named 'sklearn',即使训练环境里明明装了 sklearn —— MLflow 默认只记录 Python 版本,不自动推导依赖。
TeemIp是一个免费、开源、基于WEB的IP地址管理(IPAM)工具,提供全面的IP管理功能。它允许您管理IPv4、IPv6和DNS空间:跟踪用户请求,发现和分配IP,管理您的IP计划、子网空间、区域和DNS记录,符合最佳的DDI实践。同时,TeemIp的配置管理数据库(CMDB)允许您管理您的IT库存并将您的配置项(CIs)与它们使用的IP关联起来。项目源代码位于https://github.com/TeemIP
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
mlflow.sklearn.log_model(..., conda_env="conda.yaml")显式指定环境文件,或传入由mlflow.sklearn.get_default_conda_env()生成的 dict - 避免用
pip_requirements替代conda_env:前者只影响 pip 安装,而 MLflow 加载模型时默认走 conda 环境还原 - 验证方式:下载模型 tar.gz,解压后检查
conda.yaml是否包含sklearn和对应版本号
并发训练多个实验时,set_experiment() 不是线程安全的
多线程/多进程脚本中,如果在不同线程里分别调用 mlflow.set_experiment("exp_a") 和 mlflow.set_experiment("exp_b"),最终可能全部跑到同一个 experiment 下——因为该函数修改的是全局模块状态,不是 run 级别配置。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 改用
mlflow.start_run(experiment_id=...)或mlflow.start_run(experiment_name=...),这两个参数优先级高于全局 experiment 设置 - 获取 experiment_id:先调
client = mlflow.tracking.MlflowClient(),再用client.get_experiment_by_name("name").experiment_id - 不要依赖
set_experiment()做并发隔离,它只适合单任务、顺序执行的脚本
真正麻烦的不是 API 怎么写,而是那些不报错却悄悄失效的行为:比如没关 run、URI 协议用错、conda 环境缺字段、全局 experiment 被覆盖。这些点不踩一遍,很难意识到问题出在哪。









