Implementação progressiva de modelos MLflow para endpoints online
Artigo
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.
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.
Instalar o SDK do Azure Machine Learning para Python
pip install azure-ai-ml azure-identity
Instale o pacote mlflow SDK do Mlflow e o plug-in do Azure Machine Learning para MLflow azureml-mlflow.
pip install mlflow azureml-mlflow
Se você não estiver executando na computação do Aprendizado de Máquina do Azure, configure o URI de rastreamento MLflow ou o URI do registro do MLflow para apontar para o espaço de trabalho no qual você está trabalhando. Saiba como configurar o MLflow para o Azure Machine Learning.
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>
A área de trabalho é o recurso de nível superior do Azure Machine Learning que proporciona um local centralizado para trabalhar com todos os artefactos que cria quando utiliza o Azure Machine Learning. Nesta seção, nos conectaremos ao espaço de trabalho no qual você executará tarefas de implantação.
Importe as bibliotecas necessárias:
from azure.ai.ml import MLClient, Input
from azure.ai.ml.entities import ManagedOnlineEndpoint, ManagedOnlineDeployment, Model
from azure.ai.ml.constants import AssetTypes
from azure.identity import DefaultAzureCredential
Configure os detalhes do espaço de trabalho e obtenha um identificador para o espaço de trabalho:
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:
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.
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:
import random
import string
# Creating a unique endpoint name by including a random suffix
allowed_chars = string.ascii_lowercase + string.digits
endpoint_suffix = "".join(random.choice(allowed_chars) for x in range(5))
endpoint_name = "heart-classifier-" + endpoint_suffix
print(f"Endpoint name: {endpoint_name}")
import random
import string
# Creating a unique endpoint name by including a random suffix
allowed_chars = string.ascii_lowercase + string.digits
endpoint_suffix = "".join(random.choice(allowed_chars) for x in range(5))
endpoint_name = "heart-classifier-" + endpoint_suffix
print(f"Endpoint name: {endpoint_name}")
endpoint = ManagedOnlineEndpoint(
name=endpoint_name,
description="An endpoint to serve predictions of the UCI heart disease problem",
auth_mode="key",
)
Podemos configurar as propriedades deste ponto de extremidade usando um arquivo de configuração. Configuramos o modo de autenticação do ponto de extremidade para ser "chave" no exemplo a seguir:
Essa funcionalidade não está disponível no SDK do MLflow. Vá para o estúdio do Azure Machine Learning, navegue até o ponto de extremidade e recupere a chave secreta de lá.
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".
O código a seguir exemplifica 5 observações do conjunto de dados de treinamento, remove a target coluna (como o modelo irá prever) e cria uma solicitação no arquivo sample.json que pode ser usada com a implantação do modelo.
samples = (
pd.read_csv("data/heart.csv")
.sample(n=5)
.drop(columns=["target"])
.reset_index(drop=True)
)
with open("sample.json", "w") as f:
f.write(
json.dumps(
{"input_data": json.loads(samples.to_json(orient="split", index=False))}
)
)
O código a seguir exemplifica 5 observações do conjunto de dados de treinamento, remove a target coluna (como o modelo irá prever) e cria uma solicitação.
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.
Estamos usando a mesma confirmação de hardware indicada no deployment-config-file. No entanto, não há requisitos para ter a mesma configuração. Você pode configurar hardware diferente para modelos diferentes, dependendo dos requisitos.
Escreva a configuração em um arquivo:
deployment_config_path = "deployment_config.json"
with open(deployment_config_path, "w") as outfile:
outfile.write(json.dumps(deploy_config))
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: