Partager via


Déployer du code Python avec une mise en service de modèles

Cet article explique comment déployer du code Python avec une Mise en service de modèles.

La fonction Python de MLflow, pyfunc, offre une flexibilité pour déployer n’importe quel élément de code ou modèle Python. Voici des exemples de scénarios dans lesquels vous pouvez utiliser le guide.

  • Votre modèle nécessite un prétraitement avant que les entrées puissent être passées à la fonction de prédiction du modèle.
  • L’infrastructure de votre modèle n’est pas prise en charge en mode natif par MLflow.
  • Votre application nécessite que les sorties brutes du modèle soient post-traitées pour être consommées.
  • Le modèle lui-même a une logique de branchement par requête.
  • Vous cherchez à déployer du code entièrement personnalisé en tant que modèle.

Construction d’un modèle personnalisé de fonction Python MLflow

MLflow offre la possibilité de journaliser le code Python dans le format personnalisé des modèles Python.

Il existe deux fonctions requises lors de l’empaquetage du 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. Cela est essentiel pour que le système réduise le nombre d’artefacts chargés au minimum pendant la fonction predict, ce qui accélère l’inférence.
  • predict : cette fonction héberge toute la logique qui est exécutée chaque fois qu’une requête d’entrée est effectuée.

Journaliser le modèle de votre fonction Python

Même si vous écrivez votre modèle avec du code personnalisé, il est possible d’utiliser des modules de code partagés à partir de votre organisation. Avec le paramètre code_path, les créateurs de modèles peuvent consigner des références de code complètes qui se chargent dans le chemin d’accès et sont utilisables à partir d’autres modèles personnalisés pyfunc.

Par exemple, si un modèle est journalisé avec :

mlflow.pyfunc.log_model(CustomModel(), "model", code_path = ["preprocessing_utils/"])

Le code de 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)

Servir votre modèle

Une fois que vous avez journalisé votre modèle personnalisé pyfunc, vous pouvez l’inscrire dans le Unity Catalog ou le registre de l’espace de travail et servir votre modèle sur un point de terminaison 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 interrogé doit être post-traitée pour être consommée.

Personnaliser la sortie de service du modèle avec le notebook PyFunc MLflow

Obtenir le notebook