Legado MLflow servindo modelo on Databricks
Visualização
Esse recurso está em Public Preview.
- Essa documentação foi descontinuada e pode não estar atualizada. O produto, serviço ou tecnologia mencionados neste conteúdo não são mais suportados.
- As orientações contidas neste artigo são para o Legacy MLflow servindo modelo. Databricks recomenda que o senhor migre seu modelo servindo fluxo de trabalho para o modelo servindo para o modelo aprimorado endpoint implantação e escalabilidade. Para obter mais informações, consulte modelos implantados usando Mosaic AI Model Serving.
O legado MLflow servindo modelo permite que o senhor hospede o modelo de aprendizado de máquina de Model Registry como endpoint REST que são atualizados automaticamente com base na disponibilidade das versões do modelo e seus estágios. Ele usa um clustering de nó único que executa sob seu próprio account dentro do que agora é chamado de plano clássico compute. Esse plano compute inclui a rede virtual e seus recursos compute associados, como clustering para Notebook e Job, warehouse pro e classic SQL e endpoint Legacy servindo modelo.
Quando o senhor ativa o servindo modelo para um determinado modelo registrado, o site Databricks cria automaticamente um clustering exclusivo para o modelo e implanta todas as versões não arquivadas do modelo nesse clustering. Databricks reinicia o clustering se ocorrer um erro e encerra o clustering quando o senhor desativa o servindo modelo para o modelo. servindo modelo sincroniza automaticamente com Model Registry e implanta qualquer nova versão de modelo registrada. As versões do modelo implantado podem ser consultadas com uma solicitação padrão da API REST. O Databricks autentica as solicitações ao modelo usando sua autenticação padrão.
Enquanto esse serviço está em fase de pré-visualização, o site Databricks recomenda seu uso para aplicativos de baixa taxa de transferência e não críticos. A taxa de transferência desejada é de 200 qps e a disponibilidade desejada é de 99,5%, embora nenhuma garantia seja feita em relação a isso. Além disso, há um limite de tamanho de carga útil de 16 MB por solicitação.
Cada versão do modelo é implantada usando a implantação MLflow e a execução do modelo em um Conda ambiente especificado por suas dependências.
- O clustering é mantido enquanto o serviço estiver ativado, mesmo que não exista uma versão ativa do modelo. Para encerrar o clustering de serviço, desative o modelo de serviço para o modelo registrado.
- O clustering é considerado um clusters todo-propósito, sujeito a preços de carga de trabalho todo-propósito.
- Os scripts de inicialização global não são executados no modelo de clustering de serviço.
A Anaconda Inc. atualizou seus termos de serviço para o canal anaconda.org. Com base nos novos termos de serviço, o senhor pode precisar de uma licença comercial se depender do empacotamento e da distribuição do Anaconda. Para obter mais informações, consulte as Perguntas frequentes sobre o Anaconda Commercial Edition. Seu uso de qualquer canal da Anaconda é regido pelos respectivos termos de serviço.
MLflow Os registros de modelos anteriores à v1.18 (Databricks Runtime 8.3 ML ou anterior) eram por registros default com o canal conda defaults
(https://repo.anaconda.com/pkgs/) como uma dependência. Devido a essa alteração de licença, o site Databricks interrompeu o uso do canal defaults
para registros de modelos que usam MLflow v1.18 e acima. Os registros do canal default agora são conda-forge
, que apontam para a comunidade gerenciar https://conda-forge.org/.
Se o senhor fizer o logon de um modelo antes de MLflow v1.18 sem excluir o canal defaults
do ambiente conda para o modelo, esse modelo poderá ter uma dependência do canal defaults
que o senhor talvez não tenha pretendido.
Para confirmar manualmente se um modelo tem essa dependência, o senhor pode examinar o valor channel
no arquivo conda.yaml
que é empacotado com os modelos registrados. Por exemplo, o site conda.yaml
de um modelo com uma dependência de canal defaults
pode ter a seguinte aparência:
channels:
- defaults
dependencies:
- python=3.8.8
- pip
- pip:
- mlflow
- scikit-learn==0.23.2
- cloudpickle==1.6.0
name: mlflow-env
Como a Databricks não pode determinar se o uso do repositório do Anaconda para interagir com seus modelos é permitido em seu relacionamento com o Anaconda, a Databricks não está forçando seus clientes a fazer alterações. Se o seu uso do repositório Anaconda.com por meio do uso do Databricks for permitido de acordo com os termos do Anaconda, o senhor não precisará tomar nenhuma medida.
Se quiser alterar o canal usado no ambiente de um modelo, o senhor pode registrar novamente o modelo no registro de modelo com um novo conda.yaml
. O senhor pode fazer isso especificando o canal no parâmetro conda_env
de log_model()
.
Para obter mais informações sobre log_model()
API, consulte a documentação MLflow da variante de modelo com a qual o senhor está trabalhando, por exemplo, os logs de scikit-learn.
Para obter mais informações sobre arquivos conda.yaml
, consulte a documentaçãoMLflow.
Requisitos
- O legado MLflow servindo modelo está disponível para os modelos Python MLflow . Você deve declarar todas as dependências do modelo no ambiente conda. Consulte modelos de dependências registradas.
- Para ativar o servindo modelo, o senhor deve ter permissão de criação de clustering.
servindo modelo de Model Registry
A servindo modelo está disponível em Databricks a partir de Model Registry.
Ativar e desativar o modelo de serviço
Você habilita um modelo para servir a partir de sua página de modelo registrada.
-
Clique em Serving tab. Se o modelo ainda não estiver habilitado para servir, o botão Ativar serviço será exibido.
-
Clique em Ativar serviço . O site Serving tab é exibido com o status mostrado como Pending. Depois de alguns minutos, o Status muda para Pronto.
Para desativar um modelo para servir, clique em Parar .
Validar o modelo de serviço
No Serving tab, o senhor pode enviar uma solicitação ao modelo atendido e view a resposta.
URIs da versão do modelo
Cada versão do modelo implantado recebe um ou vários URIs exclusivos. No mínimo, cada versão do modelo recebe um URI construído da seguinte forma:
<databricks-instance>/model/<registered-model-name>/<model-version>/invocations
Por exemplo, para chamar a versão 1 de um modelo registrado como iris-classifier
, use este URI:
https://<databricks-instance>/model/iris-classifier/1/invocations
Você também pode chamar uma versão do modelo por estágio. Por exemplo, se a versão 1 estiver na fase de produção , ela também poderá ser pontuada usando este URI:
https://<databricks-instance>/model/iris-classifier/Production/invocations
A lista de URIs de modelo disponíveis é exibida na parte superior da página de serviço Model Versions tab.
gerenciar versões servidas
Todas as versões ativas (não arquivadas) do modelo são implantadas, e o senhor pode consultá-las usando os URIs. Databricks implanta automaticamente novas versões de modelos quando elas são registradas e remove automaticamente as versões antigas quando elas são arquivadas.
Todas as versões implantadas de um modelo registrado compartilham o mesmo clustering.
Gerenciar direitos de acesso ao modelo
Os direitos de acesso ao modelo são herdados do Model Registry. A ativação ou desativação do recurso de veiculação requer a permissão "gerenciar" no modelo registrado. Qualquer pessoa com direitos de leitura pode marcar qualquer uma das versões implantadas.
Versões do modelo Score implantado
Para pontuar um modelo implantado, o senhor pode usar a interface do usuário ou enviar uma solicitação de API REST para o URI do modelo.
Pontuação via UI
Essa é a maneira mais fácil e rápida de testar o modelo. O senhor pode inserir os dados de entrada do modelo no formato JSON e clicar em Send Request (Enviar solicitação) . Se o modelo tiver sido registrado com um exemplo de entrada (como mostrado no gráfico acima), clique em Load Example (Carregar exemplo ) para carregar o exemplo de entrada.
Pontuação via solicitação de API REST
O senhor pode enviar uma solicitação de pontuação por meio da API REST usando a autenticação padrão do Databricks. Os exemplos abaixo demonstram a autenticação usando tokens de acesso pessoal com MLflow 1.x.
Como prática recomendada de segurança, ao se autenticar com ferramentas, sistemas, scripts e aplicativos automatizados, o Databricks recomenda que o senhor use o acesso pessoal tokens pertencente à entidade de serviço em vez dos usuários do workspace. Para criar tokens o site para uma entidade de serviço, consulte gerenciar tokens para uma entidade de serviço.
Dado um MODEL_VERSION_URI
como https://<databricks-instance>/model/iris-classifier/Production/invocations
(em que <databricks-instance>
é o nome da sua instância Databricks) e um Databricks REST API tokens chamado DATABRICKS_API_TOKEN
, os exemplos a seguir mostram como consultar um modelo atendido:
Os exemplos a seguir refletem o formato de pontuação para modelos criados com o MLflow 1.x. Se preferir usar o MLflow 2.0, o senhor precisará atualizar o formato da carga útil da solicitação.
- Bash
- Python
- PowerBI
Trecho para consultar um modelo que aceita entradas de dataframe.
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
}
]'
Trecho para consultar um modelo que aceita entradas de tensor. As entradas do Tensor devem ser formatadas conforme descrito nos documentos 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]]}'
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)
Você pode pontuar um dataset no Power BI Desktop usando as seguintes passos:
-
Abra o site dataset que o senhor deseja pontuar.
-
Ir para transformação de dados.
-
Clique com o botão direito do mouse no painel esquerdo e selecione Criar nova consulta .
-
Acesse o site > Advanced Editor .
-
Substitua o corpo da consulta pelo trecho de código abaixo, depois de preencher os campos
DATABRICKS_API_TOKEN
eMODEL_VERSION_URI
apropriados.(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 -
Nomeie a consulta com o nome do modelo desejado.
-
Abra o editor de consultas avançadas do site dataset e aplique a função de modelo.
Monitore modelos atendidos
A página de serviço exibe indicadores de status para o clustering de serviço, bem como versões de modelos individuais.
- Para inspecionar o estado do clustering de atendimento, use o Model Events tab, que exibe uma lista de todos os eventos de atendimento para esse modelo.
- Para inspecionar o estado de uma única versão do modelo, clique em Model Versions (Versões do modelo ) tab e role até view a guia Logs (Registros ) ou Version Events (Eventos da versão ).
Personalizar o clustering de serviço
Para personalizar o clustering de serviço, use as Configurações de clustering tab no Serving tab .
- Para modificar o tamanho da memória e o número de núcleos de um clustering de serviço, use o menu suspenso Instance Type (Tipo de instância ) para selecionar a configuração de clustering desejada. Quando o senhor clica em Salvar , o clustering existente é encerrado e um novo clustering é criado com as configurações especificadas.
- Para adicionar uma tag, digite o nome e o valor nos campos Adicionar tag e clique em Adicionar .
- Para editar ou excluir uma tag existente, clique em um dos ícones na coluna Ações da tabela Tags .
Erros conhecidos
ResolvePackageNotFound: pyspark=3.1.0
Esse erro pode ocorrer se um modelo depender de pyspark
e for registrado usando Databricks Runtime 8.x.
Se você ver esse erro, especifique a versão pyspark
explicitamente ao registrar o modelo, usando
o parâmetroconda_env
.
Unrecognized content type parameters: format
Esse erro pode ocorrer como resultado do novo formato de protocolo de pontuação do MLflow 2.0. Se você estiver vendo esse erro, provavelmente está usando um formato de solicitação de pontuação desatualizado. Para resolver o erro, você pode:
- Atualize seu formato de solicitação de pontuação para o protocolo mais recente.
Os exemplos a seguir refletem o formato de pontuação introduzido no MLflow 2.0. Se preferir usar o MLflow 1.x, o senhor pode modificar suas chamadas à API log_model()
para incluir a dependência da versão desejada do MLflow no parâmetro extra_pip_requirements
. Isso garante que o formato de pontuação apropriado seja usado.
mlflow.<flavor>.log_model(..., extra_pip_requirements=["mlflow==1.*"])
tab :::tab-item[bash] Consultar um modelo que aceita entradas de quadros de dados Pandas.
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}]
}'
Consulte um modelo que aceita entradas de tensor. As entradas do Tensor devem ser formatadas conforme descrito nos documentos 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]]}'
:::
Tab-item[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)
:::
tab-item[PowerBI] O senhor pode marcar um dataset no Power BI Desktop usando as seguintes etapas:
-
Abra o site dataset que o senhor deseja pontuar.
-
Ir para transformação de dados.
-
Clique com o botão direito do mouse no painel esquerdo e selecione Criar nova consulta .
-
Acesse o site > Advanced Editor .
-
Substitua o corpo da consulta pelo trecho de código abaixo, depois de preencher os campos
DATABRICKS_API_TOKEN
eMODEL_VERSION_URI
apropriados.(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 -
Nomeie a consulta com o nome do modelo desejado.
-
Abra o editor de consultas avançadas do site dataset e aplique a função de modelo. ::: ::::
- Se a sua solicitação de pontuação usar o cliente MLflow, como
mlflow.pyfunc.spark_udf()
, atualize o cliente MLflow para a versão 2.0 ou superior para usar o formato mais recente. Saiba mais sobre o protocolo de pontuação do modelo MLflow atualizado no MLflow 2.0.
Para obter mais informações sobre os formatos de dados de entrada aceitos pelo servidor (por exemplo, o formato orientado por divisão do Pandas ), consulte a documentação doMLflow.