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.
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 denumpy.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
ModelProto
modèle d’arbre de décision entraînéscikit-learn
avec un objetDecisionTreeClassifier
. Utilisezmlflow.<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 fonctionpredict
.MLflow garantit que vous pouvez appeler cette fonction à l’aide d’arguments de type
pandas.DataFrame
,numpy.ndarray
oudict[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. Utilisezmlflow.pyfunc.load_model()
afin de recharger un modèle pour l’inférence en cours d’exécution.