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.
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
- 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, select or create a Google Cloud project.
-
Verifique se a cobrança está ativada para o seu projeto do Google Cloud.
-
Enable the Kubernetes Engine and Cloud Storage APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verifique se a cobrança está ativada para o seu projeto do Google Cloud.
-
Enable the Kubernetes Engine and Cloud Storage APIs.
-
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 o
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
Crie um bucket do Cloud Storage
No Console do 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 do Google Cloud.
- Crie uma conta de serviço do Kubernetes no cluster.
- Vincular a conta de serviço do Kubernetes à conta de serviço do Google Cloud.
Criar uma conta de serviço do Google Cloud.
No Console do 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 do Google Cloud
No Cloud Shell, execute os seguintes comandos:
Adicione uma vinculação do IAM à conta de serviço do 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 sinalização
--member
fornece a identidade completa da conta de serviço do Kubernetes no 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 o
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:
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, siga um destes procedimentos:
- Manter o cluster do GKE: exclua os recursos do Kubernetes no cluster e os recursos do Google Cloud.
- Manter o projeto do Google Cloud: exclua o cluster do GKE e os recursos do 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.
Excluir a conta de serviço do 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.
Excluir a conta de serviço do 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.