Docker环境运行MLFlow Project无法记录metrics与artifacts问题求助
问题排查与解决方案
核心根本原因
你代码中手动创建了新的实验和运行实例,完全没有使用mlflow run命令自动注入的运行上下文,所以所有日志都写入了代码新生成的、未挂载到宿主机的运行路径下,没有落到你预期的挂载目录中,容器销毁后对应数据直接丢失。
具体排查思路
- 对比运行日志的环境变量配置:日志明确显示docker运行时注入了
MLFLOW_RUN_ID=0978fdd89ba44bf7b49975ab84838e82、MLFLOW_EXPERIMENT_ID=0、MLFLOW_TRACKING_URI=file:///mlflow/tmp/mlruns三个核心环境变量,你代码中没有使用这些预置的上下文,反而调用create_experiment和create_run生成了全新的实验和运行记录,这部分记录默认存储在容器内部未挂载的路径,不会同步到宿主机。 - 检查挂载路径匹配关系:日志显示宿主机
/home/mlflow_demo/mlruns仅挂载到了容器内/mlflow/tmp/mlruns路径,你手动创建的run默认会写入容器内当前工作目录的mlruns下,不会落到已挂载的目录。
修复方案
方案1:使用mlflow自动上下文(推荐)
直接修改mlflow-demo.py代码,不需要手动创建client、实验和运行,用mlflow自动管理的上下文即可:
import mlflow from random import random # mlflow run命令会自动初始化运行上下文,无需手动创建相关实例 with mlflow.start_run(): for i in range(1000): mlflow.log_metric("foo", random(), step=i) with open("test.txt","w") as f: f.write("This is an artifact file") mlflow.log_artifact("test.txt")
方案2:手动指定使用预置的运行ID
如果必须使用MlflowClient实例,可以调整代码读取环境变量中的预置run id,不要新建实验和运行:
import mlflow from mlflow.tracking import MlflowClient from random import random import os client = MlflowClient() # 直接使用mlflow注入的run id,不需要新建run和experiment run_id = os.getenv("MLFLOW_RUN_ID") for i in range(1000): client.log_metric(run_id,"foo",random(),step=i) with open("test.txt","w") as f: f.write("This is an artifact file") client.log_artifact(run_id,"test.txt") client.set_terminated(run_id)
额外验证项
- 确认你使用的docker镜像中安装了和宿主机版本一致的mlflow,版本差异也可能导致数据写入失败
- 运行命令可补充
--env MLFLOW_TRACKING_URI=file:///mlflow/tmp/mlruns显式指定tracking uri,避免路径识别错误
内容的提问来源于stack exchange,提问作者kusur
相关产品推荐
相关产品推荐

