Déployer du code Python avec Model Serving
Cet article décrit comment déployer votre code Python personnalisé avec Model Serving. L'exemple de cet article se concentre sur la fourniture de conseils pour l'ajout d'une logique de pré-traitement et de post-traitement à votre modèle et son déploiement.
La fonction Python de MLflow, pyfunc, offre la flexibilité de déployer n'importe quel morceau de code Python ou n'importe quel modèle Python. Voici des exemples de scénarios où vous pourriez vouloir utiliser le guide.
- Votre modèle nécessite un prétraitement avant que les entrées ne puissent être transmises à la fonction de prédiction du modèle.
- Votre framework de modèle n'est pas pris en charge en mode natif par MLflow.
- Votre application nécessite que les sorties brutes du modèle soient post-traitées pour la consommation.
- Le modèle lui-même dispose d'une logique de branchement par requête.
- Vous cherchez à déployer du code entièrement personnalisé en tant que modèle.
Créer un modèle de fonction Python MLflow personnalisé
MLflow offre la possibilité d'enregistrer du code Python avec le format de modèles Python personnalisés.
Il existe deux fonctions requises lors de l'empaquetage de code Python arbitraire avec MLflow :
load_context- tout ce qui doit être chargé une seule fois pour que le modèle fonctionne doit être défini dans cette fonction. Ceci est essentiel pour que le système minimise le nombre d'artefacts chargés pendant la fonctionpredict, ce qui accélère l'inférence.predict- cette fonction contient toute la logique qui est exécutée à chaque fois qu'une demande d'entrée est effectuée.
Avant de déployer votre code personnalisé en tant que modèle, il est avantageux de vérifier que le modèle est capable d'être servi. Consultez la documentation MLflow pour savoir comment utiliser mlflow.models.predict afin de valider les modèles avant le déploiement.
Journaliser votre modèle de fonction Python
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 environnements d'exécution sans spécifier pip_requirements, MLflow capture mlflow-skinny dans le conda.yaml du modèle. Model Serving nécessite mlflow (pas mlflow-skinny) dans conda.yaml et ne peut pas créer l'image de conteneur sinon. Spécifiez toujours mlflow==<version> dans pip_requirements lorsque vous appelez mlflow.pyfunc.log_model() sur un environnement d'exécution Databricks Runtime ML :
# DBR ML ships with mlflow-skinny by default, so specify mlflow explicitly
# to ensure Model Serving compatibility.
mlflow.pyfunc.log_model(
name="model",
python_model=your_model,
pip_requirements=["mlflow==3.8.1"], # use mlflow, not mlflow-skinny
registered_model_name="catalog.schema.model_name",
)
Même si vous écrivez votre modèle avec du code personnalisé, il est possible d'utiliser des modules de code partagés de votre organisation. Avec le code_path parameter, les auteurs de modèles peuvent enregistrer des références de code complètes qui se chargent dans le chemin et sont utilisables à partir d'autres modèles pyfunc personnalisés.
Par exemple, si un modèle est enregistré avec :
mlflow.pyfunc.log_model(CustomModel(), "model", code_path = ["preprocessing_utils/"])
Le code provenant du preprocessing_utils est disponible dans le contexte chargé du modèle. Voici un exemple de modèle qui utilise ce code.
class CustomModel(mlflow.pyfunc.PythonModel):
def load_context(self, context):
self.model = torch.load(context.artifacts["model-weights"])
from preprocessing_utils.my_custom_tokenizer import CustomTokenizer
self.tokenizer = CustomTokenizer(context.artifacts["tokenizer_cache"])
def format_inputs(self, model_input):
# insert some code that formats your inputs
pass
def format_outputs(self, outputs):
predictions = (torch.sigmoid(outputs)).data.numpy()
return predictions
def predict(self, context, model_input):
model_input = self.format_inputs(model_input)
outputs = self.model.predict(model_input)
return self.format_outputs(outputs)
Déployer votre modèle
Après avoir Log votre modèle pyfunc personnalisé, vous pouvez l'enregistrer dans Unity Catalog ou le registre du Workspace et mettre votre modèle à disposition via un Endpoint Model Serving.
Exemple de Notebook
L'exemple de Notebook suivant montre comment personnaliser la sortie du modèle lorsque la sortie brute du modèle query doit être post-traitée pour la consommation.