Treinar um modelo com GPUs no modo padrão do GKE
Neste guia de início rápido, mostramos como implantar um modelo de treinamento com GPUs no Google Kubernetes Engine (GKE) e armazenar as previsões no Cloud Storage. Neste tutorial, usamos um modelo do TensorFlow e clusters do GKE Standard. Também é possível executar essas cargas de trabalho em clusters do Autopilot com menos etapas de configuração. Para instruções, consulte Treinar um modelo com GPUs no modo Autopilot do GKE.
Este documento é destinado a administradores do GKE que já têm clusters Standard e querem executar cargas de trabalho de GPU pela primeira vez.
Antes de começar
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
Verify that billing is enabled for your Google Cloud project.
Enable the Kubernetes Engine and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM
role (roles/serviceusage.serviceUsageAdmin
), which
contains the serviceusage.services.enable
permission. Learn how to grant
roles.
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
Verify that billing is enabled for your Google Cloud project.
Enable the Kubernetes Engine and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM
role (roles/serviceusage.serviceUsageAdmin
), which
contains the serviceusage.services.enable
permission. Learn how to grant
roles.
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
clone o repositório de exemplo
No Cloud Shell, execute este comando:
git clone https://github.com/GoogleCloudPlatform/ai-on-gke/ ai-on-gke
cd ai-on-gke/tutorials-and-examples/gpu-examples/training-single-gpu
Criar um cluster no modo padrão e um pool de nós de GPU
Use o Cloud Shell para fazer o seguinte:
Crie um cluster padrão que use a federação de identidade da carga de trabalho para o GKE e instale o driver do Cloud Storage FUSE:
gcloud container clusters create gke-gpu-cluster \ --addons GcsFuseCsiDriver \ --location=us-central1 \ --num-nodes=1 \ --workload-pool=PROJECT_ID.svc.id.goog
Substitua
PROJECT_ID
pelo ID do projeto do Google Cloud.A criação do cluster pode levar vários minutos.
Crie um pool de nós de GPU:
gcloud container node-pools create gke-gpu-pool-1 \ --accelerator=type=nvidia-tesla-t4,count=1,gpu-driver-version=default \ --machine-type=n1-standard-16 --num-nodes=1 \ --location=us-central1 \ --cluster=gke-gpu-cluster
Criar um bucket do Cloud Storage
No console Google Cloud , acesse a página Criar um bucket:
No campo Nomeie seu bucket, insira o seguinte nome:
PROJECT_ID-gke-gpu-bucket
Clique em Continuar.
Em Tipo de local, selecione Região.
Na lista Região, selecione
us-central1 (Iowa)
e clique em Continuar.Na seção Escolha uma classe de armazenamento para seus dados, clique em Continuar.
Na seção Escolha como controlar o acesso a objetos, em Controle de acesso, selecione Uniforme.
Clique em Criar.
Na caixa de diálogo O acesso público será impedido verifique se a caixa de seleção Aplicar a prevenção contra acesso público neste bucket está marcada e clique em Confirmar.
Configurar o cluster para acessar o bucket usando a federação de identidade da carga de trabalho do GKE
Para permitir que o cluster acesse o bucket do Cloud Storage, faça o seguinte:
- Crie uma conta de serviço Google Cloud .
- Crie uma conta de serviço do Kubernetes no cluster.
- Vincule a conta de serviço do Kubernetes à conta de serviço Google Cloud .
Criar uma conta de serviço Google Cloud
No console Google Cloud , acesse a página Criar conta de serviço:
No campo ID da conta de serviço, digite
gke-ai-sa
.Clique em Criar e continuar.
Na lista Papel, selecione o papel Cloud Storage > Serviço de coletor do Insights.
Clique em
Adicionar outro papel.Na lista Selecionar um papel, selecione o papel Cloud Storage > Administrador de objetos do Storage.
Clique em Continuar e depois em Concluído.
Criar uma conta de serviço do Kubernetes no cluster
No Cloud Shell, faça o seguinte:
Crie um namespace do Kubernetes:
kubectl create namespace gke-ai-namespace
Crie uma conta de serviço do Kubernetes no namespace:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
Vincular a conta de serviço do Kubernetes à conta de serviço Google Cloud
No Cloud Shell, execute estes comandos:
Adicione uma vinculação do IAM à conta de serviço Google Cloud :
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
--member
fornece a identidade completa da conta de serviço do Kubernetes em Google Cloud.Anote a conta de serviço 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.com
Verifique se os pods podem acessar o bucket do Cloud Storage
No Cloud Shell, crie as seguintes variáveis de ambiente:
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucket
Substitua
PROJECT_ID
pelo ID do projeto do Google Cloud.Crie um pod que tenha um contêiner do TensorFlow:
envsubst < src/gke-config/standard-tensorflow-bash.yaml | kubectl --namespace=gke-ai-namespace apply -f -
Esse comando substitui as variáveis de ambiente que você criou nas referências correspondentes no manifesto. Também é possível abrir o manifesto em um editor de texto e substituir
$K8S_SA_NAME
e$BUCKET_NAME
pelos valores correspondentes.Crie um arquivo de amostra no bucket:
touch sample-file gcloud storage cp sample-file gs://PROJECT_ID-gke-gpu-bucket
Aguarde até que o pod esteja pronto:
kubectl wait --for=condition=Ready pod/test-tensorflow-pod -n=gke-ai-namespace --timeout=180s
Quando o pod estiver pronto, a saída será a seguinte:
pod/test-tensorflow-pod condition met
Abra um shell no contêiner do TensorFlow:
kubectl -n gke-ai-namespace exec --stdin --tty test-tensorflow-pod --container tensorflow -- /bin/bash
Tente ler o arquivo de amostra que você criou:
ls /data
A saída mostra o arquivo de amostra.
Verifique os registros para identificar a GPU anexada ao pod:
python3 -m pip install 'tensorflow[and-cuda]' python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
A saída mostra a GPU anexada ao pod, semelhante à seguinte:
... PhysicalDevice(name='/physical_device:GPU:0',device_type='GPU')
Saia do contêiner:
exit
Exclua o pod de amostra:
kubectl delete -f src/gke-config/standard-tensorflow-bash.yaml \ --namespace=gke-ai-namespace
Treinar e prever usando o conjunto de dados MNIST
Nesta seção, você executará uma carga de trabalho de treinamento no conjunto de dados de exemplo MNIST
.
Copie os dados de exemplo para o bucket do Cloud Storage:
gcloud storage cp src/tensorflow-mnist-example gs://PROJECT_ID-gke-gpu-bucket/ --recursive
Crie as variáveis de ambiente a seguir:
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucket
Revise o job de treinamento:
Implante o job de treinamento:
envsubst < src/gke-config/standard-tf-mnist-train.yaml | kubectl -n gke-ai-namespace apply -f -
Esse comando substitui as variáveis de ambiente que você criou nas referências correspondentes no manifesto. Também é possível abrir o manifesto em um editor de texto e substituir
$K8S_SA_NAME
e$BUCKET_NAME
pelos valores correspondentes.Aguarde até que o job tenha o status
Completed
:kubectl wait -n gke-ai-namespace --for=condition=Complete job/mnist-training-job --timeout=180s
O resultado será assim:
job.batch/mnist-training-job condition met
Verifique os registros do contêiner do TensorFlow:
kubectl logs -f jobs/mnist-training-job -c tensorflow -n gke-ai-namespace
A saída mostra que os seguintes eventos ocorrem:
- Instalar os pacotes Python necessários
- Fazer o download do conjunto de dados MNIST
- Treinar o modelo usando uma GPU
- Salvar o modelo
- Avalie o modelo
... Epoch 12/12 927/938 [============================>.] - ETA: 0s - loss: 0.0188 - accuracy: 0.9954 Learning rate for epoch 12 is 9.999999747378752e-06 938/938 [==============================] - 5s 6ms/step - loss: 0.0187 - accuracy: 0.9954 - lr: 1.0000e-05 157/157 [==============================] - 1s 4ms/step - loss: 0.0424 - accuracy: 0.9861 Eval loss: 0.04236088693141937, Eval accuracy: 0.9861000180244446 Training finished. Model saved
Exclua a carga de trabalho de treinamento:
kubectl -n gke-ai-namespace delete -f src/gke-config/standard-tf-mnist-train.yaml
Implantar uma carga de trabalho de inferência
Nesta seção, você implantará uma carga de trabalho de inferência que usa um conjunto de dados de amostra como entrada e retorna previsões.
Copie as imagens para predição para o bucket:
gcloud storage cp data/mnist_predict gs://PROJECT_ID-gke-gpu-bucket/ --recursive
Revise a carga de trabalho de inferência:
Implante a carga de trabalho de inferência:
envsubst < src/gke-config/standard-tf-mnist-batch-predict.yaml | kubectl -n gke-ai-namespace apply -f -
Esse comando substitui as variáveis de ambiente que você criou nas referências correspondentes no manifesto. Também é possível abrir o manifesto em um editor de texto e substituir
$K8S_SA_NAME
e$BUCKET_NAME
pelos valores correspondentes.Aguarde até que o job tenha o status
Completed
:kubectl wait -n gke-ai-namespace --for=condition=Complete job/mnist-batch-prediction-job --timeout=180s
O resultado será assim:
job.batch/mnist-batch-prediction-job condition met
Verifique os registros do contêiner do TensorFlow:
kubectl logs -f jobs/mnist-batch-prediction-job -c tensorflow -n gke-ai-namespace
A saída é a previsão para cada imagem e a confiança do modelo na previsão, semelhante ao seguinte:
Found 10 files belonging to 1 classes. 1/1 [==============================] - 2s 2s/step The image /data/mnist_predict/0.png is the number 0 with a 100.00 percent confidence. The image /data/mnist_predict/1.png is the number 1 with a 99.99 percent confidence. The image /data/mnist_predict/2.png is the number 2 with a 100.00 percent confidence. The image /data/mnist_predict/3.png is the number 3 with a 99.95 percent confidence. The image /data/mnist_predict/4.png is the number 4 with a 100.00 percent confidence. The image /data/mnist_predict/5.png is the number 5 with a 100.00 percent confidence. The image /data/mnist_predict/6.png is the number 6 with a 99.97 percent confidence. The image /data/mnist_predict/7.png is the number 7 with a 100.00 percent confidence. The image /data/mnist_predict/8.png is the number 8 with a 100.00 percent confidence. The image /data/mnist_predict/9.png is the number 9 with a 99.65 percent confidence.
Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos criados neste guia, faça o seguinte:
- Manter o cluster do GKE:exclua os recursos do Kubernetes no cluster e os recursos do Google Cloud .
- Manter o projeto Google Cloud :exclua o cluster do GKE e os recursos Google Cloud .
- Excluir o projeto
Excluir os recursos do Kubernetes no cluster e os recursos do Google Cloud
Exclua o namespace do Kubernetes e as cargas de trabalho implantadas:
kubectl -n gke-ai-namespace delete -f src/gke-config/standard-tf-mnist-batch-predict.yaml kubectl delete namespace gke-ai-namespace
Exclua o bucket do Cloud Storage:
Acessar a página Buckets:
Marque a caixa de seleção de
PROJECT_ID-gke-gpu-bucket
.Clique em
Excluir.Para confirmar a exclusão, digite
DELETE
e clique em Excluir.
Exclua a conta de serviço Google Cloud :
Acessar a página Contas de serviço
Selecione o projeto.
Marque a caixa de seleção de
gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com
.Clique em
Excluir.Para confirmar a exclusão, clique em Excluir.
Excluir o cluster do GKE e os recursos do Google Cloud
Exclua o cluster do GKE:
Acessar a página de clusters:
Marque a caixa de seleção de
gke-gpu-cluster
.Clique em
Excluir.Para confirmar a exclusão, digite
gke-gpu-cluster
e clique em Excluir.
Exclua o bucket do Cloud Storage:
Acessar a página Buckets:
Marque a caixa de seleção de
PROJECT_ID-gke-gpu-bucket
.Clique em
Excluir.Para confirmar a exclusão, digite
DELETE
e clique em Excluir.
Exclua a conta de serviço Google Cloud :
Acessar a página Contas de serviço
Selecione o projeto.
Marque a caixa de seleção de
gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com
.Clique em
Excluir.Para confirmar a exclusão, clique em Excluir.
Excluir o projeto
- 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.