Leia nosso artigo sobre

.

O MLflow é uma ferramenta comumente usada para rastreamento de experimentos de aprendizado de máquina, controle de versão de modelos e fornecimento. Em nosso primeiro artigo da série “Servindo modelos de ML em escala”, explicamos como implantar a instância de rastreamento no Kubernetes e usá-la para registrar experimentos e armazenar modelos.

Parte 1 - Como implantar a instância de rastreamento do Mlflow no Kubernetes?

Introdução

O Mlflow é uma ferramenta amplamente usada na comunidade científica/ML do data para rastrear experimentos e gerenciar modelos de aprendizado de máquina em diferentes estágios. Com ela, podemos armazenar métricas, modelos e artefatos para comparar facilmente o desempenho dos modelos e lidar com seus ciclos de vida. Além disso, o Mlflow fornece um módulo para servir modelos como um endpoint de API que facilita sua integração a qualquer produto ou aplicativo da Web.

Dito isso, usar o aprendizado de máquina em produtos on-line é legal, mas dependendo do tamanho do modelo, da natureza (ML, aprendizado profundo,...) e da carga (solicitações dos usuários), pode ser um desafio dimensionar os recursos necessários e garantir um tempo de resposta razoável. Portanto, usar uma infraestrutura dimensionável, como clusters Kubernetes, é fundamental para manter a disponibilidade e o desempenho do serviço na fase de inferência.

Nesse contexto, estamos publicando uma série de três artigos nos quais respondemos às seguintes perguntas:

  • Como implantar e usar a instância de rastreamento do Mlflow no Kubernetes?
  • Como servir modelos de aprendizado de máquina como API usando o Mlflow?
  • Como lidar com um grande número de solicitações e tornar nossa tarefa de inferência dimensionável para produtos industrializados?

Portanto, vamos começar este primeiro artigo apresentando o Kubernetes e seus componentes e analisar a implantação de uma instância de rastreamento para modelos de registro.

Visão geral do Kubernetes

O Kubernetes é um projeto de código aberto, lançado pelo Google em 2014. É um sistema de controle e orquestração de contêineres que permite a implantação, o dimensionamento e o agendamento automáticos de aplicativos. Ele tem a seguinte arquitetura:

Image

Mestre: Ele lida com as configurações de entrada, programa aplicativos em contêineres nos diferentes nós e monitora seus estados. O mestre é composto por:

  • Servidor de API: permite a interação com o cluster e valida os comandos enviados pelo desenvolvedor para atualizar o cluster ou o estado do aplicativo.
  • Agendador: decide em quais nós os novos objetos devem ser executados para garantir a estabilidade e o balanceamento de carga.
  • Etcd: um database de valor-chave que armazena as diferentes configurações e estados dos recursos
  • Gerente de controladoria:monitora o estado do cluster e os diferentes recursos e garante que o estado atual corresponda ao desejado.

Nós: Eles são os nós de execução nos quais vivem os contêineres implantados. Seus principais componentes são:

  • Pods: são a unidade de execução básica fundamental no Kubernetes. Um Pod encapsula um aplicativo como um único contêiner ou vários contêineres que trabalham juntos com volumes de armazenamento e redes compartilhados.
  • Kubelet:é e para inspecionar o status do contêiner e se comunicar com o mestre do Kubernetes.

É a opção ideal quando um aplicativo tem vários serviços que se comunicam entre si, pois garante que cada serviço tenha seu próprio ambiente em contêiner com um conjunto de regras para interagir com os outros. Além disso, ele oferece o recurso interessante de dimensionar um aplicativo sem se preocupar com o gerenciamento ou a sincronização de novos serviços e com o equilíbrio de recursos entre diferentes máquinas.

De uma perspectiva de alto nível, como cientistas data ou engenheiros de ML, interagiremos com o Kubernetes por meio de sua API de servidor usando comandos CLI ou arquivos de configuração YAML para implantar e expor aplicativos ou obter os estados de nossos recursos.

Pré-requisitos práticos

Para esta prática, usaremos o GCP como um provedor cloud. Primeiro, precisamos do :

1. Criar os elementos de infraestrutura

  • mlflow_gke: um bucket para armazenar arquivos, datasets...
  • mlflow-k8s: um cluster GKE de três nós (e2-highcpu-4) para implantar o módulo de rastreamento e o modelo de aprendizado de máquina.

  • teste de carga: um cluster GKE de três nós (e2-standard-2) para realizar testes de carga. Ele será usado no terceiro artigo desta série.

Image

2. Configurar a estação de trabalho local

  • Instalar os requisitos do python para interagir com o GCP e o mlflow cli

    pip install mlflow gcsfs google-cloud google-cloud-storage kubernetes
  • Ter gcloud e kubectl configurado com as credenciais para acessar o projeto GCP e os clusters
  • Ter o Helm CLI instalado e inicializado. Por favor Encontre aqui as instruções caso o senhor ainda não tenha o cliente.

3. Clone o repositório do projeto prático para obter o código

Implementação da instância do Mlflow Tracking

1. Configurar o ambiente do cluster

  • Criar uma conta de serviço para permitir a interação com o GCS
    Isso pode ser feito por meio do console do google cloud, na seção seção iam. Precisamos criar uma conta de serviço com permissão de administrador de objeto de armazenamento, gerar uma chave de autenticação e baixá-la como keyfile.json
  • Montar o arquivo de autenticação como um segredo
    Os segredos nos permitem lidar de forma segura com as credenciais, de modo que elas sejam visíveis apenas para os recursos relevantes. Para isso, criaremos um volume secreto e exporemos o arquivo de autenticação somente aos contêineres necessários.
    kubectl create secret generic gcsfs-creds -from-file=./keyfile.json
Image

2. Rastreamento da implantação do servidor

  • Armazenamento Postgres
    O Postgre serve como um elemento de armazenamento de back-end para o mlflow salvar modelos metadata e métricas.
    Para implantá-lo, usaremos o Helm: um gerenciador de recursos para Kubernetes em que muitos aplicativos estão disponíveis no formato de gráficos ou modelos que podem ser configurados com comandos simples.

    #docs: https://artifacthub.io/packages/helm/bitnami/postgresqlhelm repo add bitnami https://charts.bitnami.com/bitnamihelm install mlf-db bitnami/postgresql --set postgresqlDatabase=mlflow_db --set postgresqlPassword=mlflow --set service.type=NodePort
  • Instância de rastreamento
    Também usaremos os gráficos do Helm para implantar o servidor de rastreamento, mas, primeiro, precisamos criar uma imagem do docker com a versão que queremos para que ela possa ser baixada e implantada pelo Helm. Observe que, no caso do Postgres, a imagem já estava em um repositório público, mas aqui criaremos nossa própria imagem.

    cd mlflow-serving-exampledocker build --tag $/mlflow-tracking-server:v1 --file dockerfile_mlflow_tracking .docker push $/mlflow-tracking-server:v1

Depois que a imagem é enviada para o registro de imagens, podemos implantá-la no cluster por meio do helm usando os comandos abaixo.

helm repo add mlflow-tracking https://artefactory-global.github.io/mlflow-tracking-server/helm install mlf-ts mlflow-tracking/mlflow-tracking-server
--set env.mlflowArtifactPath=$
--set env.mlflowDBAddr=mlf-db-postgresql
--set env.mlflowUser=postgres
--set env.mlflowPass=mlflow
--set env.mlflowDBName=mlflow_db
--set env.mlflowDBPort=5432
--set service.type=LoadBalancer
--set image.repository=$/mlflow-tracking-server
--set image.tag=v1

Agora, o Mlflow deve estar funcionando e a interface do usuário deve estar acessível por meio do IP do balanceador de carga. Podemos verificar o IP atribuído usando kubectl get services.AAlém disso, podemos depurar a implantação acessando os registros via kubectl describe pods.
Até o momento, nossa arquitetura atual é parecida com a seguinte:

Image

Observe que os balanceadores de carga são acessíveis a qualquer pessoa na Internet, portanto, é essencial pensar em proteger nossa instância de rastreamento adicionando uma camada de autenticação. Isso pode ser feito com o proxy com reconhecimento de identidade no GCP, mas não será abordado neste artigo.

3. Criação de modelos básicos

Agora que nossa infraestrutura e a instância do MLflow estão prontas, podemos tentar executar um modelo simples de ML e salvá-lo no registro de modelos para uso posterior.
Usaremos o conjunto dataset de qualidade do vinho, que é composto por cerca de 4900 amostras e 11 recursos que refletem as características do vinho. O rótulo varia de 3 a 9 e pode ser visto como classificações.
Esse é um exemplo clássico, no qual treinamos um modelo de regressão Xgboost e o armazenamos junto com seus parâmetros e métricas. O código completo pode ser encontrado no seguinte notebook.
O senhor deve ter notado que a integração com o Mlflow é simples e pode ser resumida no trecho de código abaixo que invoca mlflow.start_run(), mlflow.log_param(), mlflow.log_metric() e mlflow.xgboost.log_model()para, respectivamente, criar um novo experimento, armazenar os parâmetros de treinamento, as métricas de avaliação e o próprio modelo treinado.

com mlflow.start_run() como run: # Iniciar sessão do mlflow mlflow.log_param("max_depth", max_depth) mlflow.log_param("min_child_weight", min_child_weight) mlflow.log_param("estimators", estimators) # Criar e ajustar o modelo model = xgb.XGBRegressor( max_depth=max_depth, min_child_weight=min_child_weight, n_estimators=estimators random_state=42) model.fit(X_train, y_train) Métricas de MLflow do # previsões = model.predict(X_test) rmse = np.sqrt(mean_squared_error(y_test, predictions)) mlflow.log_metric("rmse", rmse) # Modelo de registro mlflow.xgboost.log_model(model, "xgboost-model", registered_model_name = model_name)

Ao executar o notebook fornecido, uma nova linha será adicionada na interface da instância de rastreamento que corresponde ao novo experimento.

Image

Por fim, supondo que estejamos satisfeitos com o desempenho do modelo, podemos carregá-lo a partir da instância de rastreamento e usá-lo para inferência em python. Isso também pode ser feito com o notebook compartilhado anteriormente. Observe que, neste exemplo, carregamos o modelo usando o ID de execução, mas lembre-se de que o Mlflow também oferece outras maneiras interessantes de identificar modelos por tags, versões ou estágios. Para obter mais detalhes, consulte a documentação de registro do modelo aqui.

Conclusão

Ao longo deste artigo, conseguimos implantar a instância de rastreamento do Mlflow para lidar com nossos experimentos científicos data e passamos por um exemplo rápido que mostra como registrar um modelo e salvá-lo para inferência futura em python. No próximo artigo desta série, aprenderemos a servir esse modelo como uma API. Isso é muito importante, pois facilita a interação com o modelo e sua integração em um produto ou aplicativo. Além disso, fazer isso no Kubernetes garante que ele permaneça facilmente dimensionável e capaz de lidar com diferentes níveis de carga.

Média Blog por Artefact.

Este artigo foi publicado inicialmente no Medium.com.
Siga-nos em nosso Medium Blog !