Implantar modelos de MLflow em pontos de extremidade online
APLICA-SE A: Extensão de ML da CLI do Azurev2 (atual)
Neste artigo, aprenda a implantar o modelo de MLflow e um ponto de extremidade online para inferência em tempo real. Ao implantar o modelo do MLflow em um ponto de extremidade online, não é necessário especificar um script de pontuação ou um ambiente; essa funcionalidade é conhecida como implantação sem código.
Para a implantação sem código, o Azure Machine Learning:
- Instala dinamicamente os pacotes do Python fornecidos no arquivo
conda.yaml
. Portanto, as dependências são instaladas durante o runtime do contêiner. - Fornece uma imagem base/ambiente coletado do MLflow que contém os seguintes itens:
azureml-inference-server-http
mlflow-skinny
- Um script de pontuação para inferência.
Dica
Workspaces sem acesso à rede pública: antes de implantar modelos do MLflow em pontos de extremidade online sem conectividade de saída, você precisa empacotar os modelos (versão prévia). Usando o empacotamento de modelo, você pode evitar a necessidade de uma conexão com a Internet, o que, de outro modo, o Azure Machine Learning exigirá para instalar dinamicamente os pacotes do Python necessários para os modelos do MLflow.
Sobre o exemplo
O exemplo mostra como você pode implantar um modelo do MLflow em um ponto de extremidade online para executar previsões. O exemplo usa um modelo do MLflow baseado no conjunto de dados Diabetes. Esse conjunto de dados contém dez variáveis de linha de base: idade, sexo, índice de massa corporal, pressão arterial média e seis medidas de soro sanguíneo obtidas de 442 pacientes com diabetes. Também contém a resposta de interesse, uma medida quantitativa da progressão da doença um ano após a linha de base.
O modelo foi treinado usando um regressor scikit-learn
, e todo o pré-processamento necessário foi empacotado como um pipeline, tornando esse modelo um pipeline de ponta a ponta que vai de dados brutos a previsões.
As informações deste artigo se baseiam em exemplos de código contidos no repositório azureml-examples. Para executar os comandos localmente sem precisar copiar/colar YAML e outros arquivos, clone o repositório e, em seguida, altere os diretórios para cli
, se estiver usando a CLI do Azure. Se você estiver usando o SDK do Azure Machine Learning para Python, altere os diretórios para sdk/python/endpoints/online/mlflow
.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Acompanhar no Jupyter Notebook
Siga as etapas para usar o SDK do Python do Azure Machine Learning abrindo o notebook Implantar modelo do MLflow em pontos de extremidade online no repositório clonado.
Pré-requisitos
Antes de seguir as etapas neste artigo, verifique se você tem os seguintes pré-requisitos:
Uma assinatura do Azure. Caso não tenha uma assinatura do Azure, crie uma conta gratuita antes de começar. Experimente a versão gratuita ou paga do Azure Machine Learning.
O RBAC do Azure (controle de acesso baseado em função) do Azure é usado para permitir acesso a operações no Azure Machine Learning. Para executar as etapas neste artigo, sua conta de usuário deve receber a função de proprietário ou colaborador para o workspace do Azure Machine Learning ou uma função personalizada que permita
Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*
. Para obter mais informações, confira Gerenciar acesso a um workspace do Azure Machine Learning.Você deve ter um modelo do MLflow registrado em seu workspace. Este artigo registra um modelo treinado para o conjunto de dados Diabetes no workspace.
Além disso, você precisa:
- Instale a CLI do Azure e a extensão
ml
na CLI do Azure. Para obter mais informações sobre como instalar a CLI, confira Instalar e configurar a CLI (v2).
- Instale a CLI do Azure e a extensão
Conectar-se ao workspace
Primeiro, conecte-se ao workspace do Azure Machine Learning no qual você trabalhará.
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Registre o modelo
Você pode implantar apenas modelos registrados em pontos de extremidade online. Nesse caso, você já tem uma cópia local do modelo no repositório, portanto, só precisa publicar o modelo no registro do workspace. Você poderá pular essa etapa se o modelo que está tentando implantar já estiver registrado.
MODEL_NAME='sklearn-diabetes'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "endpoints/online/ncd/sklearn-diabetes/model"
E se o seu modelo foi registrado dentro de uma execução?
Se o seu modelo foi registrado dentro de uma execução, você poderá registrá-lo diretamente.
Para registrar o modelo, você precisa saber o local onde ele está armazenado. Se você estiver usando o recurso autolog
do MLflow, o caminho para o modelo dependerá do tipo de modelo e da estrutura. Você deve verificar a saída dos trabalhos para identificar o nome da pasta do modelo. A pasta contém um arquivo chamado MLModel
.
Se você estiver usando o método log_model
para registrar manualmente seus modelos, passe o caminho para o modelo como o argumento para o método. Por exemplo, se você registrar o modelo usando mlflow.sklearn.log_model(my_model, "classifier")
, o caminho em que o modelo está armazenado será chamado de classifier
.
Use a CLI do Azure Machine Learning v2 para criar um modelo de uma saída de trabalho de treinamento. No exemplo a seguir, um modelo nomeado $MODEL_NAME
é registrado usando os artefatos de um trabalho com a ID $RUN_ID
. O caminho em que o modelo é armazenado é $MODEL_PATH
.
az ml model create --name $MODEL_NAME --path azureml://jobs/$RUN_ID/outputs/artifacts/$MODEL_PATH
Observação
O caminho $MODEL_PATH
é o local em que o modelo foi armazenado na execução.
Implantar um modelo do MLflow em um ponto de extremidade online
Configure o ponto de extremidade em que o modelo será implantado. O exemplo a seguir configura o nome e o modo de autenticação do ponto de extremidade:
Defina um nome de ponto de extremidade executando o seguinte comando (substitua
YOUR_ENDPOINT_NAME
por um nome exclusivo):export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
Configurar o ponto de extremidade:
create-endpoint.yaml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json name: my-endpoint auth_mode: key
Criar o ponto de extremidade:
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
Configurar a implantação. Uma implantação é um conjunto de recursos necessários para hospedar o modelo que executa a inferência real.
sklearn-deployment.yaml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: sklearn-deployment endpoint_name: my-endpoint model: name: mir-sample-sklearn-ncd-model version: 2 path: sklearn-diabetes/model type: mlflow_model instance_type: Standard_DS3_v2 instance_count: 1
Observação
A geração automática de
scoring_script
eenvironment
só tem suporte para a variante do modelopyfunc
. Para usar uma variante diferente, confira Personalização das implantações de modelo do MLflow.Criar a implantação:
az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
Se o ponto de extremidade não tiver conectividade de saída, use o empacotamento de modelo (versão prévia) incluindo o sinalizador
--with-package
:az ml online-deployment create --with-package --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
Atribua todo o tráfego à implantação. Até agora, o ponto de extremidade tem uma implantação, mas nenhum tráfego é atribuído a ele.
Essa etapa não é necessária na CLI do Azure, pois você usou o sinalizador
--all-traffic
durante a criação. Se você precisar alterar o tráfego, poderá usar o comandoaz ml online-endpoint update --traffic
. Para obter mais informações sobre como atualizar o tráfego, confira Atualizar progressivamente o tráfego.Atualizar a configuração do ponto de extremidade:
Essa etapa não é necessária na CLI do Azure, pois você usou o sinalizador
--all-traffic
durante a criação. Se você precisar alterar o tráfego, poderá usar o comandoaz ml online-endpoint update --traffic
. Para obter mais informações sobre como atualizar o tráfego, confira Atualizar progressivamente o tráfego.
Invocar o ponto de extremidade
Depois que a implantação estiver pronta, você poderá usá-la para atender à solicitação. Uma maneira de testar a implantação é usar o recurso de invocação integrado no cliente de implantação que você está usando. O JSON a seguir é uma solicitação de exemplo para a implantação.
sample-request-sklearn.json
{"input_data": {
"columns": [
"age",
"sex",
"bmi",
"bp",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6"
],
"data": [
[ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
[ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
],
"index": [0,1]
}}
Observação
input_data
é usado nesse exemplo, em vez do inputs
usado no serviço do MLflow. Isso ocorre porque o Azure Machine Learning exige um formato de entrada diferente para poder gerar automaticamente os contratos do Swagger para os pontos de extremidade. Para obter mais informações sobre os formatos de entrada esperados, confira Diferenças entre os modelos implantados no Azure Machine Learning e no servidor interno do MLflow.
Envie uma solicitação para o ponto de extremidade da seguinte maneira:
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
A resposta será semelhante ao seguinte texto:
[
11633.100167144921,
8522.117402884991
]
Importante
Para MLflow sem código-implantação, não há suporte para o teste por meio de pontos de extremidade locais .
Personalizar implantações de modelo do MLflow
Você não precisa especificar um script de pontuação na definição de implantação de um modelo do MLflow para um ponto de extremidade online. No entanto, você pode optar por fazer isso e personalizar como a inferência é executada.
Normalmente, você desejará personalizar a implantação do modelo MLflow quando:
- O modelo não tem um sabor
PyFunc
. - Você precisa personalizar a forma como o modelo é executado, por exemplo, para usar uma variante específica para carregar o modelo, usando
mlflow.<flavor>.load_model()
. - Você precisa fazer o pré/pós-processamento em sua rotina de pontuação quando isso não for feito pelo próprio modelo.
- A saída do modelo não pode ser bem representada em dados tabulares. Por exemplo, é um tensor que representa uma imagem.
Importante
Se você optar por especificar um script de pontuação para uma implantação de modelo do MLflow, também precisará especificar o ambiente em que a implantação será executada.
Etapas
Para implantar um modelo do MLflow com um script de pontuação personalizado:
Identifique a pasta em que seu modelo do MLflow está localizado.
a. Vá para o estúdio do Azure Machine Learning.
b. Vá para a seção Modelos.
c. Selecione o modelo que está tentando implantar e vá para a guia Artefatos.
d. Anote a pasta exibida. Essa pasta foi especificada quando o modelo foi registrado.
Crie um script de pontuação. Observe como o nome da pasta
model
que você identificou anteriormente está incluído na funçãoinit()
.Dica
O script de pontuação a seguir é fornecido como um exemplo de como executar a inferência com um modelo do MLflow. Você pode adaptar esse script às suas necessidades ou alterar qualquer uma de suas partes para refletir seu cenário.
score.py
import logging import os import json import mlflow from io import StringIO from mlflow.pyfunc.scoring_server import infer_and_parse_json_input, predictions_to_json def init(): global model global input_schema # "model" is the path of the mlflow artifacts when the model was registered. For automl # models, this is generally "mlflow-model". model_path = os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model") model = mlflow.pyfunc.load_model(model_path) input_schema = model.metadata.get_input_schema() def run(raw_data): json_data = json.loads(raw_data) if "input_data" not in json_data.keys(): raise Exception("Request must contain a top level key named 'input_data'") serving_input = json.dumps(json_data["input_data"]) data = infer_and_parse_json_input(serving_input, input_schema) predictions = model.predict(data) result = StringIO() predictions_to_json(predictions, result) return result.getvalue()
Aviso
Consultoria do MLflow 2.0: o script de pontuação fornecido funcionará com o MLflow 1.X e o MLflow 2.X. No entanto, saiba que os formatos de entrada/saída esperados nessas versões podem variar. Verifique a definição de ambiente usada para garantir que você esteja usando a versão esperada do MLflow. Observe que o MLflow 2.0 só tem suporte no Python 3.8+.
Crie um ambiente em que o script de pontuação possa ser executado. Como o modelo é um modelo do MLflow, os requisitos do conda também são especificados no pacote do modelo. Para obter mais detalhes sobre os arquivos incluídos em um modelo do MLflow, confira O formato do MLmodel. Em seguida, você criará o ambiente usando as dependências do conda do arquivo. No entanto, você também precisa incluir o pacote
azureml-inference-server-http
, que é necessário para implantações online no Azure Machine Learning.O arquivo de definição do conda é o seguinte:
conda.yml
channels: - conda-forge dependencies: - python=3.9 - pip - pip: - mlflow - scikit-learn==1.2.2 - cloudpickle==2.2.1 - psutil==5.9.4 - pandas==2.0.0 - azureml-inference-server-http name: mlflow-env
Observação
O pacote
azureml-inference-server-http
foi adicionado ao arquivo original de dependências do conda.Você usará esse arquivo de dependências do conda para criar o ambiente:
O ambiente será criado embutido na configuração de implantação.
Criar a implantação:
Criar um arquivo de configuração de implantação deployment.yml:
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: sklearn-diabetes-custom endpoint_name: my-endpoint model: azureml:sklearn-diabetes@latest environment: image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04 conda_file: sklearn-diabetes/environment/conda.yml code_configuration: code: sklearn-diabetes/src scoring_script: score.py instance_type: Standard_F2s_v2 instance_count: 1
Criar a implantação:
az ml online-deployment create -f deployment.yml
Após a conclusão da implantação, ela estará pronta para atender às solicitações. Uma maneira de testar a implantação é usar um arquivo de solicitação de amostra junto com o método
invoke
.sample-request-sklearn.json
{"input_data": { "columns": [ "age", "sex", "bmi", "bp", "s1", "s2", "s3", "s4", "s5", "s6" ], "data": [ [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ], [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0] ], "index": [0,1] }}
Envie uma solicitação para o ponto de extremidade da seguinte maneira:
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
A resposta será semelhante ao seguinte texto:
{ "predictions": [ 11633.100167144921, 8522.117402884991 ] }
Aviso
Aviso do MLflow 2.0: no MLflow 1.X, a chave
predictions
estará ausente.
Limpar os recursos
Depois de terminar de usar o ponto de extremidade, exclua seus recursos associados:
az ml online-endpoint delete --name $ENDPOINT_NAME --yes