web-dev-qa-db-fra.com

Comment stocker des artefacts sur un serveur exécutant MLflow

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?

10
Dror

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.

Stockage d'artefacts dans MLflow

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:

  • Appels de code utilisateur mlflow.start_run
  • Le client MLflow fait une demande d'API au serveur de suivi pour créer une exécution
  • Le serveur de suivi détermine un URI d'artefact racine approprié pour l'exécution (actuellement: les racines d'artefact des exécutions sont des sous-répertoires des répertoires racine d'artefact de leur expérience parent)
  • Le serveur de suivi conserve les métadonnées d'exécution (y compris sa racine d'artefact) et retourne un objet Run au client
  • Appels de code utilisateur log_artifact
  • Le client consigne les artefacts sous la racine de l'artefact de l'exécution active

Le problème

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é.

Le correctif

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.

9
smurching