Melatih model dengan GPU pada mode GKE Standar


Panduan memulai ini menunjukkan cara men-deploy model pelatihan dengan GPU di Google Kubernetes Engine (GKE) dan menyimpan prediksi di Cloud Storage. Dokumen ini ditujukan bagi administrator GKE yang sudah memiliki cluster Mode Standar dan ingin menjalankan workload GPU untuk pertama kalinya.

Anda juga dapat menjalankan workload ini di cluster mode Autopilot dengan langkah penyiapan yang lebih sedikit.

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Aktifkan API Kubernetes Engine and Cloud Storage.

    Mengaktifkan API

  5. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  6. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  7. Aktifkan API Kubernetes Engine and Cloud Storage.

    Mengaktifkan API

  8. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

Gandakan repositori sampel

Jalankan perintah berikut di Cloud Shell:

git clone https://github.com/GoogleCloudPlatform/ai-on-gke/ ai-on-gke
cd ai-on-gke/training-single-gpu

Membuat cluster mode Standar dan node pool GPU

Gunakan Cloud Shell untuk melakukan hal berikut:

  1. Buat cluster Standar yang menggunakan Workload Identity dan instal driver Cloud Storage FUSE:

    gcloud container clusters create gke-gpu-cluster \
        --addons GcsFuseCsiDriver \
        --location=us-central1 \
        --num-nodes=1 \
        --workload-pool=PROJECT_ID.svc.id.goog
    

    PROJECT_ID dengan ID project Google Cloud Anda

    Pembuatan cluster mungkin memerlukan waktu beberapa menit.

  2. Buat node pool 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
    

Membuat bucket Cloud Storage

  1. Di konsol Google Cloud, buka halaman Create a bucket:

    Buka Membuat bucket

  2. Pada kolom Name your bucket, masukkan nama berikut:

    PROJECT_ID-gke-gpu-bucket
    
  3. Klik Lanjutkan.

  4. Untuk Jenis lokasi, pilih Region.

  5. Dalam daftar Region, pilih us-central1 (Iowa) dan klik Lanjutkan.

  6. Pada bagian Pilih kelas penyimpanan untuk data Anda, klik Lanjutkan.

  7. Di bagian Choose how to control access to objects, untuk Access control, pilih Uniform.

  8. Klik Buat.

  9. Pada dialog Akses publik akan dicegah pastikan bahwa kotak centang Enforce public access prevention on this bucket sudah dicentang, lalu klik Konfirmasi.

Konfigurasi cluster Anda untuk mengakses bucket menggunakan Workload Identity

Agar cluster Anda dapat mengakses bucket Cloud Storage, lakukan langkah berikut:

  1. Buat akun layanan Google Cloud.
  2. Buat Akun Layanan Kubernetes di cluster Anda.
  3. Ikat Akun Layanan Kubernetes ke akun layanan Google Cloud.

Membuat akun layanan Google Cloud

  1. Di konsol Google Cloud, buka halaman Buat akun layanan.

    Buka Buat akun layanan

  2. Di kolom Service account ID, masukkan gke-gpu-sa.

  3. Klik Buat dan lanjutkan.

  4. Di daftar Role, pilih peran Cloud Storage > Storage Insights Collector Service.

  5. Klik Add another role.

  6. Dalam daftar Select a role, pilih peran Cloud Storage > Storage Object Admin.

  7. Klik Lanjutkan lalu klik Selesai.

Membuat Akun Layanan Kubernetes di cluster Anda

Di Cloud Shell, lakukan hal berikut:

  1. Membuat namespace Kubernetes:

    kubectl create namespace gke-gpu-namespace
    
  2. Buat Akun Layanan Kubernetes dalam namespace:

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

Mengikat Akun Layanan Kubernetes ke akun layanan Google Cloud

Di Cloud Shell jalankan perintah berikut:

  1. Tambahkan binding IAM ke akun layanan Google Cloud:

    gcloud iam service-accounts add-iam-policy-binding gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-gpu-namespace/gpu-k8s-sa]"
    

    Flag --member memberikan identitas lengkap Akun Layanan Kubernetes di Google Cloud.

  2. Anotasikan Akun Layanan Kubernetes:

    kubectl annotate serviceaccount gpu-k8s-sa \
        --namespace gke-gpu-namespace \
        iam.gke.io/gcp-service-account=gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com
    

Memverifikasi bahwa Pod dapat mengakses bucket Cloud Storage

  1. Di Cloud Shell, buat variabel lingkungan berikut:

    export K8S_SA_NAME=gpu-k8s-sa
    export BUCKET_NAME=PROJECT_ID-gke-gpu-bucket
    

    PROJECT_ID dengan ID project Google Cloud Anda

  2. Membuat Pod yang memiliki container TensorFlow:

    envsubst < src/gke-config/standard-tensorflow-bash.yaml | kubectl --namespace=gke-gpu-namespace apply -f -
    

    Perintah ini mengganti variabel lingkungan yang Anda buat ke dalam referensi yang sesuai dalam manifes. Anda juga dapat membuka manifes di editor teks serta mengganti $K8S_SA_NAME dan $BUCKET_NAME dengan nilai yang sesuai.

  3. Buat file sampel di bucket:

    touch sample-file
    gsutil cp sample-file gs://PROJECT_ID-gke-gpu-bucket
    
  4. Tunggu hingga Pod Anda siap:

    kubectl wait --for=condition=Ready pod/test-tensorflow-pod -n=gke-gpu-namespace --timeout=180s
    

    Setelah Pod sudah siap, output-nya adalah sebagai berikut:

    pod/test-tensorflow-pod condition met
    
  5. Buka shell di container Tensorflow:

    kubectl -n gke-gpu-namespace exec --stdin --tty test-tensorflow-pod --container tensorflow -- /bin/bash
    
  6. Coba baca file sampel yang Anda buat:

    ls /data
    

    Output menunjukkan file sampel.

  7. Periksa log untuk mengidentifikasi GPU yang terpasang ke Pod:

    python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
    

    Output menunjukkan GPU yang terpasang ke Pod, mirip dengan berikut ini:

    ...
    PhysicalDevice(name='/physical_device:GPU:0',device_type='GPU')
    
  8. Keluar dari container:

    exit
    
  9. Hapus contoh Pod:

    kubectl delete -f src/gke-config/standard-tensorflow-bash.yaml \
        --namespace=gke-gpu-namespace
    

Latih dan prediksi menggunakan set data MNIST

Di bagian ini, Anda akan menjalankan workload pelatihan pada set data contoh MNIST.

  1. Salin data contoh ke bucket Cloud Storage:

    gsutil -m cp -R src/tensorflow-mnist-example gs://PROJECT_ID-gke-gpu-bucket/
    
  2. Buat variabel lingkungan berikut:

    export K8S_SA_NAME=gpu-k8s-sa
    export BUCKET_NAME=PROJECT_ID-gke-gpu-bucket
    
  3. Tinjau Tugas pelatihan:

    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. Deploy Tugas pelatihan:

    envsubst < src/gke-config/standard-tf-mnist-train.yaml | kubectl -n gke-gpu-namespace apply -f -
    

    Perintah ini mengganti variabel lingkungan yang Anda buat ke dalam referensi yang sesuai dalam manifes. Anda juga dapat membuka manifes di editor teks serta mengganti $K8S_SA_NAME dan $BUCKET_NAME dengan nilai yang sesuai.

  5. Tunggu hingga Tugas memiliki status Completed:

    kubectl wait -n gke-gpu-namespace --for=condition=Complete job/mnist-training-job --timeout=180s
    

    Outputnya mirip dengan hal berikut ini:

    job.batch/mnist-training-job condition met
    
  6. Periksa log dari container Tensorflow:

    kubectl logs -f jobs/mnist-training-job -c tensorflow -n gke-gpu-namespace
    

    Output menunjukkan bahwa peristiwa berikut terjadi:

    • Instal paket Python yang diperlukan
    • Mendownload set data MNIST
    • Melatih model menggunakan GPU
    • Simpan model
    • Mengevaluasi model
    ...
    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. Hapus workload pelatihan:

    kubectl -n gke-gpu-namespace delete -f src/gke-config/standard-tf-mnist-train.yaml
    

Men-deploy workload inferensi

Di bagian ini, Anda akan men-deploy workload inferensi yang mengambil set data sampel sebagai input dan menampilkan prediksi.

  1. Salin image untuk prediksi ke bucket:

    gsutil -m cp -R data/mnist_predict gs://PROJECT_ID-gke-gpu-bucket/
    
  2. Tinjau workload inferensi:

    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. Deploy workload inferensi:

    envsubst < src/gke-config/standard-tf-mnist-batch-predict.yaml | kubectl -n gke-gpu-namespace apply -f -
    

    Perintah ini mengganti variabel lingkungan yang Anda buat ke dalam referensi yang sesuai dalam manifes. Anda juga dapat membuka manifes di editor teks serta mengganti $K8S_SA_NAME dan $BUCKET_NAME dengan nilai yang sesuai.

  4. Tunggu hingga Tugas memiliki status Completed:

    kubectl wait -n gke-gpu-namespace --for=condition=Complete job/mnist-batch-prediction-job --timeout=180s
    

    Outputnya mirip dengan hal berikut ini:

    job.batch/mnist-batch-prediction-job condition met
    
  5. Periksa log dari container Tensorflow:

    kubectl logs -f jobs/mnist-batch-prediction-job -c tensorflow -n gke-gpu-namespace
    

    Outputnya adalah prediksi untuk setiap image dan keyakinan model pada prediksi tersebut, mirip dengan berikut ini:

    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.
    

Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang dibuat dalam panduan ini, lakukan salah satu langkah berikut:

  • Pertahankan cluster GKE: Hapus resource Kubernetes di cluster dan resource Google Cloud
  • Mempertahankan project Google Cloud: Hapus cluster GKE dan resource Google Cloud
  • Menghapus project

Menghapus resource Kubernetes dalam cluster dan resource Google Cloud

  1. Hapus namespace Kubernetes dan workload yang Anda deploy:

    kubectl -n gke-gpu-namespace delete -f src/gke-config/standard-tf-mnist-batch-predict.yaml
    kubectl delete namespace gke-gpu-namespace
    
  2. Hapus bucket Cloud Storage:

    1. Buka halaman Bucket:

      Buka Bucket

    2. Pilih kotak centang untuk PROJECT_ID-gke-gpu-bucket.

    3. Klik Delete.

    4. Untuk mengonfirmasi penghapusan, ketik DELETE, lalu klik Delete.

  3. Hapus akun layanan Google Cloud:

    1. Buka halaman Akun Layanan.

      Buka Akun layanan

    2. Pilih project Anda.

    3. Pilih kotak centang untuk gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.

    4. Klik Delete.

    5. Untuk mengonfirmasi penghapusan, klik Hapus.

Menghapus cluster GKE dan resource Google Cloud

  1. Hapus cluster GKE:

    1. Buka halaman Cluster:

      Buka Cluster

    2. Pilih kotak centang untuk gke-gpu-cluster.

    3. Klik Delete.

    4. Untuk mengonfirmasi penghapusan, ketik gke-gpu-cluster, lalu klik Delete.

  2. Hapus bucket Cloud Storage:

    1. Buka halaman Bucket:

      Buka Bucket

    2. Pilih kotak centang untuk PROJECT_ID-gke-gpu-bucket.

    3. Klik Delete.

    4. Untuk mengonfirmasi penghapusan, ketik DELETE, lalu klik Delete.

  3. Hapus akun layanan Google Cloud:

    1. Buka halaman Akun Layanan.

      Buka Akun layanan

    2. Pilih project Anda.

    3. Pilih kotak centang untuk gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.

    4. Klik Delete.

    5. Untuk mengonfirmasi penghapusan, klik Hapus.

Menghapus project

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Langkah berikutnya