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
- 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 role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Se estiver a usar um projeto existente para este guia, verifique se tem as autorizações necessárias para concluir este guia. Se criou um novo projeto, já tem as autorizações necessárias.
-
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 theserviceusage.services.enablepermission. 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 role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Se estiver a usar um projeto existente para este guia, verifique se tem as autorizações necessárias para concluir este guia. Se criou um novo projeto, já tem as autorizações necessárias.
-
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 theserviceusage.services.enablepermission. 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.
-
Gerir clusters do GKE:
Administrador do Kubernetes Engine (
roles/container.admin) -
Gerir contentores do Cloud Storage:
Administrador de armazenamento (
roles/storage.admin) -
Conceda funções do IAM no projeto:
Administrador do IAM do projeto (
roles/resourcemanager.projectIamAdmin) -
Crie e conceda funções em contas de serviço de IAM:
Administrador da conta de serviço (
roles/iam.serviceAccountAdmin) 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.googSubstitua
PROJECT_IDpelo 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-clusterNa 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-bucketClique 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 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.
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 um namespace do Kubernetes:
kubectl create namespace gke-ai-namespaceCrie uma conta de serviço do Kubernetes no espaço de nomes:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespaceAdicione 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
--memberfornece 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.comNo 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 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_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-ai-namespace --timeout=180sQuando o pod estiver pronto, a saída é a seguinte:
pod/test-tensorflow-pod condition metAbra uma shell no contentor do TensorFlow:
kubectl -n gke-ai-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:
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:
exitElimine o pod de amostra:
kubectl delete -f src/gke-config/standard-tensorflow-bash.yaml \ --namespace=gke-ai-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-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_NAMEe$BUCKET_NAMEpelos 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=180sO resultado é semelhante ao seguinte:
job.batch/mnist-training-job condition metVerifique os registos do contentor do TensorFlow:
kubectl logs -f jobs/mnist-training-job -c tensorflow -n gke-ai-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-ai-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-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_NAMEe$BUCKET_NAMEpelos 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=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-ai-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-ai-namespace delete -f src/gke-config/standard-tf-mnist-batch-predict.yaml kubectl delete namespace gke-ai-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-ai-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-ai-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.
Funções necessárias
Para receber as autorizações de que precisa para preparar um modelo em GPUs, peça ao seu administrador que lhe conceda as seguintes funções da IAM no seu projeto:
Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.
Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.
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 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 Google Cloud conta de serviço
Crie uma conta de serviço do Kubernetes no seu cluster
No Cloud Shell, faça o seguinte:
Associe a conta de serviço do Kubernetes à Google Cloud conta de serviço
No Cloud Shell, execute os seguintes comandos:
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: