7
votes

Comment supprimer "définitivement" une expérience dans Mlflow?

La suppression permanente d'une expérience n'est documentée nulle part. J'utilise Mlflow avec postgres db backend

Voici ce que j'ai exécuté:

mlflow.exceptions.MlflowException: Cannot set a deleted experiment 'cross-sell' as the active experiment. You can restore the experiment, or permanently delete the  experiment to create a new one.

Cela supprime l'expérience, mais lorsque j'exécute une nouvelle expérience avec le même nom que celle que je viens de supprimer, elle renvoie cette erreur:

client = MlflowClient(tracking_uri=server)
client.delete_experiment(1)

Je ne trouve nulle part dans la documentation qui montre comment tout supprimer définitivement.


0 commentaires

4 Réponses :


7
votes

Malheureusement, il semble qu'il n'y ait aucun moyen de le faire via l'interface utilisateur ou la CLI pour le moment: - /

La façon de procéder dépend du type de magasin de fichiers backend que vous utilisez.

Filestore :

Si vous utilisez le système de fichiers comme mécanisme de stockage (par défaut), c'est facile. Les tests "supprimés" sont déplacés vers un dossier .trash . Vous avez juste besoin de clarifier cela:

USE mlflow_db;  # the name of your database
DELETE FROM experiment_tags WHERE experiment_id=ANY(
    SELECT experiment_id FROM experiments where lifecycle_stage="deleted"
);
DELETE FROM latest_metrics WHERE run_uuid=ANY(
    SELECT run_uuid FROM runs WHERE experiment_id=ANY(
        SELECT experiment_id FROM experiments where lifecycle_stage="deleted"
    )
);
DELETE FROM metrics WHERE run_uuid=ANY(
    SELECT run_uuid FROM runs WHERE experiment_id=ANY(
        SELECT experiment_id FROM experiments where lifecycle_stage="deleted"
    )
);
DELETE FROM tags WHERE run_uuid=ANY(
    SELECT run_uuid FROM runs WHERE experiment_id=ANY(
        SELECT experiment_id FROM experiments where lifecycle_stage="deleted"
    )
);
DELETE FROM runs WHERE experiment_id=ANY(
    SELECT experiment_id FROM experiments where lifecycle_stage="deleted"
);
DELETE FROM experiments where lifecycle_stage="deleted";

À partir de la version actuelle de la documentation (1.7.2), ils remarquent:

Il est recommandé d'utiliser une tâche cron ou un autre mécanisme de flux de travail pour effacer le dossier .trash .

Base de données SQL:

C'est plus délicat, car certaines dépendances doivent être supprimées. J'utilise MySQL et ces commandes fonctionnent pour moi:

rm -rf mlruns/.trash/*


0 commentaires

3
votes

Depuis mlflow 1.11.0, la méthode recommandée pour supprimer définitivement les exécutions dans une expérience est: mlflow gc [OPTIONS] .

À partir de la documentation, mlflow gc

Supprimer définitivement les exécutions à l'étape du cycle de vie supprimé du magasin backend spécifié. Cette commande supprime tous les artefacts et métadonnées associés aux exécutions spécifiées.


1 commentaires

Il ne fonctionne pas avec le backend SQL: mlflow.exceptions.MlflowException: Ce cli ne peut être utilisé qu'avec un backend qui permet la suppression définitive des exécutions



0
votes

En prolongeant la réponse de @Lee Netherton , vous pouvez utiliser PyMySQL pour exécuter ces requêtes et supprimer toutes les métadonnées du serveur de suivi MLFlow après avoir supprimé l'expérience du client de suivi MLFlow.

import pymysql

def perm_delete_exp():
    connection = pymysql.connect(
        host='localhost',
        user='user',
        password='password',
        db='mlflow',
        cursorclass=pymysql.cursors.DictCursor)
    with connection.cursor() as cursor:
        queries = """
            USE mlflow;
            DELETE FROM experiment_tags WHERE experiment_id=ANY(SELECT experiment_id FROM experiments where lifecycle_stage="deleted");
            DELETE FROM latest_metrics WHERE run_uuid=ANY(SELECT run_uuid FROM runs WHERE experiment_id=ANY(SELECT experiment_id FROM experiments where lifecycle_stage="deleted"));
            DELETE FROM metrics WHERE run_uuid=ANY(SELECT run_uuid FROM runs WHERE experiment_id=ANY(SELECT experiment_id FROM experiments where lifecycle_stage="deleted"));
            DELETE FROM tags WHERE run_uuid=ANY(SELECT run_uuid FROM runs WHERE experiment_id=ANY(SELECT experiment_id FROM experiments where lifecycle_stage="deleted"));
            DELETE FROM runs WHERE experiment_id=ANY(SELECT experiment_id FROM experiments where lifecycle_stage="deleted");
            DELETE FROM experiments where lifecycle_stage="deleted";
        """
        for query in queries.splitlines()[1:-1]:
            cursor.execute(query.strip())
    connection.commit()
    connection.close()

Vous pouvez (peut-être devriez-vous) exécuter la requête entière à la fois, mais j'ai trouvé le débogage plus facile de cette façon.


0 commentaires

0
votes

J'ajoute des commandes SQL si vous souhaitez supprimer définitivement la corbeille de MLFlow si vous utilisez PostgreSQL comme stockage backend.

modifiez votre base de données MLFlow, par exemple en utilisant: \c mlflow puis:

DELETE FROM experiment_tags WHERE experiment_id=ANY(
    SELECT experiment_id FROM experiments where lifecycle_stage='deleted'
);
DELETE FROM latest_metrics WHERE run_uuid=ANY(
    SELECT run_uuid FROM runs WHERE experiment_id=ANY(
        SELECT experiment_id FROM experiments where lifecycle_stage='deleted'
    )
);
DELETE FROM metrics WHERE run_uuid=ANY(
    SELECT run_uuid FROM runs WHERE experiment_id=ANY(
        SELECT experiment_id FROM experiments where lifecycle_stage='deleted'
    )
);
DELETE FROM tags WHERE run_uuid=ANY(
    SELECT run_uuid FROM runs WHERE experiment_id=ANY(
        SELECT experiment_id FROM experiments where lifecycle_stage='deleted'
    )
);
DELETE FROM params WHERE run_uuid=ANY(
    SELECT run_uuid FROM runs where experiment_id=ANY(
        SELECT experiment_id FROM experiments where lifecycle_stage='deleted'
));
DELETE FROM runs WHERE experiment_id=ANY(
    SELECT experiment_id FROM experiments where lifecycle_stage='deleted'
);
DELETE FROM experiments where lifecycle_stage='deleted';

La différence est que j'ai ajouté la commande "params" Table SQL Delete ici.


0 commentaires