Klassisk MLflow-modell som betjänar Azure Databricks

Viktigt

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

Viktigt

Vägledningen i den här artikeln gäller för servering av klassiskA MLflow-modeller. Databricks rekommenderar att du migrerar din modell som betjänar arbetsflöden till serverlösa Real-Time slutsatsdragning för förbättrad modellslutpunktsdistribution och skalbarhet. Mer information finns i Modell som betjänar med serverlös Real-Time slutsatsdragning.

Med klassisk 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 modellhantering för 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 uppstår och avslutar klustret när du inaktiverar modelltjänst för modellen. Modell som betjänar synkroniseras automatiskt med Model Registry och distribuerar alla nya registrerade modellversioner. Distribuerade modellversioner kan efterfrågas med en REST API-standardbegäran. Azure Databricks autentiserar begäranden till modellen med hjälp av dess standardautentisering.

Även om 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ängligheten är 99,5 %, men ingen garanti görs om det heller. Dessutom finns det en storleksgräns för nyttolasten 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 behålls så länge servering är aktiverat, även om det inte finns någon aktiv modellversion. Om du vill avsluta det betjänande klustret inaktiverar du modellen som betjänar den registrerade modellen.
  • Klustret anses vara ett kluster för alla syften, med förbehåll för priser för arbetsbelastningar för alla syften.
  • Globala init-skript körs inte på betjänande kluster.

Viktigt

Anaconda Inc. uppdaterade sina användningsvillkor för anaconda.org kanaler. Baserat på de nya användningsvillkoren kan du behöva en kommersiell licens om du förlitar dig på Anacondas paketering och distribution. Mer information finns i Vanliga frågor och svar om Anaconda Commercial Edition . Din användning av Anaconda-kanaler styrs av deras användningsvillkor.

MLflow-modeller som loggades före v1.18 (Databricks Runtime 8.3 ML eller tidigare) loggades som standard med conda-kanalen defaults (https://repo.anaconda.com/pkgs/) som ett beroende. På grund av den här licensändringen defaults har Databricks stoppat användningen av kanalen för modeller som loggats med MLflow v1.18 och senare. Standardkanalen som loggas är nu conda-forge, som pekar på den communityhanterade https://conda-forge.org/.

Om du loggade en modell före MLflow v1.18 utan att utesluta defaults kanalen från conda-miljön för modellen, kan den modellen ha ett beroende av den defaults kanal som du kanske inte har tänkt dig. Om du vill kontrollera om en modell har det här beroendet manuellt kan du undersöka channel värdet i conda.yaml filen som paketeras med den loggade modellen. En modell med conda.yaml ett defaults kanalberoende kan till exempel se ut så här:

channels:
- defaults
dependencies:
- python=3.8.8
- pip
- pip:
    - mlflow
    - scikit-learn==0.23.2
    - cloudpickle==1.6.0
      name: mlflow-env

Eftersom Databricks inte kan avgöra om din användning av Anaconda-lagringsplatsen för att interagera med dina modeller är tillåten i din relation med Anaconda, tvingar Databricks inte sina kunder att göra några ändringar. Om din användning av Anaconda.com-lagringsplatsen genom användning av Databricks är tillåten enligt Anacondas villkor behöver du inte vidta några åtgärder.

Om du vill ändra den kanal som används i en modells miljö kan du registrera om modellen till modellregistret med en ny conda.yaml. Du kan göra detta genom att ange kanalen i parametern conda_envlog_model()för .

Mer information om API:et log_model() finns i MLflow-dokumentationen för modellsmaken som du arbetar med, till exempel log_model för scikit-learn.

Mer information om conda.yaml filer finns i MLflow-dokumentationen.

Krav

  • Klassisk 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 modellbetjäning måste du ha behörighet att skapa kluster.

Modell som betjänar från Model Registry

Modellhantering är tillgängligt i Azure Databricks från Model Registry.

Aktivera och inaktivera modellbetjäning

Du aktiverar en modell för servering från dess registrerade modellsida.

  1. Klicka på fliken Servering . Om modellen inte redan är aktiverad för servering visas knappen Aktivera servering .

    Knappen Aktivera servering

  2. Klicka på Aktivera servering. Fliken Betjäna visas med Status visas som Väntande. Efter några minuter ändras Status till Klar.

Om du vill inaktivera en modell för servering klickar du på Stoppa.

Verifiera modellbetjäning

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

Aktivera servering

URI:er för modellversion

Varje distribuerad modellversion tilldelas en eller flera unika URI:er. Som minst tilldelas varje modellversion en URI som konstrueras 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-classifieranvänder du den här URI:n:

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

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

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

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

Hantera serverversioner

Alla aktiva (icke-arkiverade) modellversioner distribueras och du kan köra frågor mot dem med hjälp av URI:erna. Azure Databricks distribuerar 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 åtkomsträttigheter för modeller

Åtkomsträttigheter för modeller ärvs från Model Registry. Aktivering eller inaktivering av den betjänande funktionen kräver "hantera"-behörighet för den registrerade modellen. Alla 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 en REST API-begäran till modellens URI.

Poäng via användargränssnittet

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 du ser i bilden ovan) klickar du på Läs in exempel för att läsa in indataexemplet.

Poäng via REST API-begäran

Du kan skicka en bedömningsbegäran via REST-API:et med hjälp av Standard Databricks-autentisering. Exemplen nedan visar autentisering med hjälp av en personlig åtkomsttoken.

Anteckning

När du autentiserar med automatiserade verktyg, system, skript och appar rekommenderar Databricks att du använder åtkomsttoken som tillhör tjänstens huvudnamn i stället för arbetsyteanvändare. Mer information finns i Hantera tjänstens huvudnamn.

Givet en MODEL_VERSION_URI like https://<databricks-instance>/model/iris-classifier/Production/invocations (där <databricks-instance> är namnet på din Databricks-instans) och en Databricks REST API-token med namnet DATABRICKS_API_TOKEN, finns här några exempelfragment för hur du frågar en hanterad modell:

Bash

Kodfragment för att fråga en modell som accepterar dataramsindata.

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 tensor-indata. Tensor-indata bör 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ängsätta en datauppsättning i Power BI Desktop med hjälp av följande steg:

  1. Öppna den datauppsättning som du vill poängsätta.

  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 godkänts av servern (till exempel pandas split-oriented format) finns i MLflow-dokumentationen.

Övervaka serverade 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 Loggar eller Versionshändelser .

Fliken Servering

Anpassa det betjänande klustret

Om du vill anpassa det betjänande klustret använder du fliken Klusterinställningar på fliken Servering .

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 på 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 namnet och värdet 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 beroende av pyspark och loggas med Databricks Runtime 8.x. Om du ser det här felet anger du pyspark versionen explicit när du loggar modellen med hjälp av parameternconda_env .