Query's uitvoeren op eindpunten voor aangepaste modellen
In dit artikel leert u hoe u scoreaanvragen kunt opmaken voor uw aangeboden model en hoe u deze aanvragen verzendt naar het eindpunt van de modelfunctie. De richtlijnen zijn relevant voor het leveren van aangepaste modellen, die Databricks definieert als traditionele ML-modellen of aangepaste Python-modellen die zijn verpakt in de MLflow-indeling. Ze kunnen worden geregistreerd in Unity Catalog of in het register van het werkruimtemodel. Voorbeelden hiervan zijn scikit-learn-, XGBoost-, PyTorch- en Hugging Face-transformatiemodellen. Zie Modellen implementeren met behulp van Mosaic AI Model Serving voor meer informatie over deze functionaliteit en ondersteunde modelcategorieën.
Zie Query foundation-modellenvoor queryaanvragen voor generatieve AI- en LLM-workloads.
Eisen
- Een model dat eindpunt bedient.
- Voor de MLflow Deployment SDK is MLflow 2.9 of hoger vereist.
- Scoreaanvraag in een geaccepteerde indeling.
- Als u een scoreaanvraag wilt verzenden via de REST API of MLflow Deployment SDK, moet u een Databricks API-token hebben.
Belangrijk
Als best practice voor beveiliging voor productiescenario's raadt Databricks u aan om OAuth-tokens voor machine-naar-machine te gebruiken voor verificatie tijdens de productie.
Voor testen en ontwikkelen raadt Databricks aan om een persoonlijk toegangstoken te gebruiken dat hoort bij service-principals in plaats van werkruimtegebruikers. Zie Tokens voor een service-principal beheren om tokens voor service-principals te maken.
Query's uitvoeren op methoden en voorbeelden
Mozaïek AI Model Serving biedt de volgende opties voor het verzenden van scoreaanvragen naar aangeboden modellen:
Methode | DETAILS |
---|---|
Gebruikersinterface bedienen | Selecteer query-eindpunt van de bedien-eindpuntpagina in uw Databricks-werkruimte. Voeg invoergegevens van het JSON-model in en klik op Aanvraag verzenden. Als het model een ingevoerde voorbeeld heeft geregistreerd, gebruikt u Voorbeeld weergeven om het te laden. |
SQL-functie | Roep modeldeductie rechtstreeks vanuit SQL aan met behulp van de ai_query SQL-functie. Zie Voer een query uit op een geleverd model met ai_query. |
REST-API | Het model aanroepen en er query's op uitvoeren met behulp van de REST API. Zie POST /serving-endpoints/{name}/aanroepen voor meer informatie. Zie Afzonderlijke modellen achter een eindpunt opvragen voor scoreaanvragen voor eindpunten die meerdere modellen bedienen. |
MLflow Deployments SDK | Gebruik de predict()-functie van de MLflow Deployments SDK om een query uit te voeren op het model. |
Voorbeeld van scoren van Pandas DataFrame
In het volgende voorbeeld wordt uitgegaan van een MODEL_VERSION_URI
zoals https://<databricks-instance>/model/iris-classifier/Production/invocations
, waarbij <databricks-instance>
de naam is van uw Databricks-exemplaaren een Databricks REST API-token genaamd DATABRICKS_API_TOKEN
.
Zie Ondersteunde score-indelingen.
REST-API
Score a model accepting dataframe split input format.
curl -X POST -u token:$DATABRICKS_API_TOKEN $MODEL_VERSION_URI \
-H 'Content-Type: application/json' \
-d '{"dataframe_split": [{
"columns": ["sepal length (cm)", "sepal width (cm)", "petal length (cm)", "petal width (cm)"],
"data": [[5.1, 3.5, 1.4, 0.2], [4.9, 3.0, 1.4, 0.2]]
}]
}'
Score een model dat tensor-invoer accepteert. Tensor-invoer moet worden opgemaakt zoals beschreven in de API-documentatie 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]]}'
MLflow Deployments SDK
Belangrijk
In het volgende voorbeeld wordt de predict()
API van de MLflow Deployments SDK gebruikt.
import mlflow.deployments
export DATABRICKS_HOST="https://<workspace_host>.databricks.com"
export DATABRICKS_TOKEN="dapi-your-databricks-token"
client = mlflow.deployments.get_deploy_client("databricks")
response = client.predict(
endpoint="test-model-endpoint",
inputs={"dataframe_split": {
"index": [0, 1],
"columns": ["sepal length (cm)", "sepal width (cm)", "petal length (cm)", "petal width (cm)"],
"data": [[5.1, 3.5, 1.4, 0.2], [4.9, 3.0, 1.4, 0.2]]
}
}
)
SQL
Belangrijk
In het volgende voorbeeld wordt de ingebouwde SQL-functie ai_query gebruikt. Deze functie is openbare preview en de definitie kan veranderen. Zie Voer een query uit op een geleverd model met ai_query.
In het volgende voorbeeld wordt het model achter het sentiment-analysis
eindpunt opgevraagd met de text
gegevensset en wordt het retourtype van de aanvraag opgegeven.
SELECT text, ai_query(
"sentiment-analysis",
text,
returnType => "STRUCT<label:STRING, score:DOUBLE>"
) AS predict
FROM
catalog.schema.customer_reviews
Power BI
U kunt een gegevensset in Power BI Desktop scoren met behulp van de volgende stappen:
Open de gegevensset die u wilt scoren.
Ga naar Gegevens transformeren.
Klik met de rechtermuisknop in het linkerdeelvenster en selecteer Nieuwe query maken.
Ga naar Weergave > Geavanceerde editor.
Vervang de hoofdtekst van de query door het onderstaande codefragment, na het invullen van een geschikte
DATABRICKS_API_TOKEN
enMODEL_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 = {"dataframe_records": 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
Geef de query een naam met de gewenste modelnaam.
Open de geavanceerde query-editor voor uw gegevensset en pas de modelfunctie toe.
Voorbeeld van Tensor-invoer
In het volgende voorbeeld wordt een model gescored dat tensor-invoer accepteert. Tensor-invoer moet worden opgemaakt zoals beschreven in API-documenten van TensorFlow Serving. In dit voorbeeld wordt uitgegaan van een MODEL_VERSION_URI
zoals https://<databricks-instance>/model/iris-classifier/Production/invocations
, waarbij <databricks-instance>
de naam is van uw Databricks-exemplaaren een Databricks REST API-token genaamd DATABRICKS_API_TOKEN
.
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]]}'
Ondersteunde score-indelingen
Voor aangepaste modellen ondersteunt Model Serving scoreaanvragen in Pandas DataFrame- of Tensor-invoer.
Pandas DataFrame
Aanvragen moeten worden verzonden door een met JSON geserialiseerd Pandas DataFrame samen te stellen met een van de ondersteunde sleutels en een JSON-object dat overeenkomt met de invoerindeling.
(Aanbevolen)
dataframe_split
-indeling is een Met JSON geserialiseerd Pandas DataFrame in desplit
afdrukstand.{ "dataframe_split": { "index": [0, 1], "columns": ["sepal length (cm)", "sepal width (cm)", "petal length (cm)", "petal width (cm)"], "data": [[5.1, 3.5, 1.4, 0.2], [4.9, 3.0, 1.4, 0.2]] } }
dataframe_records
is JSON-geserialiseerd Pandas DataFrame in derecords
afdrukstand.Notitie
Deze indeling garandeert geen behoud van kolomvolgorde en de
split
-indeling heeft de voorkeur boven derecords
-indeling.{ "dataframe_records": [ { "sepal length (cm)": 5.1, "sepal width (cm)": 3.5, "petal length (cm)": 1.4, "petal width (cm)": 0.2 }, { "sepal length (cm)": 4.9, "sepal width (cm)": 3, "petal length (cm)": 1.4, "petal width (cm)": 0.2 }, { "sepal length (cm)": 4.7, "sepal width (cm)": 3.2, "petal length (cm)": 1.3, "petal width (cm)": 0.2 } ] }
Het antwoord van het eindpunt bevat de uitvoer van uw model, geserialiseerd met JSON, verpakt in een predictions
sleutel.
{
"predictions": [0,1,1,1,0]
}
Tensor-invoer
Wanneer uw model tensors verwacht, zoals een TensorFlow- of Pytorch-model, zijn er twee ondersteunde indelingsopties voor het verzenden van aanvragen: instances
en inputs
.
Als u meerdere benoemde tensors per rij hebt, moet u een van elke tensor voor elke rij hebben.
instances
is een op tensors gebaseerde indeling die tensors in rijindeling accepteert. Gebruik deze indeling als alle invoertenors dezelfde dimensie van 0 hebben. Conceptueel gezien kan elke tensor in de lijst met instanties worden samengevoegd met de andere tensors van dezelfde naam in de rest van de lijst om de volledige invoertensor voor het model te maken, wat alleen mogelijk zou zijn als alle tensors dezelfde 0e dimensie hebben.{"instances": [ 1, 2, 3 ]}
In het volgende voorbeeld ziet u hoe u meerdere benoemde tensors opgeeft.
{ "instances": [ { "t1": "a", "t2": [1, 2, 3, 4, 5], "t3": [[1, 2], [3, 4], [5, 6]] }, { "t1": "b", "t2": [6, 7, 8, 9, 10], "t3": [[7, 8], [9, 10], [11, 12]] } ] }
inputs
query's met tensors verzenden in kolomindeling. Deze aanvraag is anders omdat er eigenlijk een ander aantal tensor-exemplaren vant2
(3)t1
dan ent3
, dus het is niet mogelijk om deze invoer in deinstances
indeling weer te geven.{ "inputs": { "t1": ["a", "b"], "t2": [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]], "t3": [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]] } }
Het antwoord van het eindpunt heeft de volgende indeling.
{
"predictions": [0,1,1,1,0]
}
Voorbeeld van notitieblok
Zie het volgende notebook voor een voorbeeld van het testen van uw Model Serving-eindpunt met een Python-model: