Treinar um modelo com GPUs no modo Autopilot 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. Este documento é destinado a administradores do GKE que já têm clusters no modo Autopilot e querem executar cargas de trabalho de GPU pela primeira vez.
Também é possível executar essas cargas de trabalho em clusters do Standard se você criar pools de nós de GPU separados nos clusters. Para instruções, consulte Treinar um modelo com GPUs no modo GKE Standard.
Antes de começar
- Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloud, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
-
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 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 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 theserviceusage.services.enablepermission. Learn how to grant roles.-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Para inicializar a gcloud CLI, execute o seguinte comando:
gcloud init -
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 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 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 theserviceusage.services.enablepermission. Learn how to grant roles.-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Para inicializar a gcloud CLI, execute o seguinte comando:
gcloud init -
No console do Google Cloud , ative o Cloud Shell.
Na parte de baixo do console Google Cloud , uma sessão do Cloud Shell é iniciada e exibe um prompt de linha de comando. O Cloud Shell é um ambiente shell com a CLI do Google Cloud já instalada e com valores já definidos para o projeto atual. A inicialização da sessão pode levar alguns segundos.
clone o repositório de exemplo
No Cloud Shell, execute este comando:
git clone https://github.com/GoogleCloudPlatform/ai-on-gke && \
cd ai-on-gke/tutorials-and-examples/gpu-examples/training-single-gpu
Criar um cluster
No console do Google Cloud , acesse a página Criar um cluster do Autopilot:
No campo Nome, use
gke-gpu-cluster.Na lista Região, selecione
us-central1.Clique em Criar.
Criar um bucket do Cloud Storage
No console do Google Cloud , acesse a página Criar um bucket:
Na seção Começar, insira um nome globalmente exclusivo para o bucket:
PROJECT_ID-gke-gpu-bucketSubstitua
PROJECT_IDpelo ID do projeto do Google Cloud.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 Kubernetes no cluster.
- Crie uma política de permissão do IAM que permita à ServiceAccount acessar o bucket.
Criar uma conta de serviço do Kubernetes no cluster
No Cloud Shell, faça o seguinte:
Conecte-se ao cluster:
gcloud container clusters get-credentials gke-gpu-cluster \ --location=us-central1Crie um namespace do Kubernetes:
kubectl create namespace gke-gpu-namespaceCrie uma conta de serviço do Kubernetes no namespace:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-gpu-namespace
Criar uma política de permissão do IAM no bucket
Conceda o papel de administrador de objetos do Storage (roles/storage.objectAdmin) no bucket à conta de serviço do Kubernetes:
gcloud storage buckets add-iam-policy-binding gs://PROJECT_ID-gke-gpu-bucket \
--member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/gke-gpu-namespace/sa/gpu-k8s-sa \
--role=roles/storage.objectAdmin \
--condition=None
Substitua PROJECT_NUMBER pelo número do projeto do Google Cloud.
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-bucketSubstitua
PROJECT_IDpelo 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-gpu-namespace apply -f -Esse comando insere 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_NAMEe$BUCKET_NAMEpelos valores correspondentes.Crie um arquivo de amostra no bucket:
touch sample-file gcloud storage cp sample-file gs://PROJECT_ID-gke-gpu-bucketAguarde até que o pod esteja pronto:
kubectl wait --for=condition=Ready pod/test-tensorflow-pod -n=gke-gpu-namespace --timeout=180sQuando o pod estiver pronto, a saída será a seguinte:
pod/test-tensorflow-pod condition metSe o comando expirar, o GKE ainda poderá estar criando novos nós para executar os pods. Execute o comando novamente e aguarde o pod ficar pronto.
Abra um shell no contêiner do TensorFlow:
kubectl -n gke-gpu-namespace exec --stdin --tty test-tensorflow-pod --container tensorflow -- /bin/bashTente ler o arquivo de amostra que você criou:
ls /dataA 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:
exitExclua o pod de amostra:
kubectl delete -f src/gke-config/standard-tensorflow-bash.yaml \ --namespace=gke-gpu-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/ --recursiveCrie as variáveis de ambiente a seguir:
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucketRevise o job de treinamento:
Implante o job de treinamento:
envsubst < src/gke-config/standard-tf-mnist-train.yaml | kubectl -n gke-gpu-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_NAMEe$BUCKET_NAMEpelos valores correspondentes.Aguarde até que o job tenha o status
Completed:kubectl wait -n gke-gpu-namespace --for=condition=Complete job/mnist-training-job --timeout=180sQuando o job estiver pronto, a saída será semelhante a esta:
job.batch/mnist-training-job condition metSe o comando expirar, o GKE ainda poderá estar criando novos nós para executar os pods. Execute o comando novamente e aguarde até que o job fique pronto.
Verifique os registros do contêiner do TensorFlow:
kubectl logs -f jobs/mnist-training-job -c tensorflow -n gke-gpu-namespaceA 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 savedExclua a carga de trabalho de treinamento:
kubectl -n gke-gpu-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/ --recursiveRevise 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-gpu-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_NAMEe$BUCKET_NAMEpelos valores correspondentes.Aguarde até que o job tenha o status
Completed:kubectl wait -n gke-gpu-namespace --for=condition=Complete job/mnist-batch-prediction-job --timeout=180sO resultado será o seguinte:
job.batch/mnist-batch-prediction-job condition metVerifique os registros do contêiner do TensorFlow:
kubectl logs -f jobs/mnist-batch-prediction-job -c tensorflow -n gke-gpu-namespaceA 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-gpu-namespace delete -f src/gke-config/standard-tf-mnist-batch-predict.yaml kubectl delete namespace gke-gpu-namespaceExclua 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
DELETEe 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-gpu-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-clustere 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
DELETEe 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-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.Clique em Excluir.
Para confirmar a exclusão, clique em Excluir.
Excluir o projeto
- No console Google Cloud , acesse a página Gerenciar recursos.
- Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
- Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.