Je définis l'image docker suivante:
FROM python:3.6
RUN pip install --upgrade pip
RUN pip install --upgrade mlflow
ENTRYPOINT mlflow server --Host 0.0.0.0 --file-store /mnt/mlruns/
et créez une image appelée mlflow-server
. Ensuite, je démarre ce serveur à partir d'une machine locale:
docker run --rm -it -p 5000:5000 -v ${PWD}/mlruns/:/mnt/mlruns mlflow-server
Ensuite, je définis la fonction suivante:
def foo(x, with_af=False):
mlflow.start_run()
mlflow.log_param("x", x)
print(x)
if with_af:
with open(str(x), 'wb') as fout:
fout.write(os.urandom(1024))
mlflow.log_artifact(str(x))
mlflow.log_artifact('./foo.data')
mlflow.end_run()
À partir du même répertoire, j'exécute foo(10)
et le paramètre est enregistré correctement. Cependant, foo(10, True)
renvoie l'erreur suivante: PermissionError: [Errno 13] Permission denied: '/mnt'
. Il semble que log_artifact
Essaie d'enregistrer le fichier directement sur le système de fichiers local.
Une idée de ce que je fais mal?
Bonne question. Juste pour être sûr, on dirait que vous configurez déjà MLflow pour parler à votre serveur de suivi lors de l'exécution de votre script, par exemple via MLFLOW_TRACKING_URI=http://localhost:5000 python my-script.py
.
Les artefacts diffèrent subtilement des autres données d'exécution (métriques, paramètres, balises) en ce que le client, plutôt que le serveur, est responsable de leur persistance. Le flux actuel (à partir de MLflow 0.6.0) est:
mlflow.start_run
log_artifact
Lorsque vous lancez un serveur MLflow via mlflow server --Host 0.0.0.0 --file-store /mnt/mlruns/
, le serveur enregistre les métriques et les paramètres sous /mnt/mlruns
dans le conteneur Docker et renvoie également les chemins d'artefact sous /mnt/mlruns
au client. Le client tente ensuite de consigner les artefacts sous /mnt/mlruns
sur le système de fichiers local , qui échoue avec le PermissionError
que vous avez rencontré.
La meilleure pratique pour le stockage d'artefacts avec un serveur de suivi distant est de configurer le serveur pour utiliser une racine d'artefact accessible aux clients et au serveur (par exemple, un compartiment S3 ou un URI de stockage Azure Blob). Vous pouvez le faire via mlflow server --default-artifact-root [artifact-root]
.
Notez que le serveur utilise cette racine d'artefact uniquement lors de l'affectation de racines d'artefact à des expériences nouvellement créées - les exécutions créées sous des expériences existantes utiliseront un répertoire racine d'artefact sous la racine d'artefact de l'expérience existante. Voir le Guide de suivi MLflow pour plus d'informations sur la configuration de votre serveur de suivi.