更改 MLflow 工件存储的子目录

Posted

技术标签:

【中文标题】更改 MLflow 工件存储的子目录【英文标题】:Changing subdirectory of MLflow artifact store 【发布时间】:2021-07-13 05:02:26 【问题描述】:

Python API 中是否有任何内容可以让您更改工件子目录?例如,我这里存储了一个 .json 文件:

s3://mlflow/3/1353808bf7324824b7343658882b1e45/artifacts/feature_importance_split.json

MlFlow 在 s3 中创建一个 3/ 密钥。有没有办法将这个键修改为其他东西(日期或实验名称)?

【问题讨论】:

mlflow.start_run() 之前调用create_experiment() 函数可能是解决方案。 mlflow.create_experiment('test', artifact_location='sample_path') 不确定是否还需要设置 s3 URI,但我会尝试并报告。 【参考方案1】:

正如我在上面评论的,是的,mlflow.create_experiment() 确实允许您使用 artifact_location 参数设置工件位置。

然而,有点相关的是,使用create_experiment() 函数设置artifact_location 的问题是,一旦你创建了一个实验,如果你再次运行create_experiment() 函数,MLflow 会抛出一个错误。

我没有在文档中看到这一点,但已确认如果后端存储中已经存在实验,MlFlow 将不允许您再次运行相同的 create_experiment() 函数。在这篇文章中,MLfLow 没有check_if_exists 标志或create_experiments_if_not_exists() 函数。

为了让事情更令人沮丧,你也不能在set_experiment()函数中设置artifcact_location

所以这是一个非常简单的解决方法,它还避免了“错误 mlflow.utils.rest_utils ...”标准输出日志记录。 :

import os
from random import random, randint

from mlflow import mlflow,log_metric, log_param, log_artifacts
from mlflow.exceptions import MlflowException

try:
    experiment = mlflow.get_experiment_by_name('oof')
    experiment_id = experiment.experiment_id
except AttributeError:
    experiment_id = mlflow.create_experiment('oof', artifact_location='s3://mlflow-minio/sample/')

with mlflow.start_run(experiment_id=experiment_id) as run:
    mlflow.set_tracking_uri('http://localhost:5000')
    print("Running mlflow_tracking.py")

    log_param("param1", randint(0, 100))
    
    log_metric("foo", random())
    log_metric("foo", random() + 1)
    log_metric("foo", random() + 2)

    if not os.path.exists("outputs"):
        os.makedirs("outputs")
    with open("outputs/test.txt", "w") as f:
        f.write("hello world!")

    log_artifacts("outputs")

如果是用户第一次创建实验,代码将遇到 AttributeError,因为experiment_id 不存在,except 代码块在创建实验时被执行。

如果是第二次、第三次等代码运行,由于实验已经存在,所以只会执行try语句下的代码。 Mlflow 现在将在您的 s3 存储桶中创建一个“样本”密钥。没有经过全面测试,但至少对我有用。

【讨论】:

以上是关于更改 MLflow 工件存储的子目录的主要内容,如果未能解决你的问题,请参考以下文章

MLflow - TypeError:仅支持 dict 和 DataFrame 输入类型

从 nexus 获取最新的构建工件

如何在 .gitlab-ci.yml 中指定通配符工件子目录?

带有资产目录的 iOS 图像切片会创建奇怪的工件

Google Cloud Build 可以通过工件目录递归吗?

如何在发布步骤中获取我的工件提取到的目录?