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 Standard 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
- 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.
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.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. -
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, 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
(
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. -
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init -
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.
Na Google Cloud 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 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-bucketSubstitua
PROJECT_IDpelo seu Google Cloud 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 da IAM que permita à ServiceAccount aceder ao contentor.
Estabeleça ligação 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 espaço de nomes:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-gpu-namespaceNo 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 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-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_NAMEe$BUCKET_NAMEpelos valores correspondentes.Crie um ficheiro de exemplo no contentor:
touch sample-file gcloud storage cp sample-file gs://PROJECT_ID-gke-gpu-bucketAguarde até que o Pod fique pronto:
kubectl wait --for=condition=Ready pod/test-tensorflow-pod -n=gke-gpu-namespace --timeout=180sQuando o pod estiver pronto, a saída é a seguinte:
pod/test-tensorflow-pod condition metSe 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/bashTente ler o ficheiro de exemplo que criou:
ls /dataO 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:
exitElimine o pod de amostra:
kubectl delete -f src/gke-config/standard-tensorflow-bash.yaml \ --namespace=gke-gpu-namespaceCopie os dados de exemplo para o contentor do Cloud Storage:
gcloud storage cp src/tensorflow-mnist-example gs://PROJECT_ID-gke-gpu-bucket/ --recursiveCrie as seguintes variáveis de ambiente:
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucketReveja 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_NAMEe$BUCKET_NAMEpelos 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=180sQuando a tarefa estiver pronta, o resultado é semelhante ao seguinte:
job.batch/mnist-training-job condition metSe 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-namespaceO 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 savedElimine a carga de trabalho de preparação:
kubectl -n gke-gpu-namespace delete -f src/gke-config/standard-tf-mnist-train.yamlCopie as imagens para a previsão para o contentor:
gcloud storage cp data/mnist_predict gs://PROJECT_ID-gke-gpu-bucket/ --recursiveReveja 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_NAMEe$BUCKET_NAMEpelos 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=180sO resultado é semelhante ao seguinte:
job.batch/mnist-batch-prediction-job condition metVerifique os registos do contentor do TensorFlow:
kubectl logs -f jobs/mnist-batch-prediction-job -c tensorflow -n gke-gpu-namespaceO 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 Google Cloud recursos
- Manter o Google Cloud projeto: elimine o cluster do GKE e os Google Cloud 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-namespaceElimine 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
DELETEe 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-gpu-sa@PROJECT_ID.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-clustere 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
DELETEe 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-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.Clique em Eliminar.
Para confirmar a eliminação, clique em Eliminar.
- 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.
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 Google Cloud
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 Google Cloud conta pelos recursos que criou neste guia, faça uma das seguintes ações: