Prepare um modelo com GPUs no modo padrão do GKE
Este tutorial de início rápido mostra como implementar um modelo de formação com GPUs no Google Kubernetes Engine (GKE) e armazenar as previsões no Cloud Storage. Este tutorial usa um modelo do TensorFlow e clusters padrão do GKE. Também pode executar estas cargas de trabalho em clusters do Autopilot com menos passos de configuração. Para ver instruções, consulte o artigo Forme um modelo com GPUs no modo Autopilot do GKE.
Este documento destina-se a administradores do GKE que tenham clusters Standard existentes e queiram 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 o seguinte 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
Crie um cluster no modo padrão e um node pool de GPU
Use o Cloud Shell para fazer o seguinte:
Crie um cluster padrão que use a Workload Identity Federation para o GKE e instale o controlador FUSE do Cloud Storage:
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 seu Google Cloud ID do projeto.A criação do cluster pode demorar vários minutos.
Crie um node pool 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 contentor do Cloud Storage
Na Google Cloud consola, aceda à página Criar um contentor:
No campo Dê um nome ao seu contentor, introduza o seguinte nome:
PROJECT_ID-gke-gpu-bucket
Clique em Continuar.
Para Tipo de localização, selecione Região.
Na lista Região, selecione
us-central1 (Iowa)
e clique em Continuar.Na secção Escolha uma classe de armazenamento para os seus dados, clique em Continuar.
Na secção Escolha como controlar o acesso a objetos, para Controlo de acesso, selecione Uniforme.
Clique em Criar.
Na caixa de diálogo O acesso público vai ser impedido, certifique-se de que a caixa de verificação Aplicar a prevenção de acesso público neste contentor está selecionada e clique em Confirmar.
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 conta de serviço do Kubernetes no seu cluster.
- Associe a conta de serviço do Kubernetes à Google Cloud conta de serviço.
Crie uma 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 uma conta de serviço do Kubernetes no seu 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 espaço de nomes:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
Associe a conta de serviço do Kubernetes à Google Cloud conta de serviço
No Cloud Shell, execute os seguintes comandos:
Adicione 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
--member
fornece 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.com
Confirme se os pods podem aceder ao contentor 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 seu Google Cloud ID do projeto.Crie um pod com um contentor do TensorFlow:
envsubst < src/gke-config/standard-tensorflow-bash.yaml | kubectl --namespace=gke-ai-namespace apply -f -
Este comando substitui as variáveis de ambiente que criou pelas referências correspondentes no manifesto. Também pode abrir o manifesto num editor de texto e substituir
$K8S_SA_NAME
e$BUCKET_NAME
pelos valores correspondentes.Crie um ficheiro de exemplo no contentor:
touch sample-file gcloud storage cp sample-file gs://PROJECT_ID-gke-gpu-bucket
Aguarde até que o Pod fique pronto:
kubectl wait --for=condition=Ready pod/test-tensorflow-pod -n=gke-ai-namespace --timeout=180s
Quando o pod estiver pronto, a saída é a seguinte:
pod/test-tensorflow-pod condition met
Abra uma shell no contentor do TensorFlow:
kubectl -n gke-ai-namespace exec --stdin --tty test-tensorflow-pod --container tensorflow -- /bin/bash
Tente ler o ficheiro de exemplo que criou:
ls /data
O resultado mostra o ficheiro de exemplo.
Verifique os registos para identificar a GPU associada ao pod:
python3 -m pip install 'tensorflow[and-cuda]' python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
O resultado mostra a GPU associada ao pod, semelhante ao seguinte:
... PhysicalDevice(name='/physical_device:GPU:0',device_type='GPU')
Saia do contentor:
exit
Elimine o pod de amostra:
kubectl delete -f src/gke-config/standard-tensorflow-bash.yaml \ --namespace=gke-ai-namespace
Faça a preparação e a previsão com o conjunto de dados MNIST
Nesta secção, executa uma carga de trabalho de preparação no conjunto de dados de exemplo MNIST
.
Copie os dados de exemplo para o contentor do Cloud Storage:
gcloud storage cp src/tensorflow-mnist-example gs://PROJECT_ID-gke-gpu-bucket/ --recursive
Crie as seguintes variáveis de ambiente:
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucket
Reveja a tarefa de preparação:
Implemente a tarefa de preparação:
envsubst < src/gke-config/standard-tf-mnist-train.yaml | kubectl -n gke-ai-namespace apply -f -
Este comando substitui as variáveis de ambiente que criou pelas referências correspondentes no manifesto. Também pode abrir o manifesto num editor de texto e substituir
$K8S_SA_NAME
e$BUCKET_NAME
pelos valores correspondentes.Aguarde até que a tarefa tenha o estado
Completed
:kubectl wait -n gke-ai-namespace --for=condition=Complete job/mnist-training-job --timeout=180s
O resultado é semelhante ao seguinte:
job.batch/mnist-training-job condition met
Verifique os registos do contentor do TensorFlow:
kubectl logs -f jobs/mnist-training-job -c tensorflow -n gke-ai-namespace
O resultado mostra a ocorrência dos seguintes eventos:
- Instale os pacotes Python necessários
- Transfira o conjunto de dados MNIST
- Prepare o modelo com uma GPU
- Guarde 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
Elimine a carga de trabalho de preparação:
kubectl -n gke-ai-namespace delete -f src/gke-config/standard-tf-mnist-train.yaml
Implemente uma carga de trabalho de inferência
Nesta secção, implementa uma carga de trabalho de inferência que usa um conjunto de dados de exemplo como entrada e devolve previsões.
Copie as imagens para a previsão para o contentor:
gcloud storage cp data/mnist_predict gs://PROJECT_ID-gke-gpu-bucket/ --recursive
Reveja a carga de trabalho de inferência:
Implemente a carga de trabalho de inferência:
envsubst < src/gke-config/standard-tf-mnist-batch-predict.yaml | kubectl -n gke-ai-namespace apply -f -
Este comando substitui as variáveis de ambiente que criou pelas referências correspondentes no manifesto. Também pode abrir o manifesto num editor de texto e substituir
$K8S_SA_NAME
e$BUCKET_NAME
pelos valores correspondentes.Aguarde até que a tarefa tenha o estado
Completed
:kubectl wait -n gke-ai-namespace --for=condition=Complete job/mnist-batch-prediction-job --timeout=180s
O resultado é semelhante ao seguinte:
job.batch/mnist-batch-prediction-job condition met
Verifique os registos do contentor do TensorFlow:
kubectl logs -f jobs/mnist-batch-prediction-job -c tensorflow -n gke-ai-namespace
O resultado é 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 incorrer em custos na sua Google Cloud conta pelos recursos que criou neste guia, faça uma das seguintes ações:
- 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 os recursos do Kubernetes no cluster e os Google Cloud recursos
Elimine o espaço de nomes do Kubernetes e as cargas de trabalho que implementou:
kubectl -n gke-ai-namespace delete -f src/gke-config/standard-tf-mnist-batch-predict.yaml kubectl delete namespace gke-ai-namespace
Elimine o contentor do Cloud Storage:
Aceda à página Recipientes:
Selecione a caixa de verificação de
PROJECT_ID-gke-gpu-bucket
.Clique em
Eliminar.Para confirmar a eliminação, escreva
DELETE
e 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-ai-sa@PROJECT_ID.iam.gserviceaccount.com
.Clique em
Eliminar.Para confirmar a eliminação, clique em Eliminar.
Elimine o cluster do GKE e os recursos Google Cloud
Elimine o cluster do GKE:
Aceda à página Clusters:
Selecione a caixa de verificação
gke-gpu-cluster
.Clique em
Eliminar.Para confirmar a eliminação, escreva
gke-gpu-cluster
e clique em Eliminar.
Elimine o contentor do Cloud Storage:
Aceda à página Recipientes:
Selecione a caixa de verificação de
PROJECT_ID-gke-gpu-bucket
.Clique em
Eliminar.Para confirmar a eliminação, escreva
DELETE
e 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-ai-sa@PROJECT_ID.iam.gserviceaccount.com
.Clique em
Eliminar.Para confirmar a eliminação, clique em Eliminar.
Elimine 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.