Este tutorial mostra como implementar e publicar um grande modelo de linguagem (GML) usando GPUs no Google Kubernetes Engine (GKE) com o NVIDIA Triton Inference Server e o TensorFlow Serving. Isto fornece uma base para compreender e explorar a implementação prática de GMLs para inferência num ambiente Kubernetes gerido. Implementa um contentor pré-criado num cluster do GKE com uma única GPU L4 Tensor Core e prepara a infraestrutura do GKE para fazer inferência online.
Este tutorial destina-se a engenheiros de aprendizagem automática (ML), administradores e operadores de plataformas, e a especialistas de dados e IA que queiram alojar um modelo de aprendizagem automática (ML) pré-preparado num cluster do GKE. Para saber mais sobre as funções comuns e as tarefas de exemplo referidas no Google Cloud conteúdo, consulte o artigo Funções e tarefas comuns do utilizador do GKE.
Antes de ler esta página, certifique-se de que conhece o seguinte:
Objetivos
- Crie um cluster do GKE Autopilot ou Standard.
- Configure um contentor do Cloud Storage onde o modelo pré-preparado está localizado.
- Implemente a estrutura de inferência online que selecionar.
- Faça um pedido de teste ao serviço implementado.
Custos
Este tutorial usa os seguintes componentes faturáveis do Google Cloud:- GKE
- Cloud Storage
- Aceleradores de GPU L4
- Tráfego de saída
Use a calculadora de preços para gerar uma estimativa de custo com base na sua utilização projetada.
Quando terminar este tutorial, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.
Antes de começar
Configure o seu projeto
- 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.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
Roles required to create a project
To create a project, you need the Project Creator role (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. -
Verify that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. -
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
Roles required to create a project
To create a project, you need the Project Creator role (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. -
Verify that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. Na Google Cloud consola, inicie uma instância do Cloud Shell:
Abrir Cloud ShellTransfira o código-fonte desta app de exemplo:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/ai-ml/gke-online-serving-single-gpuDefina as variáveis de ambiente predefinidas:
gcloud config set project PROJECT_ID gcloud config set compute/region COMPUTE_REGIONSubstitua os seguintes valores:
- PROJECT_ID: o seu Google Cloud ID do projeto.
- COMPUTE_REGION: a região do Compute Engine que suporta o tipo de acelerador que quer usar,
por exemplo,
us-central1para a GPU L4.
No Cloud Shell, crie as seguintes variáveis de ambiente:
export PROJECT_ID=$(gcloud config get project) export REGION=$(gcloud config get compute/region) export K8S_SA_NAME=gpu-k8s-sa export GSBUCKET=$PROJECT_ID-gke-bucket export MODEL_NAME=mnist export CLUSTER_NAME=online-serving-clusterExecute o seguinte comando para criar um cluster padrão do GKE:
gcloud container clusters create ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --location=${REGION} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --addons GcsFuseCsiDriver \ --release-channel=rapid \ --num-nodes=1A criação do cluster pode demorar vários minutos.
Execute o seguinte comando para criar o node pool:
gcloud container node-pools create gpupool \ --accelerator type=nvidia-l4,count=1,gpu-driver-version=latest \ --project=${PROJECT_ID} \ --location=${REGION} \ --node-locations=${REGION}-a \ --cluster=${CLUSTER_NAME} \ --machine-type=g2-standard-8 \ --num-nodes=1O GKE cria um único node pool que contém uma GPU L4 para cada nó.
- Crie uma Google Cloud conta de serviço.
- Crie uma conta de serviço do Kubernetes no seu cluster.
- Associe a conta de serviço do Kubernetes à Google Cloud conta de serviço.
Na Google Cloud consola, aceda à página Criar conta de serviço:
No campo ID da conta de serviço, introduza
gke-ai-sa.Clique em Criar e continuar.
Na lista Função, selecione a função Cloud Storage > Serviço de recolha de estatísticas de armazenamento.
Clique em Adicionar outra função.
Na lista Selecionar uma função, selecione a função Cloud Storage > Administrador de objetos de armazenamento.
Clique em Continuar e, de seguida, em Concluído.
Crie um namespace do Kubernetes:
kubectl create namespace gke-ai-namespaceCrie uma ServiceAccount do Kubernetes no espaço de nomes:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespaceAdicione uma associação do IAM à Google Cloud conta de serviço:
gcloud iam service-accounts add-iam-policy-binding gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-ai-namespace/gpu-k8s-sa]"A flag
--memberfornece a identidade completa da ServiceAccount do Kubernetes em Google Cloud.Anotar a ServiceAccount do Kubernetes:
kubectl annotate serviceaccount gpu-k8s-sa \ --namespace gke-ai-namespace \ iam.gke.io/gcp-service-account=gke-ai-sa@PROJECT_ID.iam.gserviceaccount.comNo Cloud Shell, copie o modelo de ML pré-formado para o contentor do Cloud Storage:
gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursiveImplemente a estrutura com uma implementação. Uma implementação é um objeto da API Kubernetes que lhe permite executar várias réplicas de pods distribuídos entre os nós num cluster:
envsubst < src/gke-config/deployment-triton.yaml | kubectl --namespace=gke-ai-namespace apply -f -Valide se o GKE implementou a framework:
kubectl get deployments --namespace=gke-ai-namespaceQuando a estrutura estiver pronta, o resultado é semelhante ao seguinte:
NAME READY UP-TO-DATE AVAILABLE AGE triton-deployment 1/1 1 1 5m29sImplemente os serviços para aceder à implementação:
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yamlVerifique se o IP externo está atribuído:
kubectl get services --namespace=gke-ai-namespaceO resultado é semelhante ao seguinte:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 60m triton-server LoadBalancer 34.118.227.176 35.239.54.228 8000:30866/TCP,8001:31035/TCP,8002:30516/TCP 5m14sTome nota do endereço IP do
triton-serverna coluna EXTERNAL-IP.Verifique se o serviço e a implementação estão a funcionar corretamente:
curl -v EXTERNAL_IP:8000/v2/health/readyO resultado é semelhante ao seguinte:
... < HTTP/1.1 200 OK < Content-Length: 0 < Content-Type: text/plain ...No Cloud Shell, copie o modelo de ML pré-formado para o contentor do Cloud Storage:
gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursiveImplemente a estrutura com uma implementação. Uma implementação é um objeto da API Kubernetes que lhe permite executar várias réplicas de pods distribuídos entre os nós num cluster:
envsubst < src/gke-config/deployment-tfserve.yaml | kubectl --namespace=gke-ai-namespace apply -f -Valide se o GKE implementou a framework:
kubectl get deployments --namespace=gke-ai-namespaceQuando a estrutura estiver pronta, o resultado é semelhante ao seguinte:
NAME READY UP-TO-DATE AVAILABLE AGE tfserve-deployment 1/1 1 1 5m29sImplemente os serviços para aceder à implementação:
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yamlVerifique se o IP externo está atribuído:
kubectl get services --namespace=gke-ai-namespaceO resultado é semelhante ao seguinte:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 60m tfserve-server LoadBalancer 34.118.227.176 35.239.54.228 8500:30003/TCP,8000:32194/TCP 5m14sTome nota do endereço IP do
tfserve-serverna coluna EXTERNAL-IP.Verifique se o serviço e a implementação estão a funcionar corretamente:
curl -v EXTERNAL_IP:8000/v1/models/mnistSubstitua
EXTERNAL_IPpelo seu endereço IP externo.O resultado é semelhante ao seguinte:
... < HTTP/1.1 200 OK < Content-Type: application/json < Date: Thu, 12 Oct 2023 19:01:19 GMT < Content-Length: 154 < { "model_version_status": [ { "version": "1", "state": "AVAILABLE", "status": { "error_code": "OK", "error_message": "" } } ] }Crie um ambiente virtual Python no Cloud Shell.
python -m venv ./mnist_client source ./mnist_client/bin/activateInstale os pacotes Python necessários.
pip install -r src/client/triton-requirements.txtTeste o servidor de inferência do Triton carregando uma imagem:
cd src/client python triton_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.pngSubstitua o seguinte:
EXTERNAL_IP: o seu endereço IP externo.TEST_IMAGE: o nome do ficheiro que corresponde à imagem que quer testar. Pode usar as imagens armazenadas nosrc/client/images.
Consoante a imagem que usar, o resultado é semelhante ao seguinte:
Calling Triton HTTP Service -> Prediction result: 7Crie um ambiente virtual Python no Cloud Shell.
python -m venv ./mnist_client source ./mnist_client/bin/activateInstale os pacotes Python necessários.
pip install -r src/client/tfserve-requirements.txtTeste o TensorFlow Serving com algumas imagens.
cd src/client python tfserve_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.pngEXTERNAL_IP: o seu endereço IP externo.TEST_IMAGE: um valor de0a9. Pode usar as imagens armazenadas nosrc/client/images.- Manter o cluster do GKE: elimine os recursos do Kubernetes no cluster e os Google Cloud recursos
- Manter o Google Cloud projeto: elimine o cluster do GKE e os Google Cloud recursos
- Elimine o projeto
- Elimine o espaço de nomes do Kubernetes e as cargas de trabalho que implementou:
Elimine o contentor do Cloud Storage:
Aceda à página Recipientes:
Selecione a caixa de verificação de
PROJECT_ID-gke-bucket.Clique em Eliminar.
Para confirmar a eliminação, escreva
DELETEe clique em Eliminar.
Elimine a Google Cloud conta de serviço:
Aceda à página Contas de serviço:
Selecione o seu projeto.
Selecione a caixa de verificação de
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.Clique em Eliminar.
Para confirmar a eliminação, clique em Eliminar.
Elimine o cluster do GKE:
Aceda à página Clusters:
Selecione a caixa de verificação
online-serving-cluster.Clique em Eliminar.
Para confirmar a eliminação, escreva
online-serving-clustere clique em Eliminar.
Elimine o contentor do Cloud Storage:
Aceda à página Recipientes:
Selecione a caixa de verificação de
PROJECT_ID-gke-bucket.Clique em Eliminar.
Para confirmar a eliminação, escreva
DELETEe clique em Eliminar.
Elimine a Google Cloud conta de serviço:
Aceda à página Contas de serviço:
Selecione o seu projeto.
Selecione a caixa de verificação de
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.Clique em Eliminar.
Para confirmar a eliminação, clique em Eliminar.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Defina predefinições para a CLI Google Cloud
Crie um cluster do GKE
Pode publicar modelos numa única GPU num cluster do GKE Autopilot ou Standard. Recomendamos que use um cluster do Autopilot para uma experiência do Kubernetes totalmente gerida. Com o GKE Autopilot, os recursos são dimensionados automaticamente com base nos pedidos de modelos.
Para escolher o modo de funcionamento do GKE mais adequado às suas cargas de trabalho, consulte o artigo Escolha um modo de funcionamento do GKE.
Piloto automático
Execute o seguinte comando para criar um cluster do GKE Autopilot:
gcloud container clusters create-auto ${CLUSTER_NAME} \
--location=${REGION} \
--project=${PROJECT_ID} \
--release-channel=rapid
O GKE cria um cluster do Autopilot com nós de CPU e GPU, conforme solicitado pelas cargas de trabalho implementadas.
Standard
Crie um contentor do Cloud Storage
Crie um contentor do Cloud Storage para armazenar o modelo pré-preparado que vai ser publicado.
No Cloud Shell, execute o seguinte:
gcloud storage buckets create gs://$GSBUCKET
Configure o cluster para aceder ao contentor através da Workload Identity Federation para o GKE
Para permitir que o cluster aceda ao contentor do Cloud Storage, faça o seguinte:
Crie uma Google Cloud conta de serviço
Crie uma ServiceAccount do Kubernetes no seu cluster
No Cloud Shell, faça o seguinte:
Associe a conta de serviço do Kubernetes à Google Cloud conta de serviço
No Cloud Shell, execute os seguintes comandos:
Implemente o servidor de inferência online
Cada framework de inferência online espera encontrar o modelo de ML pré-preparado num formato específico. A secção seguinte mostra como implementar o servidor de inferência consoante a framework que quer usar:
Triton
TF Serving
Publique o modelo
Triton
TF Serving
Substitua o seguinte:
Consoante a imagem que usar, recebe um resultado semelhante a este:
Calling TensorFlow Serve HTTP Service -> Prediction result: 5
Observe o desempenho do modelo
Triton
Para observar o desempenho do modelo, pode usar a integração do painel de controlo do Triton no Cloud Monitoring. Com este painel de controlo, pode ver métricas de desempenho críticas, como o débito de tokens, a latência de pedidos e as taxas de erro.
Para usar o painel de controlo do Triton, tem de ativar o Google Cloud Managed Service for Prometheus, que recolhe as métricas do Triton, no seu cluster do GKE. Por predefinição, o Triton expõe métricas no formato Prometheus; não precisa de instalar um exportador adicional.
Em seguida, pode ver as métricas através do painel de controlo do Triton. Para obter informações sobre a utilização do serviço gerido do Google Cloud para Prometheus para recolher métricas do seu modelo, consulte as orientações de observabilidade do Triton na documentação do Cloud Monitoring.TF Serving
Para observar o desempenho do modelo, pode usar a integração do painel de controlo do TF Serving no Cloud Monitoring. Com este painel de controlo, pode ver métricas de desempenho críticas, como o débito de tokens, a latência de pedidos e as taxas de erro.
Para usar o painel de controlo do TF Serving, tem de ativar o serviço gerido do Google Cloud para Prometheus, que recolhe as métricas do TF Serving, no seu cluster do GKE.
Em seguida, pode ver as métricas através do painel de controlo do TF Serving. Para obter informações sobre como usar o Google Cloud Managed Service for Prometheus para recolher métricas do seu modelo, consulte as orientações de observabilidade do TF Serving na documentação do Cloud Monitoring.Limpar
Para evitar incorrer em custos na sua Google Cloud conta pelos recursos que criou neste guia, faça uma das seguintes ações:
Elimine os recursos do Kubernetes no cluster e os Google Cloud recursos
Triton
kubectl -n gke-ai-namespace delete -f src/gke-config/service-triton.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-triton.yaml
kubectl delete namespace gke-ai-namespace
TF Serving
kubectl -n gke-ai-namespace delete -f src/gke-config/service-tfserve.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-tfserve.yaml
kubectl delete namespace gke-ai-namespace