Neste tutorial, mostramos como implantar e disponibilizar um modelo de machine learning (ML) escalonável em um cluster do Google Kubernetes Engine (GKE) usando o framework do TorchServe. Você veicula um modelo PyTorch pré-treinado que gera previsões com base nas solicitações do usuário. Depois de implantar o modelo, você recebe um URL de previsão que o aplicativo usa para enviar solicitações de previsão. Esse método permite que você dimensione o modelo e o aplicativo da Web de forma independente. Quando você implanta a carga de trabalho e o aplicativo de ML no Autopilot, o GKE escolhe o tipo e o tamanho de máquina mais eficientes para executar as cargas de trabalho.
Este tutorial é destinado a engenheiros de machine learning (ML), administradores e operadores de plataforma e especialistas em dados e IA que têm interesse em usar o Autopilot do GKE para reduzir a sobrecarga administrativa de configuração de nós, dimensionamento e upgrades. Para saber mais sobre papéis comuns e exemplos de tarefas referenciados no conteúdo do Google Cloud , consulte Tarefas e funções de usuário comuns do GKE Enterprise.
Antes de ler esta página, confira o modo Autopilot do 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.
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.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
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.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
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
PROJECT_ID
pelo ID do projeto 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, este tutorial usa implantações do Kubernetes. Uma implantação é um objeto da API do Kubernetes que permite executar várias réplicas de pods distribuídos entre os nós de um cluster.
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 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
Para acessar o modelo implantado com o aplicativo da Web do Fast Dash, siga estas etapas:
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, FROM Lang e TO melhor na interface da Web. e clique em Enviar. 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
PROJECT_ID
pelo ID do projeto 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ó.
Observar o desempenho do modelo
Para observar a performance do modelo, use a integração do painel do TorchServe no Cloud Monitoring. Com esse painel, você pode conferir métricas de desempenho críticas, como taxa de transferência de token, latência de solicitação e taxas de erro.
Para usar o painel do TorchServe, ative o Google Cloud Managed Service para Prometheus, que coleta as métricas do TorchServe, no cluster do GKE. O TorchServe expõe métricas no formato do Prometheus por padrão. Não é necessário instalar um exportador adicional.
Depois, é possível conferir as métricas usando o painel do TorchServe. Para informações sobre como usar o Google Cloud Managed Service para Prometheus para coletar métricas do seu modelo, consulte as orientações de observabilidade do TorchServe na documentação do Cloud Monitoring.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.
Excluir 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.