Wykonywanie zapytań dotyczących punktów końcowych dla modeli niestandardowych
W tym artykule dowiesz się, jak sformatować żądania oceniania dla obsługiwanego modelu oraz jak wysyłać te żądania do punktu końcowego obsługującego model. Wskazówki dotyczą obsługi modeli niestandardowych, które usługa Databricks definiuje jako tradycyjne modele uczenia maszynowego lub dostosowane modele języka Python spakowane w formacie MLflow. Można je zarejestrować w Unity Catalog lub w rejestrze modeli przestrzeni roboczej. Przykłady obejmują scikit-learn, XGBoost, PyTorch oraz modele transformer Hugging Face. Zobacz Deploy models using Mosaic AI Model Serving, aby uzyskać więcej informacji na temat tej funkcjonalności i obsługiwanych kategorii modeli.
Aby uzyskać zapytania dotyczące obciążeń generatywnej sztucznej inteligencji i LLM, zobacz Korzystanie z modeli podstawowych.
Wymagania
- Model obsługujący punkt końcowy.
- W przypadku zestawu MLflow Deployment SDK wymagany jest zestaw MLflow 2.9 lub nowszy.
- Prośba o ocenę w uznawanym formacie.
- Aby wysłać żądanie oceniania za pomocą interfejsu API REST lub zestawu MLflow Deployment SDK, musisz mieć token interfejsu API usługi Databricks.
Ważne
Jako najlepsza praktyka w zakresie bezpieczeństwa w scenariuszach produkcyjnych, Databricks zaleca używanie tokenów OAuth maszyna-maszyna do uwierzytelniania w produkcji.
W przypadku testowania i programowania usługa Databricks zaleca używanie osobistego tokenu dostępu należącego do jednostek usługi zamiast użytkowników obszaru roboczego. Aby utworzyć tokeny dla jednostek usługi, zobacz Zarządzanie tokenami dla jednostki usługi.
Metody i przykłady wykonywania zapytań
Usługa Mosaic AI Model Serving udostępnia następujące opcje wysyłania żądań punktacji do obsługiwanych modeli:
Metoda | Szczegóły |
---|---|
Serwowanie interfejsu użytkownika | Wybierz Punkt końcowy kwerendy ze strony Punkt końcowy obsługi w obszarze roboczym Databricks. Wstaw dane wejściowe modelu formatu JSON i kliknij pozycję Wyślij żądanie. Jeśli model ma zarejestrowany przykład danych wejściowych, użyj polecenia Pokaż przykład , aby go załadować. |
funkcja SQL | Wywoływanie wnioskowania modelu bezpośrednio z bazy danych SQL przy użyciu ai_query funkcji SQL. Zobacz ai_query funkcję. |
Interfejs API REST | Wywoływanie modelu i wykonywanie zapytań względem tego modelu przy użyciu interfejsu API REST. Aby uzyskać szczegółowe informacje, zobacz POST /serving-endpoints/{name}/invocations . Aby uzyskać informacje na temat oceniania żądań do punktów dostępowych obsługujących wiele modeli, zobacz Wykonywanie zapytań dla poszczególnych modeli z wykorzystaniem punktu dostępowego. |
Zestaw SDK wdrożeń MLflow | Funkcja predict() zestawu SDK wdrożeń MLflow umożliwia wykonywanie zapytań względem modelu. |
Przykład oceny DataFrame Pandas
W poniższym przykładzie przyjęto założenie, że MODEL_VERSION_URI
jest podobne do https://<databricks-instance>/model/iris-classifier/Production/invocations
, gdzie <databricks-instance>
to nazwa wystąpienia usługi Databricks, a to token interfejsu API REST usługi Databricks o nazwie DATABRICKS_API_TOKEN
.
Zobacz Obsługiwane formaty oceniania.
Interfejs API REST
Oceń model akceptujący format wejściowy ramki danych z podziałem.
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]]
}]
}'
Ocenić model przyjmujący tensory jako dane wejściowe. Dane wejściowe tensorów powinny być sformatowane zgodnie z opisem w dokumentacji interfejsu API TensorFlow.
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]]}'
Zestaw SDK wdrożeń MLflow
Ważne
W poniższym przykładzie użyto predict()
API z MLflow Deployments SDK.
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]]
}
}
)
PowerBI
Zestaw danych można ocenić w programie Power BI Desktop, wykonując następujące kroki:
Otwórz zestaw danych, który chcesz ocenić.
Przejdź do pozycji Przekształć dane.
Kliknij prawym przyciskiem myszy w panelu po lewej stronie i wybierz pozycję Utwórz nowe zapytanie.
Przejdź do Wyświetl Edytor zaawansowany>.
Zastąp treść zapytania poniższym fragmentem kodu po wypełnieniu odpowiednich
DATABRICKS_API_TOKEN
iMODEL_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
Nadaj kwerendzie nazwę żądanego modelu.
Otwórz zaawansowany edytor zapytań dla zestawu danych i zastosuj funkcję modelu.
Przykład wejściowych danych tensorowych
Poniższy przykład ocenia model akceptujący wejścia tensora. Dane wejściowe tensora powinny być sformatowane zgodnie z opisem w dokumentacji interfejsu API usługi TensorFlow
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]]}'
Obsługiwane formaty oceniania
W przypadku modeli niestandardowych obsługa modeli obsługuje ocenianie żądań w ramce danych Biblioteki Pandas lub danych wejściowych Tensor.
Ramka danych Pandas
Żądania powinny być wysyłane przez skonstruowanie zserializowanej ramki danych Pandas w formacie JSON z jednym z obsługiwanych kluczy i obiektu JSON odpowiadającego formatowi wejściowemu.
(Zalecane)
dataframe_split
format to serializowana ramka danych Biblioteki Pandas w formacie JSON w orientacjisplit
.{ "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
to serializowana ramka danych Pandas w formacie JSON w orientacjirecords
.Uwaga
Ten format nie gwarantuje zachowania kolejności kolumn, a format
split
jest preferowany w formacierecords
.{ "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 } ] }
Odpowiedź z punktu końcowego zawiera dane wyjściowe z modelu, sformatowane w JSON i opakowane jako klucz predictions
.
{
"predictions": [0, 1, 1, 1, 0]
}
Dane wejściowe programu Tensor
Gdy model oczekuje tensorów, takich jak model TensorFlow lub Pytorch, istnieją dwie obsługiwane opcje formatowania wysyłania żądań: instances
i inputs
.
Jeśli masz wiele nazwanych tensorów na wiersz, musisz mieć po jednym z każdego tensora dla każdego wiersza.
instances
jest formatem opartym na tensorach, który akceptuje tensory w formacie wiersza. Użyj tego formatu, jeśli wszystkie tensory wejściowe mają ten sam wymiar 0-ty. Koncepcyjnie każdy tensor na liście wystąpień może być połączony z innymi tensorami o tej samej nazwie w pozostałej części listy, aby utworzyć pełny tensor wejściowy dla modelu, co byłoby możliwe tylko wtedy, gdy wszystkie tensory mają ten sam wymiar 0.{ "instances": [1, 2, 3] }
Poniższy przykład pokazuje, jak określić wiele tensorów z nazwami.
{ "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
wysyłaj zapytania z wykorzystaniem tensorów w formacie kolumnowym. To żądanie jest inne, ponieważ istnieje w rzeczywistości inna liczba wystąpień tensorów (3) niżt2
it1
, więc nie można reprezentować tych danych wejściowycht3
winstances
formacie.{ "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] ] ] } }
Odpowiedź z punktu końcowego ma następujący format.
{
"predictions": [0, 1, 1, 1, 0]
}
Przykład notatnika
Zapoznaj się z poniższym notatnikiem, aby uzyskać przykład testowania punktu końcowego obsługi modelu przy użyciu modelu w języku Python.