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

  1. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Cloud de Confiance project.

  3. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  4. Install the Google Cloud CLI.

  5. 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.

  6. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  7. In the Cloud de Confiance console, activate Cloud Shell.

    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.

  8. 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

    1. Na Cloud de Confiance consola, aceda à página Criar um cluster do Autopilot:

      Aceda a Crie um cluster do Autopilot

    2. No campo Nome, introduza gke-gpu-cluster.

    3. Na lista Região, selecione us-central1.

    4. Clique em Criar.

    Crie um contentor do Cloud Storage

    1. Na Cloud de Confiance consola, aceda à página Criar um contentor:

      Aceda a Crie um contentor

    2. 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.

    3. Clique em Continuar.

    4. Para Tipo de localização, selecione Região.

    5. Na lista Região, selecione us-central1 (Iowa) e clique em Continuar.

    6. Na secção Escolha uma classe de armazenamento para os seus dados, clique em Continuar.

    7. Na secção Escolha como controlar o acesso a objetos, para Controlo de acesso, selecione Uniforme.

    8. Clique em Criar.

    9. 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:

    1. Crie uma conta de serviço do Kubernetes no seu cluster.
    2. Crie uma política de autorização do IAM que permita à ServiceAccount aceder ao contentor.

    Crie uma conta de serviço do Kubernetes no seu cluster

    No Cloud Shell, faça o seguinte:

    1. Estabeleça ligação ao cluster:

      gcloud container clusters get-credentials gke-gpu-cluster \
          --location=us-central1
      
    2. Crie um namespace do Kubernetes:

      kubectl create namespace gke-gpu-namespace
      
    3. Crie uma conta de serviço do Kubernetes no espaço de nomes:

      kubectl create serviceaccount gpu-k8s-sa --namespace=gke-gpu-namespace
      

    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

    1. 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.

    2. 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.

    3. Crie um ficheiro de exemplo no contentor:

      touch sample-file
      gcloud storage cp sample-file gs://PROJECT_ID-gke-gpu-bucket
      
    4. 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.

    5. Abra uma shell no contentor do TensorFlow:

      kubectl -n gke-gpu-namespace exec --stdin --tty test-tensorflow-pod --container tensorflow -- /bin/bash
      
    6. Tente ler o ficheiro de exemplo que criou:

      ls /data
      

      O resultado mostra o ficheiro de exemplo.

    7. 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')
      
    8. Saia do contentor:

      exit
      
    9. Elimine o pod de amostra:

      kubectl delete -f src/gke-config/standard-tensorflow-bash.yaml \
          --namespace=gke-gpu-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.

    1. 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
      
    2. Crie as seguintes variáveis de ambiente:

      export K8S_SA_NAME=gpu-k8s-sa
      export BUCKET_NAME=PROJECT_ID-gke-gpu-bucket
      
    3. Reveja a tarefa de preparação:

      # Copyright 2023 Google LLC
      #
      # Licensed under the Apache License, Version 2.0 (the "License");
      # you may not use this file except in compliance with the License.
      # You may obtain a copy of the License at
      #
      #      http://www.apache.org/licenses/LICENSE-2.0
      #
      # Unless required by applicable law or agreed to in writing, software
      # distributed under the License is distributed on an "AS IS" BASIS,
      # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      # See the License for the specific language governing permissions and
      # limitations under the License.
      
      apiVersion: batch/v1
      kind: Job
      metadata:
        name: mnist-training-job
      spec:
        template:
          metadata:
            name: mnist
            annotations:
              gke-gcsfuse/volumes: "true"
          spec:
            nodeSelector:
              cloud.google.com/gke-accelerator: nvidia-tesla-t4
            tolerations:
            - key: "nvidia.com/gpu"
              operator: "Exists"
              effect: "NoSchedule"
            containers:
            - name: tensorflow
              image: tensorflow/tensorflow:latest-gpu 
              command: ["/bin/bash", "-c", "--"]
              args: ["cd /data/tensorflow-mnist-example; pip install -r requirements.txt; python tensorflow_mnist_train_distributed.py"]
              resources:
                limits:
                  nvidia.com/gpu: 1
                  cpu: 1
                  memory: 3Gi
              volumeMounts:
              - name: gcs-fuse-csi-vol
                mountPath: /data
                readOnly: false
            serviceAccountName: $K8S_SA_NAME
            volumes:
            - name: gcs-fuse-csi-vol
              csi:
                driver: gcsfuse.csi.storage.gke.io
                readOnly: false
                volumeAttributes:
                  bucketName: $BUCKET_NAME
                  mountOptions: "implicit-dirs"
            restartPolicy: "Never"
    4. 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.

    5. 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.

    6. 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
      
    7. Elimine a carga de trabalho de preparação:

      kubectl -n gke-gpu-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.

    1. Copie as imagens para a previsão para o contentor:

      gcloud storage cp data/mnist_predict gs://PROJECT_ID-gke-gpu-bucket/ --recursive
      
    2. Reveja a carga de trabalho de inferência:

      # Copyright 2023 Google LLC
      #
      # Licensed under the Apache License, Version 2.0 (the "License");
      # you may not use this file except in compliance with the License.
      # You may obtain a copy of the License at
      #
      #      http://www.apache.org/licenses/LICENSE-2.0
      #
      # Unless required by applicable law or agreed to in writing, software
      # distributed under the License is distributed on an "AS IS" BASIS,
      # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      # See the License for the specific language governing permissions and
      # limitations under the License.
      
      apiVersion: batch/v1
      kind: Job
      metadata:
        name: mnist-batch-prediction-job
      spec:
        template:
          metadata:
            name: mnist
            annotations:
              gke-gcsfuse/volumes: "true"
          spec:
            nodeSelector:
              cloud.google.com/gke-accelerator: nvidia-tesla-t4
            tolerations:
            - key: "nvidia.com/gpu"
              operator: "Exists"
              effect: "NoSchedule"
            containers:
            - name: tensorflow
              image: tensorflow/tensorflow:latest-gpu 
              command: ["/bin/bash", "-c", "--"]
              args: ["cd /data/tensorflow-mnist-example; pip install -r requirements.txt; python tensorflow_mnist_batch_predict.py"]
              resources:
                limits:
                  nvidia.com/gpu: 1
                  cpu: 1
                  memory: 3Gi
              volumeMounts:
              - name: gcs-fuse-csi-vol
                mountPath: /data
                readOnly: false
            serviceAccountName: $K8S_SA_NAME
            volumes:
            - name: gcs-fuse-csi-vol
              csi:
                driver: gcsfuse.csi.storage.gke.io
                readOnly: false
                volumeAttributes:
                  bucketName: $BUCKET_NAME
                  mountOptions: "implicit-dirs"
            restartPolicy: "Never"
    3. 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.

    4. 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
      
    5. 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.
      

    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:

    • 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 os recursos do Kubernetes no cluster e os Cloud de Confiance recursos

    1. 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
      
    2. Elimine o contentor do Cloud Storage:

      1. Aceda à página Recipientes:

        Aceda a Recipientes

      2. Selecione a caixa de verificação de PROJECT_ID-gke-gpu-bucket.

      3. Clique em Eliminar.

      4. Para confirmar a eliminação, escreva DELETE e clique em Eliminar.

    3. Elimine a Cloud de Confiance conta de serviço:

      1. Aceda à página Contas de serviço:

        Aceda a Contas de serviço

      2. Selecione o seu projeto.

      3. Selecione a caixa de verificação de gke-gpu-sa@PROJECT_ID.s3ns.iam.gserviceaccount.com.

      4. Clique em Eliminar.

      5. Para confirmar a eliminação, clique em Eliminar.

    Elimine o cluster do GKE e os recursos Cloud de Confiance

    1. Elimine o cluster do GKE:

      1. Aceda à página Clusters:

        Aceda a Clusters

      2. Selecione a caixa de verificação gke-gpu-cluster.

      3. Clique em Eliminar.

      4. Para confirmar a eliminação, escreva gke-gpu-cluster e clique em Eliminar.

    2. Elimine o contentor do Cloud Storage:

      1. Aceda à página Recipientes:

        Aceda a Recipientes

      2. Selecione a caixa de verificação de PROJECT_ID-gke-gpu-bucket.

      3. Clique em Eliminar.

      4. Para confirmar a eliminação, escreva DELETE e clique em Eliminar.

    3. Elimine a Cloud de Confiance conta de serviço:

      1. Aceda à página Contas de serviço:

        Aceda a Contas de serviço

      2. Selecione o seu projeto.

      3. Selecione a caixa de verificação de gke-gpu-sa@PROJECT_ID.s3ns.iam.gserviceaccount.com.

      4. Clique em Eliminar.

      5. Para confirmar a eliminação, clique em Eliminar.

    Elimine o projeto

    1. In the Cloud de Confiance console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    O que se segue?