Tutorial ini menunjukkan cara menyesuaikan model Gemma 3 menggunakan framework Ray pada cluster GKE multi-node. Cluster ini menggunakan dua instance virtual machine (VM) A4, yang masing-masing memiliki delapan GPU NVIDIA B200 terpasang.
Konten tutorial ini dibagi menjadi dua bagian:
- Menyiapkan Cluster Ray di atas cluster Autopilot GKE.
- Menjalankan tugas pelatihan terdistribusi, menggunakan 2 instance A4, dengan masing-masing 8 GPU B200.
Tutorial ini ditujukan untuk engineer, peneliti, administrator, dan operator platform machine learning (ML), serta spesialis data dan AI yang tertarik untuk mendistribusikan beban kerja AI di beberapa node dan GPU.
Tujuan
Akses model Gemma 3 menggunakan Hugging Face.
Siapkan lingkungan Anda.
Buat cluster GKE Autopilot dengan Ray Operator yang diinstal di dalamnya.
Konfigurasi Cluster Ray di cluster GKE untuk menerima Ray Jobs.
Mengonfigurasi dan menjalankan Tugas Ray yang menyetel model Gemma 3 berdasarkan input visual.
Pantau workload Anda.
Jalankan pembersihan.
Biaya
Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Sebelum memulai
- 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.
-
Instal Google Cloud CLI.
-
Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.
-
Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:
gcloud init -
Buat atau pilih Google Cloud project.
Peran yang diperlukan untuk memilih atau membuat project
- Pilih project: Memilih project tidak memerlukan peran IAM tertentu—Anda dapat memilih project mana pun yang telah diberi peran.
-
Membuat project: Untuk membuat project, Anda memerlukan peran Pembuat Project
(
roles/resourcemanager.projectCreator), yang berisi izinresourcemanager.projects.create. Pelajari cara memberikan peran.
-
Buat Google Cloud project:
gcloud projects create PROJECT_ID
Ganti
PROJECT_IDdengan nama untuk Google Cloud project yang Anda buat. -
Pilih project Google Cloud yang Anda buat:
gcloud config set project PROJECT_ID
Ganti
PROJECT_IDdengan nama project Google Cloud Anda.
-
Verifikasi bahwa penagihan diaktifkan untuk project Google Cloud Anda.
Aktifkan API yang diperlukan:
Peran yang diperlukan untuk mengaktifkan API
Untuk mengaktifkan API, Anda memerlukan izin
serviceusage.services.enable. Jika Anda membuat project, kemungkinan Anda sudah memiliki izin ini melalui peran Pemilik (roles/owner). Jika tidak, Anda bisa mendapatkan izin ini melalui peran Admin Penggunaan Layanan (roles/serviceusage.serviceUsageAdmin). Pelajari cara memberikan peran.gcloud services enable compute.googleapis.com logging.googleapis.com cloudresourcemanager.googleapis.com servicenetworking.googleapis.com container.googleapis.com
-
Instal Google Cloud CLI.
-
Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.
-
Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:
gcloud init -
Buat atau pilih Google Cloud project.
Peran yang diperlukan untuk memilih atau membuat project
- Pilih project: Memilih project tidak memerlukan peran IAM tertentu—Anda dapat memilih project mana pun yang telah diberi peran.
-
Membuat project: Untuk membuat project, Anda memerlukan peran Pembuat Project
(
roles/resourcemanager.projectCreator), yang berisi izinresourcemanager.projects.create. Pelajari cara memberikan peran.
-
Buat Google Cloud project:
gcloud projects create PROJECT_ID
Ganti
PROJECT_IDdengan nama untuk Google Cloud project yang Anda buat. -
Pilih project Google Cloud yang Anda buat:
gcloud config set project PROJECT_ID
Ganti
PROJECT_IDdengan nama project Google Cloud Anda.
-
Verifikasi bahwa penagihan diaktifkan untuk project Google Cloud Anda.
Aktifkan API yang diperlukan:
Peran yang diperlukan untuk mengaktifkan API
Untuk mengaktifkan API, Anda memerlukan izin
serviceusage.services.enable. Jika Anda membuat project, kemungkinan Anda sudah memiliki izin ini melalui peran Pemilik (roles/owner). Jika tidak, Anda bisa mendapatkan izin ini melalui peran Admin Penggunaan Layanan (roles/serviceusage.serviceUsageAdmin). Pelajari cara memberikan peran.gcloud services enable compute.googleapis.com logging.googleapis.com cloudresourcemanager.googleapis.com servicenetworking.googleapis.com container.googleapis.com
-
Memberikan peran ke akun pengguna Anda. Jalankan perintah berikut satu kali untuk setiap peran IAM berikut:
roles/compute.admin, roles/iam.serviceAccountUser, roles/file.editor, roles/storage.admin, roles/container.clusterAdmin, roles/serviceusage.serviceUsageAdmingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Ganti kode berikut:
PROJECT_ID: Project ID Anda.USER_IDENTIFIER: ID untuk akun pengguna Anda. Misalnya,myemail@example.com.ROLE: Peran IAM yang Anda berikan ke akun pengguna Anda.
- Aktifkan akun layanan default untuk project Google Cloud Anda:
gcloud iam service-accounts enable PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --project=PROJECT_ID
Ganti PROJECT_NUMBER dengan nomor project Anda. Untuk meninjau nomor project Anda, lihat Mendapatkan project yang sudah ada.
- Berikan peran Editor (
roles/editor) ke akun layanan default:gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role=roles/editor
- Buat kredensial autentikasi lokal untuk akun pengguna Anda:
gcloud auth application-default login
- Login atau buat akun Hugging Face.
Mengakses Gemma 3 menggunakan Hugging Face
Untuk menggunakan Hugging Face guna mengakses Gemma 3, lakukan langkah-langkah berikut:
Salin dan simpan nilai token
read access. Anda akan menggunakannya nanti dalam tutorial ini.
Menyiapkan lingkungan Anda
Siapkan lingkungan Anda dengan mengonfigurasi setelan yang diperlukan dan menetapkan variabel lingkungan.
Jalankan perintah berikut:
Ganti kode berikut:
YOUR_PROJECT_ID: nama Google Cloud project tempat Anda ingin membuat cluster GKE.YOUR_RESERVATION_ID: URL pemesanan yang ingin Anda gunakan untuk membuat cluster. Berdasarkan project tempat pemesanan berada, tentukan salah satu nilai berikut:- Pemesanan ada di project Anda: Tentukan nama pemesanan (misalnya,
my-reservation). - Pemesanan ada di project lain: Tentukan jalur lengkap dalam format
projects/RESERVATION_PROJECT_ID/reservations/RESERVATION_NAME.
- Pemesanan ada di project Anda: Tentukan nama pemesanan (misalnya,
YOUR_REGION: region tempat Anda ingin membuat cluster GKE. Anda hanya dapat membuat cluster di region tempat reservasi Anda berada.YOUR_CLUSTER_NAME: nama cluster GKE yang akan dibuat.HUGGING_FACE_TOKEN: token Hugging Face yang Anda buat di langkah sebelumnya.YOUR_RAY_SA: nama Akun Layanan di dalam cluster Kubernetes.YOUR_GSA_NAME: nama Akun Layanan Google.YOUR_GCS_BUCKET: nama bucket tempat Anda menyimpan hasil dari titik pemeriksaan pelatihan.
Membuat cluster GKE dalam mode Autopilot
Untuk membuat cluster GKE dalam mode Autopilot, jalankan perintah berikut:
Mungkin perlu waktu beberapa saat untuk menyelesaikan pembuatan cluster GKE. Untuk memverifikasi apakah Google Cloud telah selesai membuat cluster Anda, buka Kubernetes clusters di konsol Google Cloud .
Buat secret Kubernetes untuk kredensial Hugging Face
Di Cloud Shell, untuk membuat secret Kubernetes bagi kredensial Hugging Face, lakukan hal berikut:
Konfigurasi
kubectluntuk terhubung ke cluster Anda:Buat secret Kubernetes untuk menyimpan token Hugging Face Anda:
Buat bucket Cloud Storage
Jika Anda ingin menggunakan bucket baru untuk menyimpan artefak pelatihan, jalankan perintah berikut:
Jika ingin menggunakan bucket yang sudah ada, Anda dapat melewati langkah ini. Namun, Anda harus memastikan bahwa bucket Anda berada di region yang sama dengan cluster Anda.
Membuat akun layanan IAM
Di Cloud Shell, untuk membuat akun layanan IAM (juga dikenal sebagai akun layanan Google, atau GSA) dan memberikan izin kepadanya untuk mengakses bucket Cloud Storage Anda, lakukan hal berikut:
Buat akun layanan IAM:
Berikan peran Storage Admin (
roles/storage.admin) ke akun layanan IAM Anda untuk bucket Cloud Storage Anda:
Buat Akun Layanan Kubernetes
Di Cloud Shell, buat Akun Layanan Kubernetes dan konfigurasi Workload Identity untuk memberikan akses pod Ray ke resource Google Cloud :
Buat Akun Layanan Kubernetes:
Ikat Akun Layanan Kubernetes Anda ke akun layanan IAM yang sebelumnya Anda buat untuk mengaktifkan Workload Identity:
Anotasikan Akun Layanan Kubernetes Anda dengan alamat email akun layanan IAM:
Menyimpan kode pelatihan sebagai ConfigMap
Untuk menghindari kebutuhan menyematkan skrip pelatihan ke dalam image container, Anda menyimpannya sebagai ConfigMap di cluster. ConfigMap ini dipasang ke sistem file Pod, yang memungkinkan Anda memperbarui skrip pelatihan tanpa harus membuat ulang seluruh cluster Ray.
Untuk menyimpan skrip pelatihan sebagai ConfigMap di cluster, selesaikan langkah-langkah berikut:
Buat direktori dengan nama
code, lalu di direktori tersebut, buat file dengan namavision_train.py.Salin kode berikut ke dalam file
vision_train.py:Simpan file.
Buat objek ConfigMap di cluster Anda:
Untuk memperbarui skrip pelatihan, Anda menjalankan kembali perintah sebelumnya. Mungkin perlu waktu satu menit sebelum perubahan diterapkan ke semua pod.
Mengonfigurasi Cluster Ray
Untuk membuat Cluster Ray di cluster GKE Anda, simpan YAML berikut sebagai file dengan nama
ray_cluster.yaml.Terapkan definisi YAML ini ke cluster Anda menggunakan perintah berikut:
Flag$RESERVATIONotomatis diganti dengan nama yang Anda konfigurasi sebagai variabel lingkungan.Ray Operator membuat pod raylet, yang pada gilirannya memicu penskalaan otomatis cluster untuk menyediakan node yang sesuai bagi pod tersebut. Tiga pod dibuat di cluster Anda: satu node head, dan dua worker node. Node pekerja dilengkapi dengan GPU B200.
Untuk memverifikasi bahwa ketiga pod sudah siap, jalankan perintah berikut:
Daftar pod Ray Cluster yang siap mirip dengan berikut ini:NAME READY STATUS RESTARTS AGE gemma3-tuning-gpu-group-worker-s4h8f 2/2 Running 0 16m gemma3-tuning-gpu-group-worker-stg5f 2/2 Running 0 5m34s gemma3-tuning-head-zbdvp 2/2 Running 0 16m
Menjadwalkan tugas pelatihan
Simpan kode berikut sebagai file
ray_job.yaml:Kirimkan definisi RayJob ke RayCluster Anda:
Periksa apakah Pod baru ada di cluster Anda:
Catat nama lengkap Pod
test-ray-job-yang Anda lihat di output. Nama ini unik untuk tugas Anda.Periksa progres pelatihan Anda. Ganti
gemma-training-ray-job-UNIQUE_IDdengan nama Pod unik yang Anda catat di langkah sebelumnya.Output yang Anda lihat akan mirip dengan berikut ini:
2025-08-20 08:29:34,966 INFO cli.py:41 -- Job submission server address: http://gemma3-tuning-head-svc.default.svc.cluster.local:8265 2025-08-20 08:29:34,991 SUCC cli.py:65 -- ----------------------------------------------- 2025-08-20 08:29:34,991 SUCC cli.py:66 -- Job 'test-ray-job-82mm7' submitted successfully 2025-08-20 08:29:34,991 SUCC cli.py:67 -- ----------------------------------------------- 2025-08-20 08:29:34,992 INFO cli.py:291 -- Next steps 2025-08-20 08:29:34,992 INFO cli.py:292 -- Query the logs of the job: 2025-08-20 08:29:34,992 INFO cli.py:294 -- ray job logs test-ray-job-82mm7 2025-08-20 08:29:34,992 INFO cli.py:296 -- Query the status of the job: 2025-08-20 08:29:34,992 INFO cli.py:298 -- ray job status test-ray-job-82mm7 2025-08-20 08:29:34,992 INFO cli.py:300 -- Request the job to be stopped: 2025-08-20 08:29:34,992 INFO cli.py:302 -- ray job stop test-ray-job-82mm7 2025-08-20 08:29:35,003 INFO cli.py:312 -- Tailing logs until the job exits (disable with --no-wait): 2025-08-20 08:29:34,982 INFO job_manager.py:531 -- Runtime env is setting up. Starting training task! Commencing training! 2025-08-20 08:30:08,498 INFO worker.py:1606 -- Using address 10.76.0.17:6379 set in the environment variable RAY_ADDRESS 2025-08-20 08:30:08,506 INFO worker.py:1747 -- Connecting to existing Ray cluster at address: 10.76.0.17:6379... 2025-08-20 08:30:08,527 INFO worker.py:1918 -- Connected to Ray cluster. View the dashboard at 10.76.0.17:8265 2025-08-20 08:30:08,701 INFO tune.py:253 -- Initializing Ray automatically. For cluster usage or custom Ray initialization, call `ray.init(...)` before `<FrameworkTrainer>(...)`. 2025-08-20 08:30:08,951 WARNING tune_controller.py:2132 -- The maximum number of pending trials has been automatically set to the number of available cluster CPUs, which is high (519 CPUs/pending trials). If you're running an experiment with a large number of trials, this could lead to scheduling overhead. In this case, consider setting the `TUNE_MAX_PENDING_TRIALS_PG` environment variable to the desired maximum number of concurrent pending trials. 2025-08-20 08:30:08,953 WARNING tune_controller.py:2132 -- The maximum number of pending trials has been automatically set to the number of available cluster CPUs, which is high (519 CPUs/pending trials). If you're running an experiment with a large number of trials, this could lead to scheduling overhead. In this case, consider setting the `TUNE_MAX_PENDING_TRIALS_PG` environment variable to the desired maximum number of concurrent pending trials. View detailed results here: YOUR_GCS_BUCKET/gemma_vision_train_2025_08_20_08_30_07 To visualize your results with TensorBoard, run: `tensorboard --logdir /tmp/ray/session_2025-08-20_04-43-14_215096_1/artifacts/2025-08-20_08-30-08/gemma_vision_train_2025_08_20_08_30_07/driver_artifacts` Training started with configuration: ╭──────────────────────────────────────────────────────────────────────╮ │ Training config │ ├──────────────────────────────────────────────────────────────────────┤ │ train_loop_config/dataset_name ...-descriptions-vlm │ │ train_loop_config/gcs_bucket ...-bucket-yooo-west │ │ train_loop_config/gradient_accumulation_steps 4 │ │ train_loop_config/learning_rate 0.0002 │ │ train_loop_config/logging_steps 10 │ │ train_loop_config/lora_alpha 16 │ │ train_loop_config/lora_dropout 0.05 │ │ train_loop_config/lora_r 16 │ │ train_loop_config/max_seq_length 512 │ │ train_loop_config/model_id google/gemma-3-4b-it │ │ train_loop_config/num_train_epochs 3 │ │ train_loop_config/output_dir ...-4b-seo-optimized │ │ train_loop_config/per_device_train_batch_size 1 │ │ train_loop_config/push_to_hub False │ │ train_loop_config/save_steps 100 │ │ train_loop_config/save_strategy epoch │ ╰──────────────────────────────────────────────────────────────────────╯ (RayTrainWorker pid=45455, ip=10.76.0.71) Setting up process group for: env:// [rank=0, world_size=16] (TorchTrainer pid=45197, ip=10.76.0.71) Started distributed worker processes: (TorchTrainer pid=45197, ip=10.76.0.71) - (node_id=4c934ab2f646a578b03cc335586f30b943e811b645526a74c50bfca1, ip=10.76.0.71, pid=45455) world_rank=0, local_rank=0, node_rank=0 (TorchTrainer pid=45197, ip=10.76.0.71) - (node_id=4c934ab2f646a578b03cc335586f30b943e811b645526a74c50bfca1, ip=10.76.0.71, pid=45450) world_rank=1, local_rank=1, node_rank=0 (TorchTrainer pid=45197, ip=10.76.0.71) - (node_id=4c934ab2f646a578b03cc335586f30b943e811b645526a74c50bfca1, ip=10.76.0.71, pid=45454) world_rank=2, local_rank=2, node_rank=0 (TorchTrainer pid=45197, ip=10.76.0.71) - (node_id=4c934ab2f646a578b03cc335586f30b943e811b645526a74c50bfca1, ip=10.76.0.71, pid=45448) world_rank=3, local_rank=3, node_rank=0 (TorchTrainer pid=45197, ip=10.76.0.71) - (node_id=4c934ab2f646a578b03cc335586f30b943e811b645526a74c50bfca1, ip=10.76.0.71, pid=45453) world_rank=4, local_rank=4, node_rank=0 (TorchTrainer pid=45197, ip=10.76.0.71) - (node_id=4c934ab2f646a578b03cc335586f30b943e811b645526a74c50bfca1, ip=10.76.0.71, pid=45452) world_rank=5, local_rank=5, node_rank=0 (TorchTrainer pid=45197, ip=10.76.0.71) - (node_id=4c934ab2f646a578b03cc335586f30b943e811b645526a74c50bfca1, ip=10.76.0.71, pid=45451) world_rank=6, local_rank=6, node_rank=0 (TorchTrainer pid=45197, ip=10.76.0.71) - (node_id=4c934ab2f646a578b03cc335586f30b943e811b645526a74c50bfca1, ip=10.76.0.71, pid=45449) world_rank=7, local_rank=7, node_rank=0 (TorchTrainer pid=45197, ip=10.76.0.71) - (node_id=c0db52b44f891f3d6a1cedcbea4c6beb2c8434c66ef414dc15e65743, ip=10.76.0.135, pid=45729) world_rank=8, local_rank=0, node_rank=1 (TorchTrainer pid=45197, ip=10.76.0.71) - (node_id=c0db52b44f891f3d6a1cedcbea4c6beb2c8434c66ef414dc15e65743, ip=10.76.0.135, pid=45726) world_rank=9, local_rank=1, node_rank=1 (TorchTrainer pid=45197, ip=10.76.0.71) - (node_id=c0db52b44f891f3d6a1cedcbea4c6beb2c8434c66ef414dc15e65743, ip=10.76.0.135, pid=45728) world_rank=10, local_rank=2, node_rank=1 (TorchTrainer pid=45197, ip=10.76.0.71) - (node_id=c0db52b44f891f3d6a1cedcbea4c6beb2c8434c66ef414dc15e65743, ip=10.76.0.135, pid=45727) world_rank=11, local_rank=3, node_rank=1 (TorchTrainer pid=45197, ip=10.76.0.71) - (node_id=c0db52b44f891f3d6a1cedcbea4c6beb2c8434c66ef414dc15e65743, ip=10.76.0.135, pid=45725) world_rank=12, local_rank=4, node_rank=1 (TorchTrainer pid=45197, ip=10.76.0.71) - (node_id=c0db52b44f891f3d6a1cedcbea4c6beb2c8434c66ef414dc15e65743, ip=10.76.0.135, pid=45724) world_rank=13, local_rank=5, node_rank=1 (TorchTrainer pid=45197, ip=10.76.0.71) - (node_id=c0db52b44f891f3d6a1cedcbea4c6beb2c8434c66ef414dc15e65743, ip=10.76.0.135, pid=45723) world_rank=14, local_rank=6, node_rank=1 (TorchTrainer pid=45197, ip=10.76.0.71) - (node_id=c0db52b44f891f3d6a1cedcbea4c6beb2c8434c66ef414dc15e65743, ip=10.76.0.135, pid=45722) world_rank=15, local_rank=7, node_rank=1 ... Training finished iteration 3 at 2025-08-20 08:40:43. Total running time: 10min 34s ╭─────────────────────────────────────────╮ │ Training result │ ├─────────────────────────────────────────┤ │ checkpoint_dir_name checkpoint_000002 │ │ time_this_iter_s 152.6374 │ │ time_total_s 525.88585 │ │ training_iteration 3 │ │ epoch 2.75294 │ │ grad_norm 47.27161 │ │ learning_rate 0.0002 │ │ loss 22.5275 │ │ mean_token_accuracy 0.90325 │ │ num_tokens 1583017. │ │ step 60 │ ╰─────────────────────────────────────────╯ ... Training completed after 3 iterations at 2025-08-20 08:40:52. Total running time: 10min 43s 2025-08-20 08:40:53,113 INFO tune.py:1009 -- Wrote the latest version of all result files and experiment state to 'YOUR_GCS_BUCKET/gemma_vision_train_2025_08_20_08_30_07' in 0.1663s. 2025-08-20 08:40:58,304 SUCC cli.py:65 -- ---------------------------------- 2025-08-20 08:40:58,305 SUCC cli.py:66 -- Job 'test-ray-job-82mm7' succeeded 2025-08-20 08:40:58,305 SUCC cli.py:67 -- ----------------------------------Memantau workload Anda
Anda dapat menggunakan dasbor di Ray untuk memantau beban kerja yang dijadwalkan di cluster Anda.
Untuk mengakses dasbor ini, Anda perlu menyiapkan penerusan port ke cluster dengan menjalankan perintah berikut di jendela terminal baru:
Buka link berikut di browser Anda:
http://localhost:8265.Secara opsional, jika Anda menggunakan Cloud Shell, setelah menjalankan perintah pada langkah sebelumnya, Anda dapat mengklik tombol Web Preview.
Pilih opsi Ubah port, masukkan
8265, lalu klik Ubah dan Pratinjau. Dasbor Ray akan terbuka di tab baru.
Pembersihan
Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.
Menghapus resource
Untuk menghapus Cluster Ray dan melepaskan node yang didukung GPU, jalankan perintah berikut:
GKE akan otomatis menurunkan skala cluster Anda dan melepaskan mesin A4 yang digunakan oleh Ray.Untuk menghapus seluruh cluster GKE, jalankan perintah berikut:
Untuk menghapus seluruh bucket Cloud Storage beserta semua isinya, jalankan perintah berikut:
Menghapus project Anda
Menghapus Google Cloud project:
gcloud projects delete PROJECT_ID