Partilhar via


Implementação progressiva de modelos MLflow para endpoints online

Neste artigo, você aprenderá como atualizar e implantar progressivamente modelos MLflow em endpoints online sem causar interrupção do serviço. Você usa 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 na produção. Essa estratégia permitirá que você implemente sua nova versão do serviço Web para um pequeno subconjunto de usuários ou solicitações antes de implementá-la completamente.

Sobre este exemplo

Os endpoints online têm o conceito de Endpoint e Deployment. Um ponto de extremidade representa a API que os clientes usam para consumir o modelo, enquanto a implantação indica a implementação específica dessa API. Essa distinção permite que os usuários desvinculem 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 interrupção do serviço.

O modelo que vamos implantar é baseado no UCI Heart Disease Data set. 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ça cardíaca em um paciente. É inteiro valorizado de 0 (sem presença) a 1 (presença). Ele foi treinado usando um XGBBoost classificador e todo o pré-processamento necessário foi empacotado como um scikit-learn pipeline, tornando este modelo um pipeline de ponta a ponta que vai de dados brutos a previsões.

As informações neste artigo são baseadas em exemplos de código contidos no repositório azureml-examples . Para executar os comandos localmente sem ter que copiar/colar arquivos, clone o repositório e, em seguida, altere os diretórios para sdk/using-mlflow/deploy.

Acompanhe em Jupyter Notebooks

Pode acompanhar este exemplo nos seguintes blocos de notas. No repositório clonado, abra o bloco de anotações: mlflow_sdk_online_endpoints_progresive.ipynb.

Pré-requisitos

Antes de seguir as etapas neste artigo, verifique se você tem os seguintes pré-requisitos:

  • Uma subscrição do Azure. Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar. Experimente a versão gratuita ou paga do Azure Machine Learning.
  • Os controlos de acesso baseado em funções (RBAC do Azure) são utilizados para conceder acesso às 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 espaço de trabalho do Azure Machine Learning ou uma função personalizada que permita Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*. Para obter mais informações, consulte Gerenciar o acesso a um espaço de trabalho do Azure Machine Learning.

Além disso, você precisará:

Ligar à sua área de trabalho

Primeiro, vamos nos conectar ao espaço de trabalho do Azure Machine Learning no qual vamos trabalhar.

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

Registar o modelo no registo

Certifique-se de que o seu modelo está registado no registo do Azure Machine Learning. A implantação de modelos não registrados não é suportada no Azure Machine Learning. Você pode registrar um novo modelo usando o SDK MLflow:

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

Criar um ponto de extremidade online

Pontos de extremidade online são pontos de extremidade que são usados para inferência online (em tempo real). Os pontos finais online incluem implementações prontas para receber dados dos clientes e podem enviar respostas em tempo real.

Vamos explorar essa funcionalidade implantando várias versões do mesmo modelo sob o mesmo ponto de extremidade. No entanto, a nova implantação receberá 0% do tráfego na mendicidade. Assim que tivermos certeza de que o novo modelo funcionará corretamente, vamos mover 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 garantir a criação de um que não existe:

    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. Crie o ponto de extremidade:

    az ml online-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
    
  4. Obter 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 final 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 implementaçã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 seu ponto de extremidade não tiver conectividade de saída, use o empacotamento do modelo (visualização) incluindo o sinalizador --with-package:

    az ml online-deployment create --with-package --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --all-traffic
    

    Gorjeta

    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 de seu tráfego é atribuído a ele. Vamos atribuí-lo.

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

  4. Atualize a configuração do ponto final:

    Esta etapa não é necessária na CLI do Azure, pois usamos o durante a --all-traffic 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. Testar a implementação

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

Criar uma implantação verde sob o ponto de extremidade

Vamos imaginar que existe uma nova versão do modelo criado pela equipe de desenvolvimento e ele está pronto para estar em produção. Podemos primeiro tentar voar este modelo e, uma vez que estejamos confiantes, podemos atualizar o endpoint para rotear o tráfego para ele.

  1. Registar 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 da 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
    

    Vamos nomear 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 seu ponto de extremidade não tiver conectividade de saída, use o empacotamento do modelo (visualização) 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. Teste 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
    

    Gorjeta

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

Atualizar progressivamente o tráfego

Estamos confiantes de que com a nova implantação, podemos atualizar o tráfego para rotear parte dele para a nova implantação. O tráfego é configurado no nível do ponto final:

  1. Configure 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 todo o tráfego 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
    

    Gorjeta

    Observe que, neste momento, a antiga "implantação azul" foi excluída e a nova "implantação verde" substituiu a "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 sob ele.

Próximos passos