更改 MLflow 工件存储的子目录

Changing subdirectory of MLflow artifact store

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

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

MlFlow 在 s3 中创建一个 3/ 键。有没有办法更改以将此键修改为其他内容(日期或实验名称)?

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

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

我没有在文档中看到这一点,但已确认如果后端存储中已经存在实验,MlFlow 将不允许您再次 运行 相同的 create_experiment() 函数。从这个 post 开始,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 存储桶中创建一个 'sample' 密钥。没有经过全面测试,但至少对我有用。