Modèle MLflow servant sur Azure Databricks

Important

Cette fonctionnalité est disponible en préversion publique.

MLflow Model serv vous permet d’héberger des modèles de Machine Learning à partir du registre de modèle en tant que points de terminaison REST mis à jour automatiquement en fonction de la disponibilité des versions de modèle et de leurs étapes.

Quand vous activez le service de modèle pour un modèle inscrit donné, Azure Databricks crée automatiquement un cluster unique pour le modèle et déploie toutes les versions non archivées du modèle sur ce cluster. Azure Databricks redémarre le cluster si une erreur se produit et met fin au cluster lorsque vous désactivez les modèles desservis pour le modèle. Le modèle desservant les synchronisations automatiques avec le registre de modèles et déploie toutes les nouvelles versions de modèles inscrites. Les versions de modèle déployées peuvent être interrogées à l’aide d’une demande d’API REST standard. Azure Databricks authentifie les demandes au modèle à l’aide de son authentification standard.

Bien que ce service soit en version préliminaire, Databricks recommande son utilisation pour des applications à débit faible et non critiques. Le débit cible est de 200 RPS et la disponibilité cible est de 99,5%, même si aucune garantie n’est faite pour l’une ou l’autre. En outre, il existe une limite de taille de charge utile de 16 Mo par demande.

Chaque version de modèle est déployée à l’aide du déploiement de modèle MLflow et s’exécute dans un environnement Conda spécifié par ses dépendances.

Notes

  • Le cluster est conservé tant que le service est activé, même s’il n’existe pas de version de modèle active. Pour terminer le cluster de service, désactivez le modèle desservant le modèle inscrit.
  • Le cluster est considéré comme un cluster à usage général, en fonction de la tarification de la charge de travail à usage général.
  • Les scripts init globaux ne sont pas exécutés sur les clusters.

Configuration requise

  • La mise en service de modèles MLflow est disponible pour les modèles MLflow Python. Vous devez déclarer toutes les dépendances de modèle dans l’environnement Conda.
  • Pour activer le service de modèle, vous devez disposer de l' autorisation de création de cluster.

Modèle de service à partir du registre de modèle

Le service de modèle est disponible dans Azure Databricks à partir du registre de modèles.

Activer et désactiver les services de modèles

Vous pouvez activer un modèle pour servir à partir de sa page de modèle inscrite.

  1. Cliquez sur l’onglet service . Si le modèle n’est pas déjà activé pour servir, le bouton activer les services s’affiche.

    Bouton Activer service

  2. Cliquez sur activer service. L’onglet service s’affiche avec l' État en attente. Après quelques minutes, l' État passe à prêt.

Pour désactiver un modèle à des fins de service, cliquez sur arrêter.

Valider le service de modèle

À partir de l’onglet service , vous pouvez envoyer une demande au modèle pris en charge et afficher la réponse.

Activer le service

URI de version de modèle

Chaque version de modèle déployée est affectée à un ou plusieurs URI uniques. Au minimum, chaque version de modèle est assignée à un URI construit comme suit :

<databricks-instance>/model/<registered-model-name>/<model-version>/invocations

Par exemple, pour appeler la version 1 d’un modèle enregistré en tant que iris-classifier , utilisez l’URI suivant :

https://<databricks-instance>/model/iris-classifier/1/invocations

Vous pouvez également appeler une version de modèle par son intermédiaire. Par exemple, si la version 1 est à l’étape de production , elle peut également être notée à l’aide de l’URI suivant :

https://<databricks-instance>/model/iris-classifier/Production/invocations

La liste des URI de modèle disponibles apparaît en haut de l’onglet versions de modèle sur la page service.

Gérer les versions prises en charge

Toutes les versions de modèle actives (non archivées) sont déployées et vous pouvez les interroger à l’aide des URI. Azure Databricks déploie automatiquement les nouvelles versions de modèle lorsqu’elles sont inscrites et supprime automatiquement les anciennes versions lorsqu’elles sont archivées.

Notes

Toutes les versions déployées d’un modèle inscrit partagent le même cluster.

Gérer les droits d’accès au modèle

Les droits d’accès au modèle sont hérités du registre de modèles. L’activation ou la désactivation de la fonctionnalité service nécessite l’autorisation « Manage » sur le modèle inscrit. Toute personne disposant de droits de lecture peut noter toutes les versions déployées.

Noter les versions de modèle déployées

Pour noter un modèle déployé, vous pouvez utiliser l’interface utilisateur ou envoyer une demande d’API REST à l’URI du modèle.

Score via l’interface utilisateur

Il s’agit de la méthode la plus simple et la plus rapide pour tester le modèle. Vous pouvez insérer les données d’entrée du modèle au format JSON, puis cliquer sur Envoyer la demande. Si le modèle a été enregistré avec un exemple d’entrée (comme indiqué dans le graphique ci-dessus), cliquez sur charger l’exemple pour charger l’exemple d’entrée.

Score via une demande d’API REST

Vous pouvez envoyer une demande de notation par le biais de l’API REST à l’aide de l' authentification Databricks standard. Les exemples ci-dessous illustrent l’authentification à l’aide d’un jeton d’accès personnel.

À partir de MODEL_VERSION_URI Like https://<databricks-instance>/model/iris-classifier/Production/invocations (où <databricks-instance> est le nom de votre instance Databricks) et d’un jeton d’API REST Databricks appelé DATABRICKS_API_TOKEN , voici quelques exemples d’extraits de code illustrant l’interrogation d’un modèle servi :

Bash

Extrait pour interroger un modèle acceptant les entrées tableau.

curl -X POST -u token:$DATABRICKS_API_TOKEN $MODEL_VERSION_URI \
  -H 'Content-Type: application/json' \
  -d '[
    {
      "sepal_length": 5.1,
      "sepal_width": 3.5,
      "petal_length": 1.4,
      "petal_width": 0.2
    }
  ]'

Extrait pour interroger un modèle acceptant les entrées tenseur. Les entrées tenseur doivent être formatées comme décrit dans les documents d’API du service TensorFlow.

curl -X POST -u token:$DATABRICKS_API_TOKEN $MODEL_VERSION_URI \
   -H 'Content-Type: application/json' \
   -d '{"inputs": [[5.1, 3.5, 1.4, 0.2]]}'

Python

import numpy as np
import pandas as pd
import requests

def create_tf_serving_json(data):
  return {'inputs': {name: data[name].tolist() for name in data.keys()} if isinstance(data, dict) else data.tolist()}

def score_model(model_uri, databricks_token, data):
  headers = {
    "Authorization": f"Bearer {databricks_token}",
    "Content-Type": "application/json",
  }
  data_json = data.to_dict(orient='records') if isinstance(data, pd.DataFrame) else create_tf_serving_json(data)
  response = requests.request(method='POST', headers=headers, url=model_uri, json=data_json)
  if response.status_code != 200:
      raise Exception(f"Request failed with status {response.status_code}, {response.text}")
  return response.json()

# Scoring a model that accepts pandas DataFrames
data =  pd.DataFrame([{
  "sepal_length": 5.1,
  "sepal_width": 3.5,
  "petal_length": 1.4,
  "petal_width": 0.2
}])
score_model(MODEL_VERSION_URI, DATABRICKS_API_TOKEN, data)

# Scoring a model that accepts tensors
data = np.asarray([[5.1, 3.5, 1.4, 0.2]])
score_model(MODEL_VERSION_URI, DATABRICKS_API_TOKEN, data)

Powerbi

vous pouvez noter un jeu de données dans Power BI Desktop en procédant comme suit :

  1. Ouvrez le jeu de données dont vous souhaitez évaluer le score.

  2. Accédez à transformer les données.

  3. Cliquez avec le bouton droit dans le volet gauche et sélectionnez créer une nouvelle requête.

  4. Accédez à afficher > éditeur avancé.

  5. Remplacez le corps de la requête par l’extrait de code ci-dessous, après avoir rempli un DATABRICKS_API_TOKEN et approprié MODEL_VERSION_URI .

    (dataset as table ) as table =>
    let
      call_predict = (dataset as table ) as list =>
      let
        apiToken = DATABRICKS_API_TOKEN,
        modelUri = MODEL_VERSION_URI,
        responseList = Json.Document(Web.Contents(modelUri,
          [
            Headers = [
              #"Content-Type" = "application/json",
              #"Authorization" = Text.Format("Bearer #{0}", {apiToken})
            ],
            Content = Json.FromValue(dataset)
          ]
        ))
      in
        responseList,
      predictionList = List.Combine(List.Transform(Table.Split(dataset, 256), (x) => call_predict(x))),
      predictionsTable = Table.FromList(predictionList, (x) => {x}, {"Prediction"}),
      datasetWithPrediction = Table.Join(
        Table.AddIndexColumn(predictionsTable, "index"), "index",
        Table.AddIndexColumn(dataset, "index"), "index")
    in
      datasetWithPrediction
    
  6. Nommez la requête avec le nom de modèle de votre choix.

  7. Ouvrez l’éditeur de requête avancé pour votre jeu de données et appliquez la fonction de modèle.

Pour plus d’informations sur les formats de données d’entrée acceptés par le serveur (par exemple, pandas-Oriented Split format), consultez la documentation MLflow.

Surveiller les modèles pris en charge

La page service affiche des indicateurs d’État pour le cluster service et des versions de modèle individuelles. En outre, vous pouvez utiliser les éléments suivants pour obtenir plus d’informations :

  • Pour inspecter l’état du cluster service, utilisez l’onglet événements de modèle , qui affiche une liste de tous les événements de service pour ce modèle.
  • Pour inspecter l’état d’une version de modèle unique, utilisez les onglets journaux ou événements de version sous l’onglet versions de modèle .

État de la version

Événements de modèle

Personnaliser le cluster service

pour personnaliser le cluster service, utilisez l’onglet Paramètres de cluster sous l’onglet service .

Paramètres de cluster

  • Pour modifier la taille de la mémoire et le nombre de cœurs d’un cluster service, utilisez le menu déroulant type d’instance pour sélectionner la configuration de cluster souhaitée. Lorsque vous cliquez sur Enregistrer, le cluster existant est arrêté et un nouveau cluster est créé avec les paramètres spécifiés.
  • Pour ajouter une balise, tapez le nom et la valeur dans les champs Ajouter une balise , puis cliquez sur Ajouter.
  • Pour modifier ou supprimer une balise existante, cliquez sur l’une des icônes dans la colonne actions du tableau des balises .

Erreurs connues

ResolvePackageNotFound: pyspark=3.1.0

Cette erreur peut se produire si un modèle dépend de pyspark et est enregistré à l’aide de Databricks Runtime 8. x. Si vous voyez cette erreur, spécifiez la pyspark version explicitement lors de l’enregistrement du modèle, à l’aide du conda_env paramètre.