MLflow Model Serving på Azure Databricks

Viktigt

Den här funktionen finns som allmänt tillgänglig förhandsversion.

Med MLflow Model Serving kan du vara värd för maskininlärningsmodeller från Model Registry som REST-slutpunkter som uppdateras automatiskt baserat på tillgängligheten för modellversioner och deras faser.

När du aktiverar modell som betjänar en viss registrerad modell skapar Azure Databricks automatiskt ett unikt kluster för modellen och distribuerar alla icke-arkiverade versioner av modellen i klustret. Azure Databricks startar om klustret om ett fel inträffar och avslutar klustret när du inaktiverar modelltjänsten för modellen. Modellen som betjänar synkroniseras automatiskt med Model Registry och distribuerar alla nya registrerade modellversioner. Distribuerade modellversioner kan efterfrågas med en REST API begäran. Azure Databricks autentiserar begäranden till modellen med hjälp av dess standardautentisering.

När den här tjänsten är i förhandsversion rekommenderar Databricks att den används för program med lågt dataflöde och icke-kritiska program. Målets dataflöde är 200 qps och måltillgänglighet är 99,5 %, även om det inte finns någon garanti för detta. Dessutom finns det en storleksgräns för nyttolaster på 16 MB per begäran.

Varje modellversion distribueras med MLflow-modelldistribution och körs i en Conda-miljö som anges av dess beroenden.

Anteckning

  • Klustret underhålls så länge som betjänande är aktiverat, även om det inte finns någon aktiv modellversion. Om du vill avsluta det betjänande klustret inaktiverar du modelltjänsten för den registrerade modellen.
  • Klustret anses vara ett kluster för alla syften, enligt prissättningen för alla syften.
  • Globala init-skript körs inte på betjänande kluster.

Krav

  • MLflow Model Serving är tillgängligt för Python MLflow-modeller. Du måste deklarera alla modellberoenden i conda-miljön.
  • Om du vill aktivera modelltjänsten måste du ha behörighet att skapa kluster.

Modell som betjänas från Model Registry

Modell betjänar är tillgänglig i Azure Databricks från Model Registry.

Aktivera och inaktivera modellvisning

Du aktiverar en modell för att betjäna från den registrerade modellsidan.

  1. Klicka på fliken Betjänar. Om modellen inte redan är aktiverad för att betjäna visas knappen Aktivera betjänande.

    Knappen Aktivera betjänande

  2. Klicka på Aktivera betjänande. Fliken Betjänar visas med Status som Väntar. Efter några minuter ändras Status till Klar.

Om du vill inaktivera en modell för att betjäna klickar du på Stoppa.

Verifiera modell betjänar

På fliken Betjänar kan du skicka en begäran till den betjänade modellen och visa svaret.

Aktivera betjänande

URI:er för modellversion

Varje distribuerad modellversion tilldelas en eller flera unika URI:er. Varje modellversion tilldelas minst en URI som konstruerats på följande sätt:

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

Om du till exempel vill anropa version 1 av en modell registrerad som iris-classifier använder du den här URI:en:

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

Du kan också anropa en modellversion efter dess steg. Om till exempel version 1 är i produktionsfasen kan den också poängeras med hjälp av den här URI:en:

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

Listan över tillgängliga modell-URI:er visas överst på fliken Modellversioner på sidan som visas.

Hantera hanterade versioner

Alla aktiva (icke-arkiverade) modellversioner distribueras och du kan köra frågor mot dem med hjälp av URI:er. Azure Databricks automatiskt nya modellversioner när de registreras och tar automatiskt bort gamla versioner när de arkiveras.

Anteckning

Alla distribuerade versioner av en registrerad modell delar samma kluster.

Hantera åtkomstbehörigheter för modellen

Modellåtkomsträttigheter ärvs från Model Registry. Aktivering eller inaktivering av den betjänande funktionen kräver "hantera"-behörighet för den registrerade modellen. Vem som helst med läsbehörighet kan poängsätta vilken som helst av de distribuerade versionerna.

Poängsätta distribuerade modellversioner

Om du vill poängsätta en distribuerad modell kan du använda användargränssnittet eller skicka REST API begäran till modellens URI.

Poäng via användargränssnitt

Det här är det enklaste och snabbaste sättet att testa modellen. Du kan infoga modellens indata i JSON-format och klicka på Skicka begäran. Om modellen har loggats med ett indataexempel (som visas i bilden ovan) klickar du på Läs in exempel för att läsa in indataexempel.

Poäng via REST API begäran

Du kan skicka en bedömningsbegäran via REST API med standardautentisering för Databricks. Exemplen nedan visar autentisering med hjälp av en personlig åtkomsttoken.

Med en like (där är namnet på MODEL_VERSION_URIhttps://<databricks-instance>/model/iris-classifier/Production/invocations din <databricks-instance>MODEL_VERSION_URIoch en Databricks REST API-token med namnet , finns här några exempelfragment för hur du frågar en DATABRICKS_API_TOKEN betjänad modell:

Bash

Kodfragment för att fråga en modell som tar emot dataframe-indata.

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
    }
  ]'

Kodfragment för att fråga en modell som accepterar tensorindata. Tensor-indata ska formateras enligt beskrivningen i TensorFlow Servings API-dokument.

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

Du kan poängse en datauppsättning i Power BI Desktop med följande steg:

  1. Öppna den datamängd som du vill poänggöra.

  2. Gå till Transformera data.

  3. Högerklicka på den vänstra panelen och välj Skapa ny fråga.

  4. Gå till Visa Avancerad redigerare.

  5. Ersätt frågetexten med kodfragmentet nedan när du har fyllt i en lämplig DATABRICKS_API_TOKEN och 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. Namnge frågan med önskat modellnamn.

  7. Öppna den avancerade frågeredigeraren för din datauppsättning och tillämpa modellfunktionen.

Mer information om indataformat som accepteras av servern (till exempel pandas split-oriented format) finns i MLflow-dokumentationen.

Övervaka betjänade modeller

På den betjänande sidan visas statusindikatorer för det betjänande klustret samt enskilda modellversioner.

  • Om du vill kontrollera tillståndet för det betjänande klustret använder du fliken Modellhändelser, som visar en lista över alla betjänande händelser för den här modellen.
  • Om du vill kontrollera tillståndet för en enskild modellversion klickar du på fliken Modellversioner och bläddrar för att visa flikarna Loggareller Versionshändelser.

Fliken Betjänar

Anpassa det betjänande klustret

Om du vill anpassa det betjänande klustret använder du Inställningar fliken Kluster på fliken Betjänande.

Klusterinställningar

  • Om du vill ändra minnesstorleken och antalet kärnor i ett betjänande kluster använder du listrutan Instanstyp för att välja önskad klusterkonfiguration. När du klickar Spara avslutas det befintliga klustret och ett nytt kluster skapas med de angivna inställningarna.
  • Om du vill lägga till en tagg skriver du namn och värde i fälten Lägg till tagg och klickar på Lägg till.
  • Om du vill redigera eller ta bort en befintlig tagg klickar du på en av ikonerna i kolumnen Åtgärder i tabellen Taggar.

Kända fel

ResolvePackageNotFound: pyspark=3.1.0

Det här felet kan inträffa om en modell är pyspark beroende av och loggas med Databricks Runtime 8.x. Om du ser det här felet anger du pyspark versionen uttryckligen när du loggar modellen med pyspark.