Prepare um modelo com GPUs no modo GKE Autopilot
Este 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 documento destina-se a administradores do GKE que tenham clusters no modo Autopilot e queiram executar cargas de trabalho de GPU pela primeira vez.
Também pode executar estas cargas de trabalho em clusters padrão se criar pools de nós de GPU separados nos seus clusters. Para ver instruções, consulte o artigo Forme um modelo com GPUs no modo Standard do GKE.
Antes de começar
-
In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance 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 Cloud de Confiance 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.enable
permission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
Configure a CLI gcloud para usar a sua identidade federada.
Para mais informações, consulte o artigo Inicie sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init
-
In the Cloud de Confiance console, activate Cloud Shell.
At the bottom of the Cloud de Confiance 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.
Na Cloud de Confiance consola, aceda à página Criar um cluster do Autopilot:
No campo Nome, introduza
gke-gpu-cluster
.Na lista Região, selecione
us-central1
.Clique em Criar.
Na Cloud de Confiance consola, aceda à página Criar um contentor:
No campo Dê um nome ao seu contentor, introduza o seguinte nome:
PROJECT_ID-gke-gpu-bucket
Substitua
PROJECT_ID
pelo seu Cloud de Confiance ID do projeto.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.
- Crie uma conta de serviço do Kubernetes no seu cluster.
- Crie uma política de autorização do IAM que permita à ServiceAccount aceder ao contentor.
Estabeleça ligação ao cluster:
gcloud container clusters get-credentials gke-gpu-cluster \ --location=us-central1
Crie um namespace do Kubernetes:
kubectl create namespace gke-gpu-namespace
Crie uma conta de serviço do Kubernetes no espaço de nomes:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-gpu-namespace
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 Cloud de Confiance ID do projeto.Crie um pod com um contentor do TensorFlow:
envsubst < src/gke-config/standard-tensorflow-bash.yaml | kubectl --namespace=gke-gpu-namespace apply -f -
Este comando insere as variáveis de ambiente que criou nas 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-gpu-namespace --timeout=180s
Quando o pod estiver pronto, a saída é a seguinte:
pod/test-tensorflow-pod condition met
Se o comando exceder o tempo limite, o GKE pode continuar a criar novos nós para executar os pods. Execute o comando novamente e aguarde até que o Pod fique pronto.
Abra uma shell no contentor do TensorFlow:
kubectl -n gke-gpu-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:
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-gpu-namespace
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-gpu-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-gpu-namespace --for=condition=Complete job/mnist-training-job --timeout=180s
Quando a tarefa estiver pronta, o resultado é semelhante ao seguinte:
job.batch/mnist-training-job condition met
Se o comando exceder o tempo limite, o GKE pode continuar a criar novos nós para executar os pods. Execute novamente o comando e aguarde que a tarefa fique pronta.
Verifique os registos do contentor do TensorFlow:
kubectl logs -f jobs/mnist-training-job -c tensorflow -n gke-gpu-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-gpu-namespace delete -f src/gke-config/standard-tf-mnist-train.yaml
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-gpu-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-gpu-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-gpu-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.
- Manter o cluster do GKE: elimine os recursos do Kubernetes no cluster e os Cloud de Confiance recursos
- Manter o Cloud de Confiance projeto: elimine o cluster do GKE e os Cloud de Confiance recursos
- Elimine o projeto
Elimine o espaço de nomes do Kubernetes e as cargas de trabalho que implementou:
kubectl -n gke-gpu-namespace delete -f src/gke-config/standard-tf-mnist-batch-predict.yaml kubectl delete namespace gke-gpu-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 Cloud de Confiance 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.s3ns.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
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 Cloud de Confiance 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.s3ns.iam.gserviceaccount.com
.Clique em
Eliminar.Para confirmar a eliminação, clique em Eliminar.
- In the Cloud de Confiance 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.
Clone o repositório de exemplo
No Cloud Shell, execute o seguinte comando:
git clone https://github.com/GoogleCloudPlatform/ai-on-gke && \
cd ai-on-gke/tutorials-and-examples/gpu-examples/training-single-gpu
Crie um cluster
Crie um contentor do Cloud Storage
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 conta de serviço do Kubernetes no seu cluster
No Cloud Shell, faça o seguinte:
Crie uma política de permissão da IAM no contentor
Conceda a função de administrador de objetos de armazenamento (roles/storage.objectAdmin
) no contentor
à 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 seu Cloud de Confiance
número do projeto.
Confirme se os pods podem aceder ao contentor do Cloud Storage
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
.
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.
Limpar
Para evitar incorrer em custos na sua Cloud de Confiance conta pelos recursos que criou neste guia, faça uma das seguintes ações: