MLFLow 工件在远程服务器上记录和检索

MLFLow artifact logging and retrieve on remote server

我正在尝试在远程计算机上将 MLFlow 跟踪服务器设置为 systemd 服务。 我有一个 sftp 服务器 运行 并创建了一个 SSH 密钥对。

除了工件日志记录之外,一切似乎都运行良好。 MLFlow 似乎没有列出保存在 mlruns 目录中的工件的权限。

我以这种方式创建实验并记录工件:

uri = 'http://192.XXX:8000' 
mlflow.set_tracking_uri(uri)

mlflow.create_experiment('test', artifact_location='sftp://192.XXX:_path_to_mlruns_folder_')

experiment=mlflow.get_experiment_by_name('test')
with mlflow.start_run(experiment_id=experiment.experiment_id, run_name=run_name) as run:
       mlflow.log_param(_parameter_name_, _parameter_value_)     
       mlflow.log_artifact(_an_artifact_, _artifact_folder_name_)

我可以在 UI 中看到指标,在远程计算机上的正确目标文件夹中看到工件。但是,在 UI 中,我在尝试查看工件时收到此消息:

Unable to list artifacts stored under sftp://192.XXX:path_to_mlruns_folder/run_id/artifacts for the current run. Please contact your tracking server administrator to notify them of this error, which can happen when the tracking server lacks permission to list artifacts under the current run's root artifact directory.

我不明白为什么 mlruns 文件夹有 drwxrwxrwx 权限,所有子文件夹都有 drwxrwxr-x。我错过了什么?


更新 用新的眼光来看,它试图通过 sftp://192.XXX: 列出文件似乎很奇怪,它应该只在文件夹 _path_to_mlruns_folder_/_run_id_/artifacts 中查找。但是,我仍然不知道如何规避它。

问题似乎是默认情况下 systemd 服务由 root 运行。 指定用户并为该用户创建 ssh 密钥对以访问同一台远程机器。

[Unit]

Description=MLflow server

After=network.target 

[Service]

Restart=on-failure

RestartSec=20

User=_user_

Group=_group_

ExecStart=/bin/bash -c 'PATH=_yourpath_/anaconda3/envs/mlflow_server/bin/:$PATH exec mlflow server --backend-store-uri postgresql://mlflow:mlflow@localhost/mlflow --default-artifact-root sftp://_user_@192.168.1.245:_yourotherpath_/MLFLOW_SERVER/mlruns -h 0.0.0.0 -p 8000' 

[Install]

WantedBy=multi-user.target

_user__group_ 应该与 mlruns 目录中 ls -la 列出的相同。