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 do Anaconda é regido pelos 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 de acordo com seu relacionamento com o Anaconda, a Databricks não está forçando seus clientes a fazer nenhuma alteração. 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
Snippet to query a model accepting dataframe inputs.
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
}
]'
Snippet to query a model accepting tensor inputs. Tensor inputs should be formatted as described in TensorFlow Serving’s API docs.
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)
You can score a dataset in Power BI Desktop using the following steps:
-
Open dataset you want to score.
-
Go to Transform Data.
-
Right-click in the left panel and select Create New Query.
-
Go to View > Advanced Editor.
-
Replace the query body with the code snippet below, after filling in an appropriate
DATABRICKS_API_TOKEN
andMODEL_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 -
Name the query with your desired model name.
-
Open the advanced query editor for your dataset and apply the model function.
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.*"])
- Bash
- Python
- PowerBI
Query a model accepting pandas dataframe inputs.
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}]
}'
Query a model accepting tensor inputs. Tensor inputs should be formatted as described in TensorFlow Serving’s API docs.
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_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)
You can score a dataset in Power BI Desktop using the following steps:
-
Open dataset you want to score.
-
Go to Transform Data.
-
Right-click in the left panel and select Create New Query.
-
Go to View > Advanced Editor.
-
Replace the query body with the code snippet below, after filling in an appropriate
DATABRICKS_API_TOKEN
andMODEL_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 -
Name the query with your desired model name.
-
Open the advanced query editor for your dataset and apply the model function.
- 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.