Distribuição progressiva de modelos do MLflow para pontos de extremidade online
Artigo
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.
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.
Instalar o SDK do Azure Machine Learning para Python
pip install azure-ai-ml azure-identity
Instale o pacote mlflow do 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 uma computação do Azure Machine Learning, configure o URI de acompanhamento do MLflow ou o URI de registro do MLflow para apontar para o workspace no qual você está trabalhando. Saiba como Configurar o MLflow para o Azure Machine Learning.
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>
O workspace é o recurso de nível superior para o Azure Machine Learning. Ele fornece um local centralizado para trabalhar com todos os artefatos que você cria ao usar o Azure Machine Learning. Nesta seção, nos conectaremos ao workspace 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 workspace e obtenha um identificador para o workspace:
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:
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.
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:
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 desse ponto de extremidade usando um arquivo de configuração. Configuramos o modo de autenticação do ponto de extremidade como “chave” no exemplo a seguir:
Esta funcionalidade não está disponível no SDK do MLflow. Acesse o Estúdio do Azure Machine Learning, procure o ponto de extremidade e recupere a chave secreta nele.
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”.
O código a seguir amostra 5 observações do conjunto de dados de treinamento, remove a coluna target (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 amostra 5 observações do conjunto de dados de treinamento, remove a coluna target (como o modelo irá prever) e cria uma solicitação.
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.
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 diferentes hardwares para diferentes modelos dependendo dos requisitos.
Gravar 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 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: