Obsługa modeli MLflow w Azure Databricks

Ważne

Ta funkcja jest dostępna w publicznej wersji zapoznawczej.

Obsługa modeli MLflow umożliwia hostowanie modeli uczenia maszynowego z rejestru modeli jako punktów końcowych REST, które są aktualizowane automatycznie na podstawie dostępności wersji modeli i ich etapów.

Po włączeniu obsługi danego zarejestrowanego modelu program Azure Databricks automatycznie tworzy unikatowy klaster dla modelu i wdraża wszystkie niearchiwizowane wersje modelu w tym klastrze. Azure Databricks ponownie uruchamia klaster w przypadku wystąpienia błędu i kończy działanie klastra po wyłączeniu obsługi modelu dla modelu. Model obsługujący automatycznie synchronizuje się z rejestrem modeli i wdraża wszystkie nowe zarejestrowane wersje modelu. O wersje wdrożonego modelu można pytać za pomocą standardowego żądania interfejsu API REST. Azure Databricks uwierzytelnia żądania do modelu przy użyciu jego standardowego uwierzytelniania.

Chociaż ta usługa jest w wersji zapoznawczej, usługa Databricks zaleca jej użycie w przypadku aplikacji o niskiej przepływności i aplikacji niekrytycznych. Docelowa przepływność wynosi 200 q/s, a docelowa dostępność wynosi 99,5%, chociaż żadna gwarancja nie jest gwarantowana. Ponadto ładunek ma limit rozmiaru 16 MB na żądanie.

Każda wersja modelu jest wdrażana przy użyciu wdrożenia modelu MLflow i uruchamiana w środowisku Conda określonym przez jego zależności.

Uwaga

  • Klaster jest utrzymywany tak długo, jak obsługa jest włączona, nawet jeśli nie istnieje aktywna wersja modelu. Aby zakończyć działanie klastra obsługującego, wyłącz obsługę modelu dla zarejestrowanego modelu.
  • Klaster jest traktowany jako klaster wszystkiego przeznaczenia, z zastrzeżeniem cennika obciążeń wszystkich celów.
  • Globalne skrypty init nie są uruchamiane w klastrach obsługujących.

Wymagania

  • Obsługa modeli platformy MLflow jest dostępna dla modeli MLflow języka Python. Należy zadeklarować wszystkie zależności modelu w środowisku conda.
  • Aby włączyć obsługę modeli, musisz mieć uprawnienie do tworzenia klastra.

Obsługa modeli z rejestru modeli

Obsługa modeli jest dostępna w Azure Databricks z rejestru modeli.

Włączanie i wyłączanie obsługi modeli

Włączasz model do obsługi z jego zarejestrowanej strony modelu.

  1. Kliknij kartę Obsługa. Jeśli model nie został jeszcze włączony do obsługi, zostanie wyświetlony przycisk Włącz obsługę.

    Enable serving button

  2. Kliknij pozycję Włącz obsługę. Zostanie wyświetlona karta Obsługa z wyświetlonym stanem Oczekujące. Po kilku minutach stan zmieni się na Gotowe.

Aby wyłączyć model do obsługi, kliknij pozycję Zatrzymaj.

Weryfikowanie obsługi modeli

Na karcie Obsługa możesz wysłać żądanie do obsługiwanego modelu i wyświetlić odpowiedź.

Enable serving

Interfejsy URIS wersji modelu

Do każdej wdrożonej wersji modelu jest przypisany jeden lub kilka unikatowych identyfikatorów URI. Co najmniej do każdej wersji modelu jest przypisywany URI skonstruowany w następujący sposób:

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

Aby na przykład wywołać wersję 1 modelu zarejestrowanego jako iris-classifier , użyj tego URI:

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

Możesz również wywołać wersję modelu według jego etapu. Jeśli na przykład wersja 1 znajduje się na etapie produkcji, można ją również określić przy użyciu tego URI:

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

Lista dostępnych URI modelu jest wyświetlana w górnej części karty Wersje modelu na stronie obsługi.

Zarządzanie obsługiwanymi wersjami

Wdrażane są wszystkie aktywne (niearchiwizowane) wersje modelu, które można odpytować przy użyciu URI. Azure Databricks automatycznie wdraża nowe wersje modelu po ich zarejestrowaniu i automatycznie usuwa stare wersje, gdy są archiwizowane.

Uwaga

Wszystkie wdrożone wersje zarejestrowanego modelu współdzielą ten sam klaster.

Zarządzanie prawami dostępu do modelu

Prawa dostępu do modelu są dziedziczone z rejestru modeli. Włączenie lub wyłączenie funkcji obsługującej wymaga uprawnienia do zarządzania w zarejestrowanym modelu. Każda osoba z uprawnieniami do odczytu może uzyskać ocenę dla dowolnej wdrożonej wersji.

Ocena wdrożonych wersji modelu

Aby uzyskać ocenę wdrożonego modelu, możesz użyć interfejsu użytkownika lub wysłać żądanie interfejsu API REST do modelu URI.

Ocena za pośrednictwem interfejsu użytkownika

Jest to najprostszy i najszybszy sposób testowania modelu. Możesz wstawić dane wejściowe modelu w formacie JSON i kliknąć pozycję Wyślij żądanie. Jeśli model został zarejestrowany z przykładem wejściowym (jak pokazano na ilustracji powyżej), kliknij pozycję Load Example (Załaduj przykład), aby załadować przykład danych wejściowych.

Ocena za pośrednictwem żądania interfejsu API REST

Żądanie oceniania można wysłać za pośrednictwem interfejsu API REST przy użyciu standardowego uwierzytelniania usługi Databricks. W poniższych przykładach pokazano uwierzytelnianie przy użyciu osobistego tokenu dostępu.

W przypadku obiektu podobnego (gdzie to nazwa wystąpienia usługi MODEL_VERSION_URIhttps://<databricks-instance>/model/iris-classifier/Production/invocations<databricks-instance>MODEL_VERSION_URIi tokenu interfejsu API REST usługi Databricks o nazwie , poniżej znajdują się przykładowe fragmenty kodu służące do wykonywania zapytań dotyczących DATABRICKS_API_TOKEN obsługiwanego modelu:

Bash

Fragment kodu do wykonywania zapytań dotyczących modelu akceptującego dane wejściowe ramki danych.

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

Fragment kodu, który odpytuje model akceptujący dane wejściowe tensorów. Dane wejściowe tensor powinny być sformatowane zgodnie z opisem w dokumentacjach interfejsu API tensorFlow Serving.

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

Zestaw danych można wywłaszować w Power BI Desktop, korzystając z następujących kroków:

  1. Otwórz zestaw danych, który chcesz uzyskać.

  2. Przejdź do przekształć dane.

  3. Kliknij prawym przyciskiem myszy w lewym panelu i wybierz polecenie Utwórz nowe zapytanie.

  4. Przejdź do widoku Edytor zaawansowany.

  5. Zastąp treść zapytania poniższym fragmentem kodu po wypełnieniu odpowiednich wartości DATABRICKS_API_TOKEN i 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. Nadaj zapytaniu nazwę odpowiedniego modelu.

  7. Otwórz zaawansowany edytor zapytań dla zestawu danych i zastosuj funkcję modelu.

Aby uzyskać więcej informacji na temat formatów danych wejściowych akceptowanych przez serwer (na przykład formatu zorientowanego na podział pandas), zobacz dokumentację MLflow.

Monitorowanie obsługiwanych modeli

Strona obsługujący wyświetla wskaźniki stanu dla klastra obsługującego oraz poszczególnych wersji modelu.

  • Aby sprawdzić stan klastra obsługującego, użyj karty Zdarzenia modelu, na której jest wyświetlana lista wszystkich zdarzeń obsługujących dla tego modelu.
  • Aby sprawdzić stan pojedynczej wersji modelu, kliknij kartę Wersje modelu i przewiń, aby wyświetlić karty Dzienniki lub Zdarzenia wersji.

Serving tab

Dostosowywanie klastra obsługującego

Aby dostosować klaster obsługujący, użyj karty Klastry Ustawienia na karcie Obsługa.

Cluster settings

  • Aby zmodyfikować rozmiar pamięci i liczbę rdzeni klastra obsługującego, użyj menu rozwijanego Typ wystąpienia, aby wybrać żądaną konfigurację klastra. Po kliknięciu przycisku Zapiszistniejący klaster zostanie zakończony i zostanie utworzony nowy klaster z określonymi ustawieniami.
  • Aby dodać tag, wpisz nazwę i wartość w polach Dodaj tag i kliknij przycisk Dodaj.
  • Aby edytować lub usunąć istniejący tag, kliknij jedną z ikon w kolumnie Akcje tabeli Tagi.

Znane błędy

ResolvePackageNotFound: pyspark=3.1.0

Ten błąd może wystąpić, jeśli model jest zależny od modelu i pyspark jest rejestrowany Databricks Runtime wersji 8.x. Jeśli zostanie wyświetlony ten błąd, określ jawnie wersję pyspark podczas rejestrowania modelu, używając pyspark.