Verouderde MLflow Model Serving in Azure Databricks

Belangrijk

Deze functie is beschikbaar als openbare preview.

Belangrijk

  • Deze documentatie is buiten gebruik gesteld en wordt mogelijk niet bijgewerkt. De producten, services of technologieën die in deze inhoud worden genoemd, worden niet meer ondersteund.
  • De richtlijnen in dit artikel zijn bedoeld voor legacy MLflow Model Serving. Databricks raadt u aan uw model te migreren dat werkstromen naar Model Serving biedt voor de verbeterde implementatie en schaalbaarheid van het modeleindpunt. Zie Model voor meer informatie met Azure Databricks.

Met verouderde MLflow-modelverdiening kunt u machine learning-modellen hosten uit modelregister als REST-eindpunten die automatisch worden bijgewerkt op basis van de beschikbaarheid van modelversies en hun fasen. Het maakt gebruik van een cluster met één knooppunt dat wordt uitgevoerd onder uw eigen account in wat nu het klassieke rekenvlak wordt genoemd. Dit rekenvlak omvat het virtuele netwerk en de bijbehorende rekenresources, zoals clusters voor notebooks en taken, pro- en klassieke SQL-warehouses en verouderde modellen die eindpunten leveren.

Wanneer u modelservices inschakelt voor een bepaald geregistreerd model, maakt Azure Databricks automatisch een uniek cluster voor het model en implementeert u alle niet-gearchiveerde versies van het model op dat cluster. Azure Databricks start het cluster opnieuw op als er een fout optreedt en beëindigt het cluster wanneer u het model voor het model uitschakelt. Model waarmee automatisch wordt gesynchroniseerd met modelregister en implementeert nieuwe geregistreerde modelversies. Geïmplementeerde modelversies kunnen worden opgevraagd met een standaard REST API-aanvraag. Azure Databricks verifieert aanvragen voor het model met behulp van de standaardverificatie.

Hoewel deze service in preview is, raadt Databricks het gebruik aan voor lage doorvoer en niet-kritieke toepassingen. De doeldoorvoer is 200 qps en de doel beschikbaarheid is 99,5%, hoewel er geen garantie wordt gemaakt. Daarnaast is er een nettoladingslimiet van 16 MB per aanvraag.

Elke modelversie wordt geïmplementeerd met behulp van MLflow-modelimplementatie en wordt uitgevoerd in een Conda-omgeving die is opgegeven door de afhankelijkheden.

Notitie

  • Het cluster wordt onderhouden zolang de server is ingeschakeld, zelfs als er geen actieve modelversie bestaat. Als u het servercluster wilt beëindigen, schakelt u de server van het model uit voor het geregistreerde model.
  • Het cluster wordt beschouwd als een cluster voor alle doeleinden, afhankelijk van de workloadprijzen voor alle doeleinden.
  • Globale init-scripts worden niet uitgevoerd op modelleringsclusters.

Belangrijk

Anaconda Inc. heeft hun servicevoorwaarden voor anaconda.org kanalen bijgewerkt. Op basis van de nieuwe servicevoorwaarden hebt u mogelijk een commerciële licentie nodig als u afhankelijk bent van de verpakking en distributie van Anaconda. Zie Veelgestelde vragen over Anaconda Commercial Edition voor meer informatie. Uw gebruik van anaconda-kanalen is onderhevig aan hun servicevoorwaarden.

MLflow-modellen die zijn geregistreerd vóór v1.18 (Databricks Runtime 8.3 ML of eerder) zijn standaard vastgelegd met het conda-kanaal defaults (https://repo.anaconda.com/pkgs/) als afhankelijkheid. Vanwege deze licentiewijziging heeft Databricks het gebruik van het defaults kanaal gestopt voor modellen die zijn geregistreerd met MLflow v1.18 en hoger. Het standaardkanaal dat is geregistreerd, is nu conda-forge, die verwijst naar de door de community beheerde https://conda-forge.org/.

Als u een model hebt geregistreerd vóór MLflow v1.18 zonder het defaults kanaal uit te sluiten van de Conda-omgeving voor het model, heeft dat model mogelijk een afhankelijkheid van het defaults kanaal dat u mogelijk niet hebt bedoeld. Als u handmatig wilt controleren of een model deze afhankelijkheid heeft, kunt u de waarde onderzoeken channel in het conda.yaml bestand dat is verpakt met het geregistreerde model. Een model conda.yaml met een defaults kanaalafhankelijkheid kan er bijvoorbeeld als volgt uitzien:

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

Omdat Databricks niet kan bepalen of uw gebruik van de Anaconda-opslagplaats om te communiceren met uw modellen is toegestaan in uw relatie met Anaconda, dwingt Databricks klanten niet om wijzigingen aan te brengen. Als uw gebruik van de Anaconda.com opslagplaats via het gebruik van Databricks is toegestaan volgens de voorwaarden van Anaconda, hoeft u geen actie te ondernemen.

Als u het kanaal wilt wijzigen dat wordt gebruikt in de omgeving van een model, kunt u het model opnieuw registreren bij het modelregister met een nieuw conda.yaml. U kunt dit doen door het kanaal op te geven in de conda_env parameter van log_model().

Zie de MLflow-documentatie voor de modelsmaak waarmee u werkt, bijvoorbeeld log_model voor scikit-learn voor meer informatie over de log_model() API.

Zie de MLflow-documentatie voor meer informatie over conda.yaml bestanden.

Vereisten

  • Verouderde MLflow Model Serving is beschikbaar voor Python MLflow-modellen. U moet alle modelafhankelijkheden in de Conda-omgeving declareren. Zie Afhankelijkheden van logboekmodellen.
  • Als u Model serving wilt inschakelen, moet u de machtiging voor het maken van clusters hebben.

Model leveren vanuit modelregister

Het leveren van modellen is beschikbaar in Azure Databricks vanuit modelregister.

Modelbediening in- en uitschakelen

U schakelt een model in voor de service vanaf de geregistreerde modelpagina.

  1. Klik op het tabblad Serveren . Als het model nog niet is ingeschakeld voor serveren, wordt de knop Server inschakelen weergegeven.

    Knop Voorzitten inschakelen

  2. Klik op Server inschakelen. Het tabblad Server wordt weergegeven met status weergegeven als In behandeling. Na een paar minuten wordt de status gewijzigd in Gereed.

Klik op Stoppen als u een model voor de service wilt uitschakelen.

Modellering valideren

Op het tabblad Serveren kunt u een aanvraag verzenden naar het aangeboden model en het antwoord bekijken.

Serveren inschakelen

Modelversie-URI's

Aan elke geïmplementeerde modelversie wordt een of meerdere unieke URI's toegewezen. Aan elke modelversie wordt minimaal een URI toegewezen die als volgt is samengesteld:

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

Als u bijvoorbeeld versie 1 van een model wilt aanroepen dat is geregistreerd als iris-classifier, gebruikt u deze URI:

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

U kunt ook een modelversie aanroepen op basis van de fase. Als versie 1 zich bijvoorbeeld in de productiefase bevindt, kan deze ook worden gescoord met behulp van deze URI:

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

De lijst met beschikbare model-URI's wordt boven aan het tabblad Modelversies weergegeven op de pagina voor de dienst.

Gediende versies beheren

Alle actieve (niet-gearchiveerde) modelversies worden geïmplementeerd en u kunt er query's op uitvoeren met behulp van de URI's. Azure Databricks implementeert automatisch nieuwe modelversies wanneer ze zijn geregistreerd en verwijdert automatisch oude versies wanneer ze worden gearchiveerd.

Notitie

Alle geïmplementeerde versies van een geregistreerd model delen hetzelfde cluster.

Toegangsrechten voor modellen beheren

Modeltoegangsrechten worden overgenomen uit het modelregister. Voor het in- of uitschakelen van de servicefunctie is de machtiging 'beheren' vereist voor het geregistreerde model. Iedereen met leesrechten kan een van de geïmplementeerde versies beoordelen.

Geïmplementeerde modelversies beoordelen

Als u een geïmplementeerd model wilt beoordelen, kunt u de gebruikersinterface gebruiken of een REST API-aanvraag verzenden naar de model-URI.

Scoren via gebruikersinterface

Dit is de eenvoudigste en snelste manier om het model te testen. U kunt de modelinvoergegevens invoegen in JSON-indeling en op Aanvraag verzenden klikken. Als het model is vastgelegd met een invoervoorbeeld (zoals weergegeven in de bovenstaande afbeelding), klikt u op Voorbeeld laden om het invoervoorbeeld te laden.

Scoren via REST API-aanvraag

U kunt een scoreaanvraag verzenden via de REST API met behulp van standaard Databricks-verificatie. In de onderstaande voorbeelden ziet u verificatie met behulp van een persoonlijk toegangstoken met MLflow 1.x.

Notitie

Als best practice voor beveiliging, wanneer u zich verifieert met geautomatiseerde hulpprogramma's, systemen, scripts en apps, raadt Databricks u aan om persoonlijke toegangstokens te gebruiken die behoren tot service-principals in plaats van werkruimtegebruikers. Zie Tokens voor een service-principal beheren om tokens voor service-principals te maken.

Op basis van een MODEL_VERSION_URI like (waar <databricks-instance> is de naam van uw Databricks-exemplaar) en een Databricks REST API-token aangeroepenDATABRICKS_API_TOKEN, ziet u in de volgende voorbeelden hoe u een query uitvoert op https://<databricks-instance>/model/iris-classifier/Production/invocations een geleverd model:

De volgende voorbeelden weerspiegelen de score-indeling voor modellen die zijn gemaakt met MLflow 1.x. Als u liever MLflow 2.0 gebruikt, moet u de indeling van de nettolading van uw aanvraag bijwerken.

Bash

Fragment om een query uit te voeren op een model dat dataframeinvoer accepteert.

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 om een query uit te voeren op een model dat tensor-invoer accepteert. Tensor-invoer moet worden opgemaakt zoals beschreven in api-documenten van 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

U kunt een gegevensset in Power BI Desktop scoren met behulp van de volgende stappen:

  1. Open de gegevensset die u wilt scoren.

  2. Ga naar Gegevens transformeren.

  3. Klik met de rechtermuisknop in het linkerdeelvenster en selecteer Nieuwe query maken.

  4. Ga naar Weergave > Geavanceerde editor.

  5. Vervang de hoofdtekst van de query door het onderstaande codefragment, na het invullen van een geschikte DATABRICKS_API_TOKEN en 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. Geef de query een naam met de gewenste modelnaam.

  7. Open de geavanceerde query-editor voor uw gegevensset en pas de modelfunctie toe.

Bediende modellen bewaken

Op de serverpagina worden statusindicatoren weergegeven voor het servercluster en voor afzonderlijke modelversies.

  • Als u de status van het servercluster wilt controleren, gebruikt u het tabblad Model gebeurtenissen , waarin een lijst met alle ondersteunende gebeurtenissen voor dit model wordt weergegeven.
  • Als u de status van één modelversie wilt controleren, klikt u op het tabblad Modelversies en schuift u naar de tabbladen Logboeken of Versiegebeurtenissen .

Tabblad Server

Het servercluster aanpassen

Als u het servercluster wilt aanpassen, gebruikt u het tabblad Cluster Instellingen op het tabblad Serveren.

Clusterinstellingen

  • Als u de geheugengrootte en het aantal kernen van een servercluster wilt wijzigen, gebruikt u het vervolgkeuzemenu Exemplaartype om de gewenste clusterconfiguratie te selecteren. Wanneer u op Opslaan klikt, wordt het bestaande cluster beëindigd en wordt er een nieuw cluster gemaakt met de opgegeven instellingen.
  • Als u een tag wilt toevoegen, typt u de naam en waarde in de velden Tag toevoegen en klikt u op Toevoegen.
  • Als u een bestaande tag wilt bewerken of verwijderen, klikt u op een van de pictogrammen in de kolom Acties van de tabel Tags .

Integratie van functiearchief

Verouderde modellen kunnen automatisch functiewaarden opzoeken uit gepubliceerde online winkels.

.. Aws:

Databricks Legacy MLflow Model Serving supports automatic feature lookup from these online stores:

- Amazon DynamoDB (v0.3.8 and above)
- Amazon Aurora (MySQL-compatible)
- Amazon RDS MySQL

.. azure::

Databricks Legacy MLflow Model Serving supports automatic feature lookup from these online stores:

- Azure Cosmos DB (v0.5.0 and above)
- Azure Database for MySQL

Bekende fouten

ResolvePackageNotFound: pyspark=3.1.0

Deze fout kan optreden als een model afhankelijk is van pyspark en wordt geregistreerd met Databricks Runtime 8.x. Als u deze fout ziet, geeft u de versie expliciet op bij het pyspark vastleggen van het model met behulp van de conda_env parameter.

Unrecognized content type parameters: format

Deze fout kan optreden als gevolg van de nieuwe MLflow 2.0-scoreprotocolindeling. Als u deze fout ziet, gebruikt u waarschijnlijk een verouderde indeling voor scoreaanvragen. U kunt het volgende doen om de fout op te lossen:

  • Werk de indeling van uw scoreaanvraag bij naar het meest recente protocol.

    Notitie

    De volgende voorbeelden weerspiegelen de score-indeling die is geïntroduceerd in MLflow 2.0. Als u liever MLflow 1.x gebruikt, kunt u uw log_model() API-aanroepen wijzigen om de gewenste afhankelijkheid van de MLflow-versie in de extra_pip_requirements parameter op te nemen. Dit zorgt ervoor dat de juiste score-indeling wordt gebruikt.

        mlflow.<flavor>.log_model(..., extra_pip_requirements=["mlflow==1.*"])
    

    Bash

    Een query uitvoeren op een model dat pandas-gegevensframeinvoer accepteert.

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

    Een query uitvoeren op een model dat tensor-invoer accepteert. Tensor-invoer moet worden opgemaakt zoals beschreven in api-documenten van 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_dict = {'dataframe_split': data.to_dict(orient='split')} if isinstance(data, pd.DataFrame) else create_tf_serving_json(data)
      data_json = json.dumps(data_dict)
      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

    U kunt een gegevensset in Power BI Desktop scoren met behulp van de volgende stappen:

    1. Open de gegevensset die u wilt scoren.

    2. Ga naar Gegevens transformeren.

    3. Klik met de rechtermuisknop in het linkerdeelvenster en selecteer Nieuwe query maken.

    4. Ga naar Weergave > Geavanceerde editor.

    5. Vervang de hoofdtekst van de query door het onderstaande codefragment, na het invullen van een geschikte DATABRICKS_API_TOKEN en 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. Geef de query een naam met de gewenste modelnaam.

    7. Open de geavanceerde query-editor voor uw gegevensset en pas de modelfunctie toe.

  • Als uw scoreaanvraag gebruikmaakt van de MLflow-client, bijvoorbeeld mlflow.pyfunc.spark_udf(), voert u een upgrade uit van uw MLflow-client naar versie 2.0 of hoger om de nieuwste indeling te gebruiken. Meer informatie over het bijgewerkte scoreprotocol voor MLflow-modellen in MLflow 2.0.

Zie de MLflow-documentatie voor meer informatie over invoergegevensindelingen die door de server worden geaccepteerd (bijvoorbeeld een gesplitste pandas-indeling).