Pontos de extremidade de serviço de consulta para modelos personalizados
Neste artigo, saiba como formatar solicitações de pontuação para seu modelo atendido e como enviar essas solicitações para o ponto de extremidade de serviço do modelo. A orientação é relevante para servir modelos personalizados, que o Databricks define como modelos de ML tradicionais ou modelos Python personalizados empacotados no formato MLflow. Eles podem ser registrados no Unity Catalog ou no registro do modelo de espaço de trabalho. Exemplos incluem os modelos de transformador scikit-learn, XGBoost, PyTorch e Hugging Face. Consulte Implantar modelos usando o Mosaic AI Model Serving para obter mais informações sobre essa funcionalidade e categorias de modelos suportados.
Para solicitações de consulta para cargas de trabalho generativas de IA e LLM, consulte Query foundation models.
Requerimentos
- Um modelo de ponto de extremidade de serviço.
- Para o SDK de implantação do MLflow, o MLflow 2.9 ou superior é necessário.
- Pedido de pontuação num formato aceite.
- Para enviar uma solicitação de pontuação por meio da API REST ou do SDK de implantação do MLflow, você deve ter um token de API do Databricks.
Importante
Como prática recomendada de segurança para cenários de produção, o Databricks recomenda que você use tokens OAuth máquina a máquina para autenticação durante a produção.
Para teste e desenvolvimento, o Databricks recomenda o uso de um token de acesso pessoal pertencente a entidades de serviço em vez de usuários do espaço de trabalho. Para criar tokens para entidades de serviço, consulte Gerenciar tokens para uma entidade de serviço.
Consultando métodos e exemplos
O Mosaic AI Model Serving fornece as seguintes opções para enviar solicitações de pontuação para modelos atendidos:
Método | Detalhes |
---|---|
Servindo a interface do usuário | Select ponto de extremidade de consulta a partir da página de ponto de extremidade de serviço no espaço de trabalho do Databricks. Insert dados de entrada do modelo de formato JSON e clique em Enviar solicitação. Se o modelo tiver um exemplo de entrada registrado, use Mostrar exemplo para carregá-lo. |
Função SQL | Invoque a inferência do modelo diretamente do SQL usando a ai_query função SQL. Consulte Consultar um modelo servido com ai_query. |
API REST | Chame e consulte o modelo usando a API REST. Consulte POST /serving-endpoints/{name}/invocations para obter detalhes. Para marcar solicitações para pontos de extremidade que atendem a vários modelos, consulte Consultar modelos individuais atrás de um ponto de extremidade. |
SDK de implantações MLflow | Use a função predict() do MLflow Deployments SDK para consultar o modelo. |
Exemplo de pontuação do Pandas DataFrame
O exemplo a seguir pressupõe um MODEL_VERSION_URI
parecido com https://<databricks-instance>/model/iris-classifier/Production/invocations
, where,<databricks-instance>
é o nome da instância do seu Databricks, e um token de API REST do Databricks designado por DATABRICKS_API_TOKEN
.
Consulte Formatos de pontuação suportados.
API REST
Pontuar um modelo que aceita o formato de entrada dividido do dataframe.
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]]
}]
}'
Pontuar um modelo aceitando entradas tensoras. As entradas do tensor devem ser formatadas conforme descrito na documentação da API do 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]]}'
SDK de implantações MLflow
Importante
O exemplo a seguir usa a predict()
API do 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]]
}
}
)
SQL
Importante
O exemplo a seguir usa a função SQL interna, ai_query. Esta função é Public Preview e a definição pode mudar. Consulte Consultar um modelo servido com ai_query.
O exemplo a seguir consulta o modelo por trás do sentiment-analysis
ponto de extremidade com o text
conjunto de dados e especifica o tipo de retorno da solicitação.
SELECT text, ai_query(
"sentiment-analysis",
text,
returnType => "STRUCT<label:STRING, score:DOUBLE>"
) AS predict
FROM
catalog.schema.customer_reviews
Power BI
Você pode pontuar um conjunto de dados no Power BI Desktop usando as seguintes etapas:
Abra o conjunto de dados que você deseja pontuar.
Vá para Transformar dados.
Clique com o botão direito do rato no painel esquerdo e selectCriar Nova Consulta.
Vá para Ver > Editor Avançado.
Substitua o corpo da consulta pelo trecho de código abaixo, depois de preencher um arquivo apropriado
DATABRICKS_API_TOKEN
eMODEL_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
Nomeie a consulta com o nome do modelo desejado.
Abra o editor de consultas avançado para seu conjunto de dados e aplique a função de modelo.
Exemplo de entrada de tensor
O exemplo a seguir pontua um modelo que aceita entradas tensoras. As entradas do tensor devem ser formatadas conforme descrito nos documentos da API do TensorFlow Serving. Este exemplo assume um MODEL_VERSION_URI
semelhante a https://<databricks-instance>/model/iris-classifier/Production/invocations
, onde where<databricks-instance>
é o nome da instância do seu Databrickse um token da API REST do Databricks chamado 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]]}'
Formatos de pontuação suportados
Para modelos personalizados, o Model Serving suporta solicitações de pontuação na entrada Pandas DataFrame ou Tensor.
Pandas DataFrame
As solicitações devem ser enviadas construindo um Pandas DataFrame serializado por JSON com uma das chaves suportadas e um objeto JSON correspondente ao formato de entrada.
(Recomendado)
dataframe_split
é um Pandas DataFrame serializado por JSON nasplit
orientação.{ "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
é serializado por JSON Pandas DataFrame narecords
orientação.Nota
Este formato não garante a preservação da ordenação column, e o formato
split
é preferido em relação ao formatorecords
.{ "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 } ] }
A resposta do ponto de extremidade contém a saída do seu modelo, serializada com JSON, encapsulada em uma predictions
chave.
{
"predictions": [0,1,1,1,0]
}
Entrada tensor
Quando seu modelo espera tensores, como um modelo TensorFlow ou Pytorch, há duas opções de formato suportadas para enviar solicitações: instances
e inputs
.
Se você tiver vários tensores nomeados por linha, então você tem que ter um de cada tensor para cada linha.
instances
é um formato baseado em tensores que aceita tensores em formato de linha. Use este formato se todos os tensores de entrada tiverem a mesma dimensão 0. Conceitualmente, cada tensor nas instâncias list poderia ser unido com os outros tensores de mesmo nome no resto da list construir o tensor de entrada completo para o modelo, o que só seria possível se todos os tensores tivessem a mesma dimensão 0-ésima.{"instances": [ 1, 2, 3 ]}
O exemplo a seguir mostra como especificar vários tensores nomeados.
{ "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
Envie consultas com tensores em formato colunar. Esta solicitação é diferente porque na verdade há um número diferente de instâncias tensorast2
det1
(3) do quet3
einstances
, portanto, não é possível representar essa entrada no formato.{ "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]]] } }
A resposta do ponto de extremidade está no seguinte formato.
{
"predictions": [0,1,1,1,0]
}
Exemplo de bloco de notas
Consulte o bloco de anotações a seguir para obter um exemplo de como testar seu ponto de extremidade do Model Serving com um modelo Python: