Neste tutorial, mostramos como disponibilizar um machine learning (ML) do PyTorch pré-treinado em um cluster do GKE usando o Framework TorchServe para exibição escalonável. O modelo de ML usado neste tutorial gera previsões com base nas solicitações dos usuários. É possível usar as informações deste tutorial para ajudar você a implantar e disponibilizar seus próprios modelos em escala no GKE.
Sobre o aplicativo do tutorial
Ele é um pequeno aplicativo da Web em Python criado com o framework do Fast Dash. Use o aplicativo para enviar solicitações de previsão ao modelo T5. Ele captura entradas de texto do usuário e pares de idiomas e envia as informações ao modelo. O modelo converte o texto e retorna o resultado para o aplicativo, que mostra o resultado para o usuário. Para saber mais sobre a Fast Dash, consulte a documentação da Fast Dash.
Como funciona
Neste tutorial, vamos implantar as cargas de trabalho em um cluster do GKE Autopilot. O GKE gerencia totalmente os nós do Autopilot, o que reduz a sobrecarga administrativa na configuração, no escalonamento e nos upgrades de nós. Quando você implanta a carga de trabalho e o aplicativo de ML no Autopilot, o GKE escolhe o tipo e o tamanho corretos de máquina para executar as cargas de trabalho. Saiba mais na Visão geral do Autopilot.
Depois de implantar o modelo, você recebe um URL de previsão que pode ser usado pelo aplicativo para enviar solicitações de previsão ao modelo. Esse método dissocia o modelo do aplicativo, permitindo que o modelo seja escalonado independentemente do aplicativo da Web.
Objetivos
- Preparar um modelo T5 pré-treinado do repositório Hugging Face para exibição empacotando-o como uma imagem de contêiner e enviando-o para o Artifact Registry
- Implantar o modelo em um cluster do Autopilot
- Implantar o aplicativo Fast Dash que se comunica com o modelo
- Faça o escalonamento automático do modelo com base nas métricas do Prometheus
Custos
Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.
Antes de começar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Kubernetes Engine, Cloud Storage, Artifact Registry, and Cloud Build APIs:
gcloud services enable container.googleapis.com
storage.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Kubernetes Engine, Cloud Storage, Artifact Registry, and Cloud Build APIs:
gcloud services enable container.googleapis.com
storage.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com
prepare o ambiente
Clone o repositório de exemplo e abra o diretório do tutorial:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
cd kubernetes-engine-samples/ai-ml/t5-model-serving
Crie o cluster
Execute este comando:
gcloud container clusters create-auto ml-cluster \
--release-channel=RELEASE_CHANNEL \
--cluster-version=CLUSTER_VERSION \
--location=us-central1
Substitua:
RELEASE_CHANNEL
: o canal de lançamento do cluster. Precisa serrapid
,regular
oustable
. Escolha um canal que tenha a versão 1.28.3-gke.1203000 ou posterior do GKE para usar GPUs L4. Para conferir as versões disponíveis em um canal específico, consulte Visualizar as versões padrão e disponíveis para canais de lançamento.CLUSTER_VERSION
: a versão do GKE a ser usada. Precisa ser1.28.3-gke.1203000
ou mais recente.
A operação leva alguns minutos para ser concluída.
Crie um repositório do Artifact Registry
Crie um novo repositório padrão do Artifact Registry com o formato Docker na mesma região do cluster:
gcloud artifacts repositories create models \ --repository-format=docker \ --location=us-central1 \ --description="Repo for T5 serving image"
Verifique o nome do repositório:
gcloud artifacts repositories describe models \ --location=us-central1
O resultado será assim:
Encryption: Google-managed key Repository Size: 0.000MB createTime: '2023-06-14T15:48:35.267196Z' description: Repo for T5 serving image format: DOCKER mode: STANDARD_REPOSITORY name: projects/PROJECT_ID/locations/us-central1/repositories/models updateTime: '2023-06-14T15:48:35.267196Z'
Empacotar o modelo
Nesta seção, você empacota o modelo e o framework de exibição em uma única imagem de contêiner usando o Cloud Build e envia a imagem resultante para o repositório do Artifact Registry.
Revise o Dockerfile para a imagem do contêiner:
Esse Dockerfile define o seguinte processo de compilação em várias etapas:
- Faça o download dos artefatos do modelo no repositório de rosto abraçado.
- Empacote o modelo usando a ferramenta Arquivo de exibição PyTorch. Isso cria um arquivo de modelo (.mar) que o servidor de inferência usa para carregar o modelo.
- Crie a imagem final com o PyTorch Serve.
Crie e envie a imagem usando o Cloud Build:
gcloud builds submit model/ \ --region=us-central1 \ --config=model/cloudbuild.yaml \ --substitutions=_LOCATION=us-central1,_MACHINE=gpu,_MODEL_NAME=t5-small,_MODEL_VERSION=1.0
O processo de implantação leva vários minutos para ser concluído. Se você usar um tamanho de modelo maior que
t5-small
, o processo de compilação poderá levar bastante mais tempo.Verifique se a imagem está no repositório:
gcloud artifacts docker images list us-central1-docker.pkg.dev/PROJECT_ID/models
Substitua o
PROJECT_ID
pelo ID do projeto do Google Cloud.O resultado será assim:
IMAGE DIGEST CREATE_TIME UPDATE_TIME us-central1-docker.pkg.dev/PROJECT_ID/models/t5-small sha256:0cd... 2023-06-14T12:06:38 2023-06-14T12:06:38
Implantar o modelo empacotado no GKE
Para implantar a imagem, modifique o manifesto do Kubernetes no repositório de exemplo para corresponder ao seu ambiente.
Revise o manifesto da carga de trabalho de inferência:
Substitua
PROJECT_ID
pelo ID do projeto do Google Cloud.sed -i "s/PROJECT_ID/PROJECT_ID/g" "kubernetes/serving-gpu.yaml"
Isso garante que o caminho da imagem do contêiner na especificação da implantação corresponda ao caminho para a imagem do modelo T5 no Artifact Registry.
Crie os recursos do Kubernetes:
kubectl create -f kubernetes/serving-gpu.yaml
Para verificar se o modelo foi implantado, faça o seguinte:
Confira o status da implantação e do serviço:
kubectl get -f kubernetes/serving-gpu.yaml
Aguarde até que a resposta mostre pods prontos, como no exemplo a seguir. Dependendo do tamanho da imagem, a primeira extração pode levar vários minutos.
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/t5-inference 1/1 1 0 66s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/t5-inference ClusterIP 10.48.131.86 <none> 8080/TCP,8081/TCP,8082/TCP 66s
Abra uma porta local para o serviço
t5-inference
:kubectl port-forward svc/t5-inference 8080
Abra uma nova janela do terminal e envie uma solicitação de teste para o serviço:
curl -v -X POST -H 'Content-Type: application/json' -d '{"text": "this is a test sentence", "from": "en", "to": "fr"}' "http://localhost:8080/predictions/t5-small/1.0"
Se a solicitação de teste falhar e a conexão do pod for encerrada, verifique os registros:
kubectl logs deployments/t5-inference
Se a saída for semelhante a esta, o TorchServe não conseguiu instalar algumas dependências de modelo:
org.pytorch.serve.archive.model.ModelException: Custom pip package installation failed for t5-small
Para resolver esse problema, reinicie a implantação:
kubectl rollout restart deployment t5-inference
Esse controlador cria um novo pod. Repita as etapas anteriores para abrir uma porta no novo pod.
Acesse o modelo implantado usando o aplicativo da Web
Crie e envie o aplicativo da Web da Fast Dash como uma imagem de contêiner no Artifact Registry:
gcloud builds submit client-app/ \ --region=us-central1 \ --config=client-app/cloudbuild.yaml
Abra
kubernetes/application.yaml
em um editor de texto e substituaPROJECT_ID
no campoimage:
pelo ID do projeto. Como alternativa, execute o seguinte comando:sed -i "s/PROJECT_ID/PROJECT_ID/g" "kubernetes/application.yaml"
Crie os recursos do Kubernetes:
kubectl create -f kubernetes/application.yaml
A implantação e o serviço podem levar algum tempo para serem totalmente provisionados.
Para verificar o status, execute o comando a seguir.
kubectl get -f kubernetes/application.yaml
Aguarde até que a saída mostre pods prontos, como no exemplo a seguir:
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/fastdash 1/1 1 0 1m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/fastdash NodePort 203.0.113.12 <none> 8050/TCP 1m
O aplicativo da Web agora está em execução, embora não esteja exposto em um endereço IP externo. Para acessar o aplicativo da Web, abra uma porta local:
kubectl port-forward service/fastdash 8050
Em um navegador, abra a interface da Web:
- Se você estiver usando um shell local, abra um navegador e acesse http://127.0.0.1:8050.
- Se você estiver usando o Cloud Shell, clique em Visualização na Web e, em seguida, em Alterar porta. Especifique a porta
8050
.
Para enviar uma solicitação ao modelo T5, especifique os valores nos campos TEXT, TEXT e TEXT na interface da Web. e clique em TEXT. Para ver uma lista de idiomas disponíveis, consulte a documentação T5.
Ativar o escalonamento automático do modelo
Nesta seção, mostramos como ativar o escalonamento automático para o modelo com base em métricas do Google Cloud Managed Service para Prometheus fazendo o seguinte:
- Instalar o adaptador de métricas personalizadas do Stackdriver
- Aplicar configurações de PodMonitoring e HorizontalPodAutoscaling
O Google Cloud Managed Service para Prometheus é ativado por padrão nos clusters do Autopilot que executam a versão 1.25 e mais recentes.
Instalar o adaptador de métricas personalizadas do Stackdriver
Esse adaptador permite que o cluster use métricas do Prometheus para tomar decisões de escalonamento automático do Kubernetes.
Implante o adaptador:
kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
Crie uma conta de serviço do IAM para o adaptador usar:
gcloud iam service-accounts create monitoring-viewer
Conceda à conta de serviço do IAM o papel
monitoring.viewer
no projeto e o papeliam.workloadIdentityUser
:gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer gcloud iam service-accounts add-iam-policy-binding monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]"
Substitua o
PROJECT_ID
pelo ID do projeto do Google Cloud.Anote a ServiceAccount do Kubernetes do adaptador para permitir que ele represente a conta de serviço do IAM:
kubectl annotate serviceaccount custom-metrics-stackdriver-adapter \ --namespace custom-metrics \ iam.gke.io/gcp-service-account=monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com
Reinicie a implantação do adaptador para propagar as alterações:
kubectl rollout restart deployment custom-metrics-stackdriver-adapter \ --namespace=custom-metrics
Aplicar configurações de PodMonitoring e HorizontalPodAutoscaling
O PodMonitoring é um recurso personalizado do Google Cloud Managed Service para Prometheus que permite a ingestão de métricas e a extração de destino em um namespace específico.
Implante o recurso do PodMonitoring no mesmo namespace que a Implantação do TorchServe:
kubectl apply -f kubernetes/pod-monitoring.yaml
Consulte o manifesto HorizontalPodAutoscaler:
O HorizontalPodAutoscaler escalona a quantidade de pods do modelo T5 com base na duração cumulativa da fila de solicitações. O escalonamento automático é baseado na métrica
ts_queue_latency_microseconds
, que mostra a duração cumulativa da fila em microssegundos.Crie o HorizontalPodAutoscaler:
kubectl apply -f kubernetes/hpa.yaml
Verificar o escalonamento automático usando um gerador de carga
Para testar a configuração de escalonamento automático, gere carga para o aplicativo de exibição. Neste tutorial, um gerador de carga do Locust é usado para enviar solicitações ao endpoint de previsão do modelo.
Crie o gerador de carga:
kubectl apply -f kubernetes/loadgenerator.yaml
Aguarde até que os pods do gerador de carga fiquem prontos.
Exponha a interface da Web do gerador de carga localmente:
kubectl port-forward svc/loadgenerator 8080
Se uma mensagem de erro for exibida, tente novamente quando o pod estiver em execução.
Em um navegador, abra a interface da Web do gerador de carga.
- Se você estiver usando um shell local, abra um navegador e acesse http://127.0.0.1:8080.
- Se você estiver usando o Cloud Shell, clique em Visualização na Web e, em seguida, em Alterar porta. Digite a porta
8080
.
Clique na guia Gráficos para observar o desempenho ao longo do tempo.
Abra uma nova janela do terminal e observe a contagem de réplicas dos seus escalonadores automáticos de pods horizontais:
kubectl get hpa -w
O número de réplicas aumenta conforme a carga aumenta. O escalonamento pode levar aproximadamente dez minutos. À medida que novas réplicas são iniciadas, o número de solicitações bem-sucedidas no gráfico do Locust aumenta.
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE t5-inference Deployment/t5-inference 71352001470m/7M 1 5 1 2m11s
Recomendações
- Crie o modelo com a mesma versão da imagem base do Docker que você usará para disponibilização.
- Se o modelo tiver dependências de pacote especiais ou se o tamanho das dependências for grande, crie uma versão personalizada da imagem base do Docker.
- Observe a versão em árvore dos pacotes de dependência do modelo. Verifique se as dependências de pacote são compatíveis com as versões umas das outras. Por exemplo, o Panda versão 2.0.3 oferece suporte ao NumPy versão 1.20.3 e posterior.
- Execute modelos com uso intensivo de GPU em nós de GPU e modelos com uso intensivo de CPU na CPU. Isso pode melhorar a estabilidade da disponibilização do modelo e garante o consumo eficiente dos recursos do nó.
Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.
Exclua o projeto
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Excluir recursos individuais
Exclua os recursos do Kubernetes:
kubectl delete -f kubernetes/loadgenerator.yaml kubectl delete -f kubernetes/hpa.yaml kubectl delete -f kubernetes/pod-monitoring.yaml kubectl delete -f kubernetes/application.yaml kubectl delete -f kubernetes/serving-gpu.yaml kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
Exclua o cluster do GKE:
gcloud container clusters delete "ml-cluster" \ --location="us-central1" --quiet
Exclua a conta de serviço do IAM e as vinculações de política do IAM:
gcloud projects remove-iam-policy-binding PROJECT_ID \ --member "serviceAccount:monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer gcloud iam service-accounts remove-iam-policy-binding monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]" gcloud iam service-accounts delete monitoring-viewer
Exclua as imagens no Artifact Registry. Se quiser, exclua todo o repositório. Para mais instruções, consulte a documentação do Artifact Registry sobre Como excluir imagens.
Visão geral do componente
Nesta seção, descrevemos os componentes usados neste tutorial, como o modelo, o aplicativo da Web, o framework e o cluster.
Sobre o modelo T5
Neste tutorial, usamos um modelo T5 multilíngue pré-treinado. T5 é um transformador de texto para texto que converte texto de um idioma para outro. Em T5, entradas e saídas são sempre strings de texto, ao contrário dos modelos BERT que só podem gerar um rótulo de classe ou um período da entrada. O modelo T5 também pode ser usado para tarefas como resumo, perguntas e respostas ou classificação de texto. O modelo é treinado com uma grande quantidade de texto do Colossal Clean Crawled Corpus (C4) e do Wiki-DPR.
Para mais informações, consulte a documentação do modelo T5.
Colin Raffel, Noam Shazeer, Adam Roberts, Katherine Lee, Sharan Narang, Michael Matena, Yanqi Zhou, Wei Li e Peter J. Liu apresentou o modelo T5 em Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer, publicado no Journal of Pesquisa de machine learning.
O modelo T5 é compatível com vários tamanhos de modelo, com diferentes níveis de complexidade
que se adaptam a casos de uso específicos. Neste tutorial, usamos o tamanho padrão, t5-small
, mas também é possível escolher um tamanho diferente. Os tamanhos T5 a seguir são distribuídos
de acordo com a licença Apache 2.0:
t5-small
: 60 milhões de parâmetros.t5-base
: 220 milhões de parâmetros.t5-large
: 770 milhões de parâmetros. 3 GB de download.t5-3b
: três bilhões de parâmetros. 11 GB de download.t5-11b
(em inglês): 11 bilhões de parâmetros. 45 GB de download.
Para outros modelos T5 disponíveis, consulte o repositório Hugging Face (em inglês).
Sobre o TorchServe
O TorchServe é uma ferramenta flexível para disponibilizar modelos PyTorch. Ele oferece suporte imediato para todos os principais frameworks de aprendizado profundo, incluindo PyTorch, TensorFlow e ONNX. O TorchServe pode ser usado para implantar modelos em produção ou para prototipagem e experimentação rápidas.
A seguir
- Exibir um LLM com várias GPUs.
- Confira arquiteturas de referência, diagramas, tutoriais e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.