MLflow na nuvem
Neste artigo, vou falar sobre como hospedar mlflow na nuvem (AWS e GCP), executar experimentos de aprendizado de máquina, registrar parâmetros, métricas e armazenar o modelo no registro do modelo
O que é mlflow?
O mlflow é uma plataforma de código aberto que gerencia o ciclo de vida de aprendizado de máquina de ponta a ponta. Suas principais funcionalidades são:
- Rastreamento de experimentos: mantém todos os experimentos de aprendizado de máquina e a capacidade de consultá-los
- Reprodutibilidade: empacota código de aprendizado de máquina e é capaz de reproduzir esses resultados em qualquer plataforma
- Implantação: capacidade de implantar os modelos de ML em vários ambientes (por exemplo: AWS Sagemaker, GCP Cloud run, etc.)
- Registro de modelo: mantendo várias versões do modelo em um repositório centralizado
Podemos executar o mlflow em máquinas locais, mas hospedá-lo na nuvem tem suas vantagens
- Podemos aproveitar o armazenamento em nuvem, o poder de computação, a segurança etc.
- Visão centralizada de todos os experimentos de cada membro da equipe
Temos os seguintes 3 componentes principais no mlflow:
- Dashboard: É uma interface de usuário onde podemos ver a lista de experimentos, parâmetros do modelo, métricas .. etc para cada experimento
- Meta Store: Ele usa um banco de dados de back-end (MySql) para armazenar todos os experimentos, parâmetros, métricas etc.
- Artifactory Store: Ele usa isso para arquivos grandes, como modelo serializado. Em geral, usamos sistemas de arquivos distribuídos como Amazon S3 ou GCP Cloud Storage.
- Docker
- banco de dados MySql
- Sistema de Arquivo Distribuído
O diagrama de arquitetura acima mostra quais são todos os serviços da AWS necessários e como eles interagem para hospedar o mlflow na AWS. Vamos iniciar o mlflow usando o AWS Fargate, que é sem servidor.
Primeiro, precisamos criar um arquivo docker, que empacota o mlflow e suas dependências. Definimos as seguintes dependências em requirements.txt
O arquivo docker para instalação do mlflow e execução do servidor
O arquivo docker tem balde e outros detalhes de conexão de banco de dados como variáveis, esses valores serão configurados como variáveis de ambiente na definição de tarefa Fargate
Assim que tivermos o dockerfile, execute o comando abaixo para criar a imagem do docker
docker build -t mlflowtracker .
Agora, precisamos enviar a imagem do docker que criamos localmente para o registro de contêiner na AWS.
# Login
aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
# Tag local docker image
docker tag <image_name> aws_account_id.dkr.ecr.region.amazonaws.com/repository_name:tag
# Push image
docker push aws_account_id.dkr.ecr.region.amazonaws.com/repository_name:tag
Em seguida, precisamos do MySql para que o mlflow armazene metainformações, para as quais criaremos uma instância do AWS RDS MySql
Para obter as etapas para criar MySql no AWS RDS, clique aqui
Precisamos criar um balde S3 para mlflow para armazenar artefatos de modelo. Vá para o console aws, procure por s3, forneça o nome do bucket e certifique-se de bloquear todo o acesso público e clique em 'Create Bucket”
Em seguida, precisamos criar o cluster AWS ECS selecionando fargate como compute. Vá para o console aws e procure por elastic container service e clique em 'Create Cluster'. Na página criar cluster, forneça o nome do cluster, selecione vpc e sub-rede. Por padrão, a opção fargate seria selecionada.
No ECS, uma tarefa é uma entidade de nível granular que executa a imagem do docker, semelhante a um pod no kubernetes. Portanto, precisamos criar uma definição de tarefa que usará a imagem do docker que carregamos no ECR. Aqui definimos os valores das variáveis de ambiente. Para criar uma definição de tarefa, acesse Amazon Elastic Container Service > Definições de tarefa > Criar nova definição de tarefa e forneça o nome da tarefa, uri da imagem que carregamos no ECR, porta do contêiner e as variáveis de ambiente
Durante a criação da definição da tarefa, selecione a função ecsTaskExecution que é criada automaticamente pela AWS, certifique-se de adicionar a política de acesso s3 para que ela possa ler e gravar no bucket s3
Depois de criar a definição de tarefa, precisamos criar um serviço que use a definição de tarefa criada acima. Ao criar o serviço, podemos selecionar o número mínimo e máximo de tarefas de que precisamos (selecionei apenas 1 tarefa), para que ele possa ser dimensionado automaticamente. Temos a opção de criar um balanceador de carga durante esta etapa.
Para criar o serviço ECS, vá para Amazon Elastic Container Service >clusters >cluster_name> Crie e forneça o nome do serviço, selecione a definição da tarefa e sua revisão que criamos anteriormente, insira o número mínimo e máximo de tarefas, selecione vpc na seção de rede, selecione o aplicativo balanceador de carga na seção do balanceador de carga e forneça o nome, porta do ouvinte, nome do grupo de destino
Depois de criar o serviço, ele aumenta o número necessário de tarefas, podemos usar o URL do balanceador de carga para iniciar o painel mlflow.
Observação: o balanceador de carga usa um grupo de segurança que define as regras de rede de entrada e saída, você precisa modificar/adicionar regras para poder acessar a interface do usuário do mlflow.
Agora que hospedamos o mlflow na AWS, vamos executar um experimento de aprendizado de máquina em nosso local, apontando para o mlflow na nuvem
Depois de executar o experimento, podemos ver todos os parâmetros, métricas e modelo no mlflow que registramos durante o experimento
MLflow no GCP
O diagrama de arquitetura acima mostra os serviços do GCP necessários e como eles interagem para hospedar o mlflow no GCP. Vamos lançar o mlflow usando o GCP Cloudrun, que não tem servidor.
Podemos usar o mesmo Dockerfile e requirements.txt (consulte a seção MLflow na AWS), exceto que precisamos alterar boto3 para google-cloud-storage
As variáveis dentro do Dockerfile para artefatos padrão, os detalhes da conexão do banco de dados serão configurados como variáveis de ambiente no google cloudrun
Execute os seguintes comandos para criar, marcar e enviar a imagem do docker para o Google Container Registry (GCR)
# Build docker image
docker build -t mlflowtracker-gcp .
# Install docker credential helper using gcloud
gcloud components install docker-credential-gcr docker-credential-gcr configure-docker
# Tag docker image
docker tag <local_image_name> gcr.io/gcp_project_id/mlflowtracker-gcp:latest
# Push docker image
docker push gcr.io/gcp_project_id/mlflowtracker-gcp:latest
Criamos a instância de banco de dados, agora precisamos criar um banco de dados e um usuário para que o mlflow possa usar esses detalhes para se conectar ao banco de dados. Na página SQL, clique em Bancos de dados e clique em Criar banco de dados para fornecer o nome do banco de dados. Da mesma forma, clique no link de usuários e forneça o nome de usuário e a senha
Precisamos criar um depósito de armazenamento em nuvem para mlflow para armazenar artefatos de modelo. Para criar um bucket de armazenamento em nuvem, procure armazenamento em nuvem no console do GCP, clique no botão 'Criar', forneça o nome do bucket, a região e clique em criar
Vamos criar um serviço cloudrun no gcp que usará a imagem do docker que carregamos no registro de contêiner. Para criar uma instância de execução na nuvem, vá para a página de execução na nuvem, clique em criar serviço, selecione a imagem do contêiner que carregamos no GCR, forneça a porta do contêiner, valores de CPU e memória, instâncias mínimas e máximas para escalonamento automático e variáveis de ambiente.
Observação: certifique-se de que a conta de serviço que você escolheu no cloudrun tenha acesso ao armazenamento em nuvem, caso contrário, o carregamento do artefato do modelo falharia
Agora que hospedamos o mlflow no GCP, vamos executar um experimento de aprendizado de máquina em nosso local, apontando para o mlflow na nuvem
Depois de executar o experimento, podemos ver todos os parâmetros, métricas e modelo no mlflow que registramos durante o experimento
Nota: Criamos todos os recursos de nuvem manualmente usando o console, usando infraestrutura como código (Terraform ou CloudFormation) é uma boa prática
Espero que você tenha um bom entendimento sobre como podemos hospedar o mlflow nas plataformas de nuvem AWS e GCP e executar experimentos de aprendizado de máquina na nuvem
Feliz aprendizado!!