Log model dependencies
Dans cet article, vous apprendrez comment enregistrer un modèle et ses dépendances en tant qu'artefacts de modèle, afin qu'ils soient disponibles dans votre environnement pour les tâches de production telles que la mise à disposition de modèles.
Enregistrer les dépendances de modèle de package Python
MLflow offre une prise en charge native pour certaines bibliothèques ML Python, où MLflow peut Log de manière fiable les dépendances pour les modèles qui utilisent ces bibliothèques. Voir saveurs de modèles intégrées.
Par exemple, MLflow prend en charge scikit-learn dans le module mlflow.sklearn et la commande mlflow.sklearn.log_model Enregistre la version sklearn. Il en va de même pour le log automatique avec ces bibliothèques ML. Consultez le repository GitHub MLflow pour des exemples supplémentaires.
Pour activer la journalisation des traces pour les charges de travail d’IA générative, MLflow prend en charge l’ autologging OpenAI.
Pour les bibliothèques ML qui peuvent être installées avec pip install PACKAGE_NAME==VERSION, mais qui n'ont pas de variantes de modèle MLflow intégrées, vous pouvez journaliser ces packages en utilisant mlflow.pyfunc.log_model méthode. Assurez-vous de journaliser les exigences avec la version exacte de la bibliothèque, par exemple, f"nltk=={nltk.__version__}" au lieu de simplement nltk.
mlflow.pyfunc.log_model prend en charge la journalisation pour :
- Bibliothèques publiques et personnalisées packagées sous forme de fichiers Python egg ou Python wheel.
- Packages publics sur PyPI et packages hébergés en privé sur votre propre serveur PyPI.
Avec mlflow.pyfunc.log_model, MLflow tente de déduire automatiquement les dépendances. MLflow déduit les dépendances à l'aide de mlflow.models.infer_pip_requirements, et les Logs dans un fichier requirements.txt en tant qu'artefact de modèle.
Dans les anciennes versions, MLflow n'identifie parfois pas toutes les exigences Python automatiquement, surtout si la bibliothèque n'est pas un modèle intégré. Dans ces cas, vous pouvez spécifier des dépendances supplémentaires avec le parameter extra_pip_requirements dans la commande log_model. Voir un exemple d'utilisation du parameter extra_pip_requirements.
Vous pouvez également remplacer l’ensemble des exigences avec les paramètres conda_env et pip_requirements, mais cela est généralement déconseillé, car cela annule les dépendances que MLflow détecte automatiquement. Voir un exemple d'utilisation du pip_requirements paramètre pour outrepasser les exigences.
Journalisation de modèle personnalisée
Pour les scénarios où une journalisation des modèles plus personnalisée est nécessaire, vous pouvez :
-
Écrivez un modèle Python personnalisé. Ceci vous permet de créer une sous-classe de
mlflow.pyfunc.PythonModelpour personnaliser l'initialisation et la prédiction. Cette approche fonctionne bien pour la personnalisation de modèles uniquement Python.- Pour un exemple simple, consultez l'exemple de modèle d'ajout N.
- Pour un exemple plus complexe, consultez l’ exemple de modèle XGBoost personnalisé.
-
Écrire une saveur personnalisée. Dans ce scénario, vous pouvez personnaliser la journalisation plus que le type générique
pyfunc, mais cela nécessite plus d'efforts d'implémentation.
Code Python personnalisé
Vous pouvez avoir des dépendances de code Python qui ne peuvent pas être installées à l'aide de la commande %pip install, comme un ou plusieurs fichiers .py.
Lors de l'enregistrement d'un modèle, vous pouvez indiquer à MLflow que le modèle peut trouver ces dépendances à un chemin spécifié en utilisant le parameter code_paths (ou code_path dans MLflow 2.x) dans mlflow.pyfunc.log_model. MLflow stocke tous les fichiers ou répertoires passés à l'aide de code_paths ou code_path comme artefacts avec le modèle dans un répertoire de code. Lors du chargement du modèle, MLflow ajoute ces fichiers ou répertoires au chemin Python. Cette route fonctionne également avec des fichiers Python wheel personnalisés, qui peuvent être inclus dans le modèle à l'aide de code_paths ou code_path, tout comme les fichiers .py.
- MLflow 3
- MLflow 2.x
mlflow.pyfunc.log_model(
name=name,
code_paths=[filename.py],
data_path=data_path,
conda_env=conda_env,
)
mlflow.pyfunc.log_model(
artifact_path=artifact_path,
code_path=[filename.py],
data_path=data_path,
conda_env=conda_env,
)
Enregistrer les dépendances directes et transitives
Avec MLflow 3, vous pouvez choisir d'enregistrer les dépendances directes et transitives en définissant la variable d'environnement MLFLOW_LOCK_MODEL_DEPENDENCIES.
import os
os.environ["MLFLOW_LOCK_MODEL_DEPENDENCIES"] = "true"
# Now when you log your model, MLflow captures
# both direct and transitive dependencies
mlflow.sklearn.log_model(
model,
"my_model",
)
Journaliser les dépendances de modèle de package non-Python
MLflow ne détecte pas automatiquement les dépendances non Python, telles que les packages Java, les packages R et les packages natifs (tels que les packages Linux). Pour ces packages, vous devez enregistrer des données supplémentaires.
- Liste des dépendances : Databricks recommande d'enregistrer un artefact avec le modèle spécifiant ces dépendances non Python. Il peut s'agir d'un simple fichier
.txtou.json. mlflow.pyfunc.log_model vous permet de spécifier cet artefact supplémentaire à l'aide de l'argumentartifacts. - Packages personnalisés : comme pour les dépendances Python personnalisées ci-dessus, vous devez vous assurer que les packages sont disponibles dans votre environnement de déploiement. Pour les packages dans un emplacement central tel que Maven Central ou votre propre repository, assurez-vous que l'emplacement est disponible au moment de la notation ou du service. Pour les packages privés non hébergés ailleurs, vous pouvez enregistrer les packages avec le modèle en tant qu'artefacts.
Déployer des modèles avec des dépendances
Lorsque vous déployez un modèle à partir de MLflow Tracking Server ou de Model Registry, vous devez vous assurer que l’environnement de déploiement dispose des dépendances appropriées installées. Le chemin le plus simple peut dépendre de votre mode de déploiement : batch/streaming ou service en ligne, et des types de dépendances.
Pour tous les modes de déploiement, Databricks recommande d'exécuter l'inférence sur la même version du runtime que celle que vous avez utilisée pendant l'entraînement, car le Databricks Runtime dans lequel vous avez créé votre modèle dispose de diverses bibliothèques déjà installées. MLflow dans Databricks enregistre automatiquement cette version du runtime dans le fichier de métadonnées MLmodel dans un champ databricks_runtime, tel que databricks_runtime: 10.2.x-cpu-ml-scala2.12.
Service en ligne : Model Serving
Databricks propose Model Serving, où vos Modèle de machine learning MLflow sont exposés en tant qu'Endpoint d'API REST évolutifs.
Pour les dépendances Python dans le fichier requirements.txt, Databricks et MLflow gèrent tout pour les dépendances PyPI publiques. De même, si vous avez spécifié des fichiers .py ou des fichiers Python wheel lors de l'enregistrement du modèle en utilisant code_paths (ou code_path dans MLflow 2.x), MLflow charge ces dépendances pour vous automatiquement.
Les runtimes Databricks Runtime ML incluent mlflow-skinny default plutôt que le package mlflow complet. Lorsque vous enregistrez un modèle pyfunc sur l'un de ces runtimes sans spécifier pip_requirements, MLflow capture mlflow-skinny dans le conda.yaml du modèle, et Model Serving ne peut pas créer l'image conteneur car il nécessite mlflow. Spécifiez mlflow==<version> dans pip_requirements lorsque vous log le modèle. Pour plus de détails, voir Déployer du code Python avec Model Serving.
Pour ces scénarios de service de modèle, consultez ce qui suit :
- Utilisez des bibliothèques Python personnalisées avec Model Serving.
- Packager des artefacts et des fichiers personnalisés pour Model Serving
Service en ligne : systèmes tiers ou conteneurs Docker
Si votre scénario nécessite un service vers des solutions tierces ou votre propre solution basée sur Docker, vous pouvez exporter votre modèle en tant que conteneur Docker.
Databricks recommande ce qui suit pour le service tiers qui gère automatiquement les dépendances Python. Cependant, pour les dépendances non Python, le conteneur doit être modifié pour les inclure.
-
Intégration Docker de MLflow pour la solution de service basée sur Docker : MLflow models build-docker
-
Intégration de MLflow à SageMaker : API mlflow.sagemaker
Jobs batch et streaming
Le scoring batch et streaming doit être exécuté en tant que Lakeflow Jobs. Un Notebook Job suffit souvent, et la façon la plus simple de préparer le code est d'utiliser le Model Registry Databricks pour générer un Notebook de notation.
Ce qui suit décrit le processus et les étapes à suivre pour s'assurer que les dépendances sont installées et appliquées en conséquence :
-
start votre cluster de scoring avec la même version de Databricks Runtime utilisée pendant l'entraînement. Lisez le champ
databricks_runtimedu fichier de métadonnéesMLmodel, et start un cluster avec cette version d'exécution.- Cela peut être fait manuellement dans la configuration du cluster ou automatisé avec une logique personnalisée. Pour l’automatisation, le format de version du runtime que vous lisez à partir du fichier de métadonnées dans l’ API Jobs et l’ API Clusters.
-
Ensuite, installez toutes les dépendances non Python. Pour vous assurer que vos dépendances non-Python sont accessibles à votre environnement de déploiement, vous pouvez :
- Installez manuellement les dépendances non-Python de votre modèle sur le cluster Databricks dans le cadre de la configuration du cluster avant d'exécuter l'inférence.
- Vous pouvez également écrire une logique personnalisée dans votre déploiement de Job d'évaluation pour automatiser l'installation des dépendances sur votre cluster. En supposant que vous ayez enregistré vos dépendances de package non Python en tant qu'artefacts, comme décrit dans Journaliser les dépendances de modèle de package non Python, cette automatisation peut installer des bibliothèques à l'aide de l'API Bibliothèques. Ou, vous pouvez écrire du code spécifique pour générer un script d'initialisation en cluster pour installer les dépendances.
-
Votre Job de scoring installe les dépendances Python dans l'environnement d'exécution du Job. Dans Databricks, le Model Registry vous permet de générer un notebook pour l'inférence qui le fait pour vous.
- Lorsque vous utilisez le Databricks Model Registry pour générer un notebook de scoring, le notebook contient du code pour installer les dépendances Python dans le fichier
requirements.txtdu modèle. Pour votre Job Notebook pour la notation batch ou streaming, ce code initialise votre environnement Notebook, de sorte que les dépendances du modèle soient installées et prêtes pour votre modèle.
- Lorsque vous utilisez le Databricks Model Registry pour générer un notebook de scoring, le notebook contient du code pour installer les dépendances Python dans le fichier
-
MLflow gère tout code Python personnalisé inclus dans
code_paths(oucode_pathdans MLflow 2.x) danslog_model. Ce code est ajouté au chemin d'accès Python lorsque la méthodepredict()du modèle est appelée. Vous pouvez également le faire manuellement en :- Appel de mlflow.pyfunc.spark_udf avec l'argument
env_manager=['virtualenv'/'conda']. - Extraction des exigences à l'aide de mlflow.pyfunc.get_model_dependencies et en les installant en utilisant %pip install.
- Appel de mlflow.pyfunc.spark_udf avec l'argument
Si vous avez spécifié des fichiers .py ou des fichiers Python wheel lors de l'enregistrement du modèle à l'aide de code_paths ou code_path, MLflow charge automatiquement ces dépendances pour vous.