Share via


Distribuição progressiva de modelos do MLflow para pontos de extremidade online

Neste artigo, você aprenderá como atualizar e implantar progressivamente modelos do MLflow em pontos de extremidade online sem causar interrupções no serviço. Você usará a implantação azul-verde, também conhecida como uma estratégia de distribuição segura, para introduzir uma nova versão de um serviço Web em produção. Essa estratégia permitirá que você implemente sua nova versão do serviço Web a um pequeno subconjunto de usuários ou solicitações antes de implantá-la completamente.

Sobre este exemplo

Os pontos de extremidade online têm o conceito de Ponto de Extremidade e Implantação. Um ponto de extremidade representa a API que os clientes usam para consumir o modelo, ao passo que a implantação indica a implementação específica dessa API. Essa distinção permite que os usuários desacoplem a API da implementação e alterem a implementação subjacente sem afetar o consumidor. Este exemplo usará esses conceitos para atualizar o modelo implantado em pontos de extremidade sem introduzir a interrupção do serviço.

O modelo que implantaremos é baseado no conjunto de dados UCI Heart Disease. O banco de dados contém 76 atributos, mas estamos usando um subconjunto de 14 deles. O modelo tenta prever a presença de doenças cardíacas em um paciente. Ele é inteiro com valor 0 (sem presença) a 1 (presença). Ele foi treinado usando um classificador XGBBoost e todo o pré-processamento necessário foi empacotado como um pipeline scikit-learn, 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 arquivos, clone o repositório e altere os diretórios para sdk/using-mlflow/deploy.

Acompanhar em Jupyter Notebooks

Você pode acompanhar este exemplo nos notebooks a seguir. No repositório clonado, abra o notebook: mlflow_sdk_online_endpoints_progresive.ipynb.

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 ser atribuída com 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, consulte Gerenciar acesso a um workspace do Azure Machine Learning.

Além disso, será necessário:

Conectar-se ao workspace

Primeiro, vamos nos conectar ao workspace do Azure Machine Learning no qual vamos trabalhar.

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>

Registrar o modelo no registro

Verifique se o modelo está registrado no Registro do Azure Machine Learning. Não há suporte para a implantação de modelos não registrados no Azure Machine Learning. Você pode registrar um novo modelo usando o SDK do MLflow:

MODEL_NAME='heart-classifier'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"

Criar um ponto de extremidade online

Os pontos de extremidade online são pontos de extremidade usados para inferência online (em tempo real). Os pontos de extremidade online contêm implantações que estão prontas para receber dados de clientes e podem retornar respostas em tempo real.

Vamos explorar essa funcionalidade implantando várias versões do mesmo modelo no mesmo ponto de extremidade. No entanto, a nova implantação receberá 0% do tráfego no começo. Depois que tivermos certeza que o novo modelo funciona corretamente, moveremos progressivamente o tráfego de uma implantação para a outra.

  1. Os pontos de extremidade exigem um nome, que precisa ser exclusivo na mesma região. Vamos nos certificar de criar um que não exista:

    ENDPOINT_SUFIX=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-5} | head -n 1)
    ENDPOINT_NAME="heart-classifier-$ENDPOINT_SUFIX"
    
  2. Configurar o ponto de extremidade

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: heart-classifier-edp
    auth_mode: key
    
  3. Criar o ponto de extremidade:

    az ml online-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
    
  4. Obtendo o segredo de autenticação para o ponto de extremidade.

    ENDPOINT_SECRET_KEY=$(az ml online-endpoint get-credentials -n $ENDPOINT_NAME | jq -r ".accessToken")
    

Criar uma implantação azul

Até agora, o ponto de extremidade está vazio. Não há implantações nele. Vamos criar o primeiro implantando o mesmo modelo em que estávamos trabalhando antes. Chamaremos essa implantação de “padrão”, representando nossa “implantação azul”.

  1. Configurar a implantação

    blue-deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: default
    endpoint_name: heart-classifier-edp
    model: azureml:heart-classifier@latest
    instance_type: Standard_DS2_v2
    instance_count: 1
    
  2. Criar a implantação

    az ml online-deployment create --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --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 --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --all-traffic
    

    Dica

    Definimos o sinalizador --all-traffic no comando create, que atribuirá todo o tráfego à nova implantação.

  3. Atribuir todo o tráfego à implantação

    Até agora, o ponto de extremidade tem uma implantação, mas nenhum tráfego é atribuído a ele. Vamos atribuí-lo.

    Esta etapa não é necessária na CLI do Azure, pois usamos --all-traffic durante a criação.

  4. Atualizar a configuração do ponto de extremidade:

    Esta etapa não é necessária na CLI do Azure, pois usamos --all-traffic durante a criação.

  5. Criar uma entrada de exemplo para testar a implantação

    sample.yml

    {
        "input_data": {
            "columns": [
                "age",
                "sex",
                "cp",
                "trestbps",
                "chol",
                "fbs",
                "restecg",
                "thalach",
                "exang",
                "oldpeak",
                "slope",
                "ca",
                "thal"
            ],
            "data": [
                [ 48, 0, 3, 130, 275, 0, 0, 139, 0, 0.2, 1, 0, "normal" ]
            ]
        }
    }
    
  6. Teste a implantação

    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file sample.json
    

Criar uma implantação verde no ponto de extremidade

Vamos imaginar que há uma nova versão do modelo criado pela equipe de desenvolvimento e que ele está pronto para estar em produção. Primeiro podemos tentar usar esse modelo e, quando estivermos confiantes, podemos atualizar o ponto de extremidade para rotear o tráfego para ele.

  1. Registrar uma nova versão do modelo

    MODEL_NAME='heart-classifier'
    az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"
    

    Vamos obter o número de versão do novo modelo:

    VERSION=$(az ml model show -n heart-classifier --label latest | jq -r ".version")
    
  2. Configurar uma nova implantação

    green-deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: xgboost-model
    endpoint_name: heart-classifier-edp
    model: azureml:heart-classifier@latest
    instance_type: Standard_DS2_v2
    instance_count: 1
    

    Nomearemos a implantação da seguinte maneira:

    GREEN_DEPLOYMENT_NAME="xgboost-model-$VERSION"
    
  3. Criar a nova implantação

    az ml online-deployment create -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
    

    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 -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
    
  4. Testar a implantação sem alterar o tráfego

    az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name $GREEN_DEPLOYMENT_NAME --request-file sample.json
    

    Dica

    Observe como nós agora estamos indicando o nome da implantação que queremos invocar.

Atualizar progressivamente o tráfego

Quando estivermos confiantes com a nova implantação, poderemos atualizar o tráfego para rotear parte dele para a nova implantação. O tráfego é configurado no nível do ponto de extremidade:

  1. Configurar o tráfego:

    Esta etapa não é necessária na CLI do Azure

  2. Atualizar o ponto de extremidade

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=90 $GREEN_DEPLOYMENT_NAME=10"
    
  3. Se você decidir alternar o tráfego inteiro para a nova implantação, atualize todo o tráfego:

    Esta etapa não é necessária na CLI do Azure

  4. Atualizar o ponto de extremidade

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=0 $GREEN_DEPLOYMENT_NAME=100"
    
  5. Como a implantação antiga não recebe tráfego, você pode excluí-la com segurança:

    az ml online-deployment delete --endpoint-name $ENDPOINT_NAME --name default
    

    Dica

    Observe que, neste ponto, a antiga "implantação azul" foi excluída e a nova "implantação verde" tomou o lugar da "implantação azul".

Recursos de limpeza

az ml online-endpoint delete --name $ENDPOINT_NAME --yes

Importante

Observe que excluir um ponto de extremidade também exclui todas as implantações nele.

Próximas etapas