Partager via


Artefacts et modèles dans MLflow

Cet article explique les artefacts MLflow et les modèles MLflow et comment les modèles MLflow diffèrent d’autres artefacts. L’article explique également comment Azure Machine Learning utilise les caractéristiques d’un modèle MLflow pour simplifier les workflows de déploiement.

Artefacts et modèles

Dans MLflow, il existe des différences fondamentales entre la journalisation des artefacts de fichiers simples et la journalisation des modèles MLflow.

Artefact

Un artefact est un fichier généré et capturé à partir de l’exécution d’une expérience ou d’un travail. Un artefact peut être un modèle sérialisé en tant que fichier Pickle, les pondérations d’un modèle PyTorch ou TensorFlow, ou un fichier texte contenant les coefficients d’une régression linéaire. Certains artefacts n’ont rien à voir avec le modèle lui-même, mais contiennent des configurations d’exécution, des informations de prétraitement ou des exemples de données. Les artefacts peuvent avoir différents formats.

L’exemple suivant enregistre un artefact de fichier.

filename = 'model.pkl'
with open(filename, 'wb') as f:
  pickle.dump(model, f)

mlflow.log_artifact(filename)

Modèle

Un modèle MLflow est un artefact pour lequel vous effectuez des hypothèses plus fortes qui fournissent un contrat clair entre les fichiers enregistrés et ce qu’ils signifient. Toutefois, si vous consignez les fichiers de votre modèle en tant qu’artefacts, vous devez savoir ce que chacun des fichiers signifie et comment les charger pour l’inférence.

Vous pouvez consigner des modèles MLflow à l’aide du Kit de développement logiciel (SDK) MLflow, par exemple :

import mlflow
mlflow.sklearn.log_model(sklearn_estimator, "classifier")

La journalisation des modèles MLflow dans Azure Machine Learning présente les avantages suivants :

  • Vous pouvez déployer des modèles MLflow en temps réel ou par lots sans fournir de script de scoring ni d’environnement.
  • Lorsque vous déployez des modèles MLflow, les déploiements génèrent automatiquement un fichier swagger. Vous pouvez donc utiliser la fonctionnalité Test dans Azure Machine Learning Studio.
  • Vous pouvez utiliser les modèles MLflow directement comme entrées de pipeline.
  • Vous pouvez utiliser le tableau de bord IA responsable avec les modèles MLflow.

Le format MLModel

Pour les modèles enregistrés sous forme de fichiers d’artefact simples, vous devez savoir ce que le générateur de modèles a prévu pour chaque fichier avant de pouvoir charger le modèle pour l’inférence. Toutefois, pour les modèles MLflow, vous chargez le modèle à l’aide du format MLmodel pour spécifier le contrat entre les artefacts et ce qu’ils représentent.

Le format MLmodel stocke les ressources dans un dossier qui n’a aucune exigence de nommage spécifique. Parmi les ressources, il s’agit d’un fichier nommé MLmodel qui est la source unique de vérité pour la façon de charger et d’utiliser le modèle.

L’image suivante montre un dossier de modèle MLflow appelé credit_defaults_model dans Azure Machine Learning Studio. Le dossier contient le fichier MLmodel et d’autres artefacts de modèle.

Capture d’écran montrant les ressources d’un exemple de modèle MLflow, y compris le fichier MLmodel.

L’exemple suivant montre un fichier MLmodel pour un modèle vision par ordinateur formé avec fastai :

artifact_path: classifier
flavors:
  fastai:
    data: model.fastai
    fastai_version: 2.4.1
  python_function:
    data: model.fastai
    env: conda.yaml
    loader_module: mlflow.fastai
    python_version: 3.8.12
model_uuid: e694c68eba484299976b06ab9058f636
run_id: e13da8ac-b1e6-45d4-a9b2-6a0a5cfac537
signature:
  inputs: '[{"type": "tensor",
             "tensor-spec": 
                 {"dtype": "uint8", "shape": [-1, 300, 300, 3]}
           }]'
  outputs: '[{"type": "tensor", 
              "tensor-spec": 
                 {"dtype": "float32", "shape": [-1,2]}
            }]'

Saveurs des modèles

Compte tenu du grand nombre de frameworks d’apprentissage automatique disponibles, MLflow a introduit le concept de saveur comme moyen de fournir un contrat unique pour toutes les infrastructures d’apprentissage automatique. Une saveur indique ce qu’il faut attendre pour un modèle donné créé avec une infrastructure spécifique. Par exemple, TensorFlow a sa propre saveur, qui spécifie comment conserver et charger un modèle TensorFlow.

Étant donné que chaque saveur de modèle indique comment conserver et charger celui-ci pour un framework donné, le format MLModel n’impose pas un même mécanisme de sérialisation que tous les modèles doivent prendre en charge. En conséquence, cette décision permet à chaque saveur d’utiliser les méthodes produisant les meilleures performances ou la meilleure prise en charge en fonction de leurs meilleures pratiques, sans compromettre la compatibilité avec la norme MLModel.

L’exemple suivant montre la section flavors d’un modèle fastai.

flavors:
  fastai:
    data: model.fastai
    fastai_version: 2.4.1
  python_function:
    data: model.fastai
    env: conda.yaml
    loader_module: mlflow.fastai
    python_version: 3.8.12

Signature de modèle

Une signature de modèle dans MLflow est une partie importante de la spécification du modèle, car elle sert de contrat de données entre le modèle et le serveur qui exécute le modèle. Une signature de modèle est également importante pour analyser et appliquer les types d’entrée d’un modèle au moment du déploiement. Si une signature est disponible, MLflow applique les types d’entrée quand les données sont soumises à votre modèle. Pour plus d’informations, consultez Application d’une signature MLflow.

Les signatures sont indiquées au moment où les modèles sont enregistrés et sont conservés dans la section signature du fichier MLmodel. La fonctionnalité de journal automatique dans MLflow fait automatiquement un meilleur effort pour déduire les signatures. Toutefois, vous pouvez journaliser manuellement les modèles si les signatures déduites ne sont pas celles dont vous avez besoin. Pour plus d’informations, consultez Comment enregistrer des modèles avec des signatures.

Il existe deux types de signatures :

  • Les signatures basées sur des colonnes fonctionnent sur des données tabulaires. Pour les modèles avec ce type de signature, MLflow fournit des objets pandas.DataFrame comme entrées.
  • Les signatures basées sur Tensor fonctionnent avec des tableaux ou des tenseurs n-dimensionnels. Pour les modèles avec cette signature, MLflow fournit numpy.ndarray en guise d’entrées (ou un dictionnaire de numpy.ndarray pour les tenseurs nommés).

L’exemple suivant montre la section signature d’un modèle vision par ordinateur entraîné avec fastai. Ce modèle reçoit un lot d’images représentées comme des tenseurs de forme (300, 300, 3) avec la représentation RVB de celles-ci (entiers non signés). Le modèle génère des lots de prédictions sous forme de probabilités pour deux classes.

signature:
  inputs: '[{"type": "tensor",
             "tensor-spec": 
                 {"dtype": "uint8", "shape": [-1, 300, 300, 3]}
           }]'
  outputs: '[{"type": "tensor", 
              "tensor-spec": 
                 {"dtype": "float32", "shape": [-1,2]}
            }]'

Conseil

Azure Machine Learning génère un fichier Swagger pour un déploiement d’un modèle MLflow disposant d’une signature disponible. Ce fichier rend plus facile de tester les déploiements en utilisant Azure Machine Learning studio.

Environnement de modèle

Les conditions requises pour l’exécution du modèle sont spécifiées dans le fichier conda.yaml. MLflow peut détecter automatiquement les dépendances ou bien vous pouvez les indiquer manuellement en appelant la méthode mlflow.<flavor>.log_model(). L’appel de la méthode peut être utile si les bibliothèques incluses dans votre environnement ne sont pas celles que vous souhaitez utiliser.

L’exemple conda.yaml suivant montre un environnement pour un modèle créé avec l’infrastructure fastai :

channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
  - mlflow
  - astunparse==1.6.3
  - cffi==1.15.0
  - configparser==3.7.4
  - defusedxml==0.7.1
  - fastai==2.4.1
  - google-api-core==2.7.1
  - ipython==8.2.0
  - psutil==5.9.0
name: mlflow-env

Remarque

Un environnement MLflow fonctionne au niveau du modèle, mais un environnement Azure Machine Learning fonctionne au niveau de l'espace de travail pour les environnements enregistrés ou au niveau des travaux/déploiements pour les environnements anonymes. Lorsque vous déployez des modèles MLflow, Azure Machine Learning génère l’environnement de modèle et l’utilise pour le déploiement. Vous pouvez utiliser l’interface CLI Azure Machine Learning pour remplacer ce comportement et déployer des modèles MLflow dans un environnement Azure Machine Learning spécifique.

Fonction predict

Tous les modèles MLflow contiennent une fonction predict, appelée lorsque le modèle est déployé à l’aide d’un déploiement sans code. Ce que la fonction retourne predict, des classes, des probabilités ou une prédiction dépend de l’infrastructure ou de la de la saveur utilisée pour l’apprentissage. La documentation de chaque saveur décrit ce qu’elle retourne.

Vous pouvez personnaliser la fonction predict pour modifier la façon dont l’inférence est exécutée. Vous pouvez enregistrer des modèles avec un comportement différent ou enregistrer une saveur de modèle personnalisée.

Workflows pour le chargement de modèles MLflow

Vous pouvez charger des modèles MLflow à partir des emplacements suivants :

  • Directement depuis l’exécution où les modèles ont été enregistrés
  • Depuis le système de fichiers où les modèles sont enregistrés
  • Depuis le registre de modèles où les modèles sont inscrits.

MLflow offre un moyen cohérent de charger ces modèles, quel que soit leur emplacement.

Il existe deux flux de travail pour le chargement de modèles :

  • Chargez le même objet et les mêmes types enregistrés. Vous pouvez charger des modèles à l’aide du Kit de développement logiciel (SDK) MLflow et obtenir une instance du modèle avec des types appartenant à la bibliothèque d’entraînement. Par exemple, un modèle ONNX (Open Neural Network Exchange) retourne un ModelProtomodèle d’arbre de décision entraînéscikit-learn avec un objet DecisionTreeClassifier. Utilisez mlflow.<flavor>.load_model() pour recharger le même objet et les mêmes types de modèle que ceux qui ont été enregistrés.

  • Recharger un modèle pour l’inférence en cours d’exécution. Vous pouvez charger des modèles à l’aide du Kit de développement logiciel (SDK) MLflow et obtenir un wrapper qui a une fonction garantie predict. Quelle que soit la saveur que vous utilisez, puisque chaque modèle MLflow a une fonction predict.

    MLflow garantit que vous pouvez appeler cette fonction à l’aide d’arguments de type pandas.DataFrame, numpy.ndarray ou dict[string, numpyndarray], en fonction de la signature du modèle. MLflow gère la conversion de type vers le type d’entrée attendu par le modèle. Utilisez mlflow.pyfunc.load_model() afin de recharger un modèle pour l’inférence en cours d’exécution.