Tutorial ini menunjukkan cara menjalankan workload PyTorch terdistribusi dan menyesuaikan model Gemma 4 pada slice Cloud TPU multi-host di Google Kubernetes Engine (GKE) menggunakan Ray Core, Ray Train, PyTorch Fully Sharded Data Parallel (FSDP2), dan TorchTPU.
Tutorial ini ditujukan untuk engineer machine learning (ML), admin dan operator platform, serta spesialis data dan AI yang ingin mengorkestrasi workload pelatihan PyTorch terdistribusi di slice TPU multi-host di Kubernetes. Untuk mempelajari lebih lanjut peran umum dan contoh tugas yang dirujuk dalam konten Google Cloud , lihat Peran dan tugas pengguna GKE umum.
Sebelum memulai tutorial ini, pastikan Anda memahami hal-hal berikut:
Latar belakang
Bagian ini menjelaskan teknologi utama yang digunakan dalam tutorial ini.
TPU
Tensor Processing Unit (TPU) adalah akselerator yang dirancang khusus oleh Google untuk workload machine learning. Tutorial ini mendukung TPU Trillium (v6e) dan Ironwood (TPU7x). Dalam slice TPU multi-host, beberapa host TPU berkomunikasi langsung melalui jaringan Inter-Chip Interconnect (ICI) berkecepatan tinggi, yang menyediakan High Bandwidth Memory (HBM) gabungan dan komunikasi kolektif latensi rendah yang diperlukan untuk melatih model yang melebihi kapasitas memori satu chip atau host TPU.
TorchTPU
TorchTPU adalah backend PyTorch open source untuk Cloud TPU, yang dikembangkan melalui kolaborasi antara Google dan Meta. Dengan TorchTPU, Anda dapat menjalankan model PyTorch yang ada di hardware TPU dengan perubahan kode minimal serta menskalakan workload pelatihan dan inferensi dari satu chip ke pod TPU multi-slice melalui compiler Accelerated Linear Algebra (XLA). TorchTPU menggunakan model eksekusi satu proses per perangkat melalui jaringan ICI TPU dan mendukung API PyTorch standar, termasuk eksekusi segera, torch.compile, torch.distributed, DeviceMesh, DTensor, dan Fully Sharded Data Parallel (FSDP2).
KubeRay dan Ray di TPU
KubeRay adalah operator Kubernetes untuk men-deploy dan mengelola aplikasi Ray. Mengaktifkan add-on Ray di GKE akan men-deploy operator KubeRay terkelola dan webhook TPU KubeRay. Saat KubeRay membuat Pod worker yang meminta resource google.com/tpu, webhook akan otomatis mengonfigurasi nama host Pod, Service headless, dan variabel lingkungan TPU yang diperlukan untuk koordinasi multi-host.
Ray mendeteksi topologi TPU di setiap node saat memulai dan menjadwalkan workload terdistribusi di seluruh slice TPU. Anda dapat mengorkestrasi workload TorchTPU terdistribusi di dua level:
- Ray Core menyediakan grup penempatan berbasis topologi dan penjadwalan aktor untuk loop eksekusi terdistribusi kustom, seperti komputasi paralel tensor atau pipeline reinforcement learning (RL).
- Ray Train menyediakan pelatihan paralel data dan paralel model terdistribusi terkelola, termasuk PyTorch Distributed Data Parallel (DDP), PyTorch FSDP2, dan JAX single program, multiple data (SPMD), dengan checkpointing bawaan dan pemulihan kegagalan otomatis.
Tujuan
Tutorial ini menunjukkan kepada Anda cara melakukan hal berikut:
- Buat cluster GKE di Autopilot atau Standard di TPU Trillium (v6e) atau Ironwood (TPU7x).
- Bangun image container yang melapisi library pelatihan Ray dan Hugging Face di atas image dasar TorchTPU.
- Men-deploy resource kustom RayCluster untuk menyediakan node worker TPU dan head.
- Jalankan komputasi tensor-paralel terdistribusi dengan PyTorch
DeviceMeshdanDTensordi seluruh slice TPU menggunakan Ray Core. - Menyempurnakan model Gemma 4 dengan PyTorch FSDP2 di seluruh slice TPU multi-host menggunakan Ray Train.
Biaya
Dalam tutorial ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.
Setelah menyelesaikan tugas yang dijelaskan dalam tutorial ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk informasi selengkapnya, lihat Pembersihan.
Sebelum memulai
Sebelum memulai, pastikan Anda telah melakukan tugas berikut:
- Aktifkan Artifact Registry API dan Cloud Storage API dan Google Kubernetes Engine API. Mengaktifkan API
- Untuk menggunakan Google Cloud CLI untuk tugas ini,
instal lalu
lakukan inisialisasi
gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan perintah
gcloud components update. Versi gcloud CLI yang lebih lama mungkin tidak mendukung menjalankan perintah dalam dokumen ini.
- Pastikan project Anda memiliki kuota yang cukup untuk kapasitas TPU Trillium (v6e) atau Ironwood (TPU7x) di zona yang Anda pilih. Untuk mengetahui informasi selengkapnya, lihat Kuota Cloud TPU.
- Pastikan akun Anda memiliki peran IAM berikut:
- Kubernetes Engine Admin (
roles/container.admin) - Artifact Registry Administrator (
roles/artifactregistry.admin) - Storage Admin (
roles/storage.admin)
- Kubernetes Engine Admin (
Menyiapkan lingkungan Anda
Dalam tutorial ini, Anda akan menggunakan Cloud Shell untuk mengelola resource yang dihosting di Google Cloud. Cloud Shell telah diinstal dengan software yang Anda perlukan untuk tutorial ini, termasuk kubectl, docker, python3, dan gcloud CLI.
Untuk menyiapkan lingkungan Anda dengan Cloud Shell, ikuti langkah-langkah berikut:
Di konsol Google Cloud , luncurkan sesi Cloud Shell dengan mengklik
Activate Cloud Shell di konsolGoogle Cloud . Tindakan ini akan meluncurkan sesi di panel bawah konsol Google Cloud .
Buat clone repositori
kubernetes-engine-samplesdan ubah ke direktori contoh untuk tutorial ini:git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git cd kubernetes-engine-samples/ai-ml/gke-ray/raytrain/torchtpuBuat dan aktifkan lingkungan virtual Python lokal dengan Ray CLI yang terinstal:
python3 -m venv ~/ray-env source ~/ray-env/bin/activate pip install "ray[default]==2.58.0"Untuk mendownload bobot model Gemma 4, setujui perjanjian lisensi Google di Hugging Face:
- Buka halaman model Gemma 4 di Hugging Face.
- Login dan setujui persyaratan lisensi dengan mengklik Agree and access repository.
- Di setelan akun Hugging Face Anda, buat token akses pengguna dengan izin
Read.
Tetapkan variabel lingkungan untuk project, cluster, bucket Cloud Storage, dan token Hugging Face Anda Google Cloud :
export PROJECT_ID=PROJECT_ID export CLUSTER_NAME=CLUSTER_NAME export REGION=REGION export ZONE=ZONE export ARTIFACT_REGISTRY=ARTIFACT_REGISTRY export BUCKET_NAME=BUCKET_NAME export HF_TOKEN=HF_TOKEN export IMAGE_URI=${REGION}-docker.pkg.dev/${PROJECT_ID}/${ARTIFACT_REGISTRY}/ray-torchtpu:latest gcloud config set project ${PROJECT_ID}Ganti kode berikut:
PROJECT_ID: Project ID Google Cloud Anda.CLUSTER_NAME: nama cluster GKE Anda, sepertiray-torchtpu-cluster.REGION: region tempat repositori Artifact Registry, bucket Cloud Storage, dan kapasitas TPU Anda berada.ZONE: zona tempat kapasitas TPU Anda tersedia. Untuk mengetahui region dan zona yang tersedia berdasarkan versi TPU, lihat Region dan zona TPU.ARTIFACT_REGISTRY: nama repositori Docker Artifact Registry Anda, sepertiray-torchtpu.BUCKET_NAME: nama bucket Cloud Storage Anda untuk menyimpan checkpoint Ray Train, sepertiPROJECT_ID-ray-torchtpu.HF_TOKEN: token akses Hugging Face Anda.
Membuat cluster GKE
Anda dapat menjalankan workload pelatihan TorchTPU terdistribusi di cluster GKE Autopilot atau Standard dengan add-on operator Ray terkelola yang diaktifkan.
Buat cluster GKE dan konfigurasikan kredensial untuk alat command line
kubectl:Autopilot
Buat cluster GKE Autopilot regional dengan add-on operator Ray yang diaktifkan:
gcloud container clusters create-auto ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --region=${REGION} \ --cluster-version=1.36 \ --enable-ray-operatorSaat Anda men-deploy resource kustom RayCluster di langkah berikutnya, GKE Autopilot akan otomatis menyediakan node head CPU dan slice TPU multi-host yang sesuai dengan permintaan resource Pod dan pemilih node Anda.
Konfigurasi alat command line
kubectluntuk berkomunikasi dengan cluster Anda:gcloud container clusters get-credentials ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --region=${REGION}
Standar
Buat cluster GKE Standard zona dengan node pool CPU untuk menghosting Pod head Ray, Streaming image, GKE Dataplane V2, dan Workload Identity Federation untuk GKE yang diaktifkan:
gcloud container clusters create ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --zone=${ZONE} \ --cluster-version=1.36 \ --machine-type=n2-standard-8 \ --num-nodes=1 \ --addons=RayOperator \ --enable-image-streaming \ --enable-dataplane-v2 \ --workload-pool=${PROJECT_ID}.svc.id.googKonfigurasi alat command line
kubectluntuk berkomunikasi dengan cluster Anda:gcloud container clusters get-credentials ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --zone=${ZONE}Buat node pool slice TPU multi-host 16 perangkat dengan topologi
4x4di empat host pada TPU Trillium (v6e) atau topologi2x2x2di dua host pada Ironwood (TPU7x):Trillium (v6e)
gcloud container node-pools create tpu-multi-host-pool \ --project=${PROJECT_ID} \ --cluster=${CLUSTER_NAME} \ --zone=${ZONE} \ --machine-type=ct6e-standard-4t \ --tpu-topology=4x4 \ --num-nodes=4Ironwood (TPU7x)
gcloud container node-pools create tpu-multi-host-pool \ --project=${PROJECT_ID} \ --cluster=${CLUSTER_NAME} \ --zone=${ZONE} \ --machine-type=tpu7x-standard-4t \ --tpu-topology=2x2x2 \ --num-nodes=2
Buat bucket Cloud Storage untuk menyimpan checkpoint Ray Train bersama di seluruh node TPU multi-host dan berikan akses resource Kubernetes ServiceAccount
defaultke bucket:gcloud storage buckets create gs://${BUCKET_NAME} --location=${REGION} PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") gcloud storage buckets add-iam-policy-binding gs://${BUCKET_NAME} \ --member="principal://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${PROJECT_ID}.svc.id.goog/subject/ns/default/sa/default" \ --role="roles/storage.objectAdmin"Buat Secret Kubernetes dengan token akses Hugging Face Anda agar Pod Ray dapat mendownload bobot Gemma 4 yang dibatasi:
kubectl create secret generic hf-secret \ --from-literal=hf_api_token=${HF_TOKEN}
Membangun image container
Bangun image container yang menginstal library pelatihan Ray dan Hugging Face di atas image dasar TorchTPU bawaan, yang mencakup TorchTPU dan library libtpu.
Buat repositori Docker Artifact Registry dan konfigurasi autentikasi Docker:
gcloud artifacts repositories create ${ARTIFACT_REGISTRY} \ --repository-format=docker \ --location=${REGION} gcloud auth configure-docker ${REGION}-docker.pkg.dev,us-docker.pkg.devPeriksa
Dockerfiledi direktori contoh:Pelatihan single-slice dengan class
TorchTrainerRay dan penjadwalan per chiplet di Ironwood (TPU7x) memerlukan Ray versi 2.58.0 atau yang lebih baru, dan penyesuaian Gemma 4 memerlukan librarytransformersversi 5.5.0 atau yang lebih baru.Bangun dan kirim image ke Artifact Registry:
docker build -t ${IMAGE_URI} . docker push ${IMAGE_URI}
Men-deploy resource kustom RayCluster
Men-deploy resource kustom RayCluster yang menyediakan Pod head CPU, volume /dev/shm dalam memori untuk penyimpanan objek memori bersama Ray, dan grup worker TPU multi-host.
Tinjau manifes RayCluster untuk versi TPU Anda di repositori contoh:
Trillium (v6e)
Ironwood (TPU7x)
Di Ironwood (TPU7x), setiap chip fisik berisi dua chiplet, yang menyediakan delapan core TPU logis per host empat chip. Manifes menetapkan nilai kolom
TPUke"8"di bagianresourcesdan menetapkan variabel lingkunganRAY_TPU_RESOURCE_PER_CHIPke"2"untuk memberitahukan dan menjadwalkan delapan resourceTPUlogis per host.Terapkan manifes untuk membuat resource kustom RayCluster:
Trillium (v6e)
envsubst < ray-cluster.tpu-v6e-multihost.yaml | kubectl apply -f -Ironwood (TPU7x)
envsubst < ray-cluster.tpu-v7x-multihost.yaml | kubectl apply -f -Tunggu hingga Pod head RayCluster dan semua Pod worker TPU mencapai status
Running:kubectl get pods -l ray.io/cluster=ray-torchtpu-clusterOutputnya mirip dengan hal berikut ini:
Trillium (v6e)
NAME READY STATUS RESTARTS AGE ray-torchtpu-cluster-head-pdpk6 1/1 Running 0 2m30s ray-torchtpu-cluster-v6e-16-worker-brwpc 1/1 Running 0 2m30s ray-torchtpu-cluster-v6e-16-worker-dx4w7 1/1 Running 0 2m30s ray-torchtpu-cluster-v6e-16-worker-h4d4w 1/1 Running 0 2m30s ray-torchtpu-cluster-v6e-16-worker-t2g24 1/1 Running 0 2m30sIronwood (TPU7x)
NAME READY STATUS RESTARTS AGE ray-torchtpu-cluster-head-k9x2m 1/1 Running 0 2m30s ray-torchtpu-cluster-tpu7x-16-worker-7cwpq 1/1 Running 0 2m30s ray-torchtpu-cluster-tpu7x-16-worker-m98r9 1/1 Running 0 2m30sPeriksa variabel lingkungan di salah satu Pod worker untuk mengonfirmasi bahwa webhook TPU KubeRay memasukkan koordinasi TPU multi-host dan variabel topologi TorchTPU:
kubectl get pods -l ray.io/node-type=worker \ -o=jsonpath='{range .items[0].spec.containers[0].env[*]}{.name}={.value}{"\n"}{end}' \ | grep -E "TPU_WORKER_ID|TPU_WORKER_HOSTNAMES|TPU_NAME|TORCH_TPU_TOPOLOGY|TORCH_TPU_SLICEBUILDER_ADDRESSES"Outputnya mirip dengan hal berikut ini:
Trillium (v6e)
TPU_WORKER_HOSTNAMES=v6e-16-0-0.ray-torchtpu-cluster-headless,v6e-16-0-1.ray-torchtpu-cluster-headless,v6e-16-0-2.ray-torchtpu-cluster-headless,v6e-16-0-3.ray-torchtpu-cluster-headless TORCH_TPU_TOPOLOGY=4,4,1 TORCH_TPU_SLICEBUILDER_ADDRESSES=v6e-16-0-0.ray-torchtpu-cluster-headless:8471,v6e-16-0-0.ray-torchtpu-cluster-headless:8472,v6e-16-0-0.ray-torchtpu-cluster-headless:8473,v6e-16-0-0.ray-torchtpu-cluster-headless:8474,v6e-16-0-1.ray-torchtpu-cluster-headless:8471,v6e-16-0-1.ray-torchtpu-cluster-headless:8472,v6e-16-0-1.ray-torchtpu-cluster-headless:8473,v6e-16-0-1.ray-torchtpu-cluster-headless:8474,v6e-16-0-2.ray-torchtpu-cluster-headless:8471,v6e-16-0-2.ray-torchtpu-cluster-headless:8472,v6e-16-0-2.ray-torchtpu-cluster-headless:8473,v6e-16-0-2.ray-torchtpu-cluster-headless:8474,v6e-16-0-3.ray-torchtpu-cluster-headless:8471,v6e-16-0-3.ray-torchtpu-cluster-headless:8472,v6e-16-0-3.ray-torchtpu-cluster-headless:8473,v6e-16-0-3.ray-torchtpu-cluster-headless:8474 TPU_WORKER_ID=3 TPU_NAME=v6e-16-0Ironwood (TPU7x)
TPU_WORKER_HOSTNAMES=tpu7x-16-0-0.ray-torchtpu-cluster-headless,tpu7x-16-0-1.ray-torchtpu-cluster-headless TORCH_TPU_TOPOLOGY=2,2,2,2 TORCH_TPU_SLICEBUILDER_ADDRESSES=tpu7x-16-0-0.ray-torchtpu-cluster-headless:8471,tpu7x-16-0-0.ray-torchtpu-cluster-headless:8472,tpu7x-16-0-0.ray-torchtpu-cluster-headless:8473,tpu7x-16-0-0.ray-torchtpu-cluster-headless:8474,tpu7x-16-0-0.ray-torchtpu-cluster-headless:8475,tpu7x-16-0-0.ray-torchtpu-cluster-headless:8476,tpu7x-16-0-0.ray-torchtpu-cluster-headless:8477,tpu7x-16-0-0.ray-torchtpu-cluster-headless:8478,tpu7x-16-0-1.ray-torchtpu-cluster-headless:8471,tpu7x-16-0-1.ray-torchtpu-cluster-headless:8472,tpu7x-16-0-1.ray-torchtpu-cluster-headless:8473,tpu7x-16-0-1.ray-torchtpu-cluster-headless:8474,tpu7x-16-0-1.ray-torchtpu-cluster-headless:8475,tpu7x-16-0-1.ray-torchtpu-cluster-headless:8476,tpu7x-16-0-1.ray-torchtpu-cluster-headless:8477,tpu7x-16-0-1.ray-torchtpu-cluster-headless:8478 TPU_WORKER_ID=1 TPU_NAME=tpu7x-16-0Buat sesi penerusan port ke layanan head Ray:
kubectl port-forward svc/ray-torchtpu-cluster-head-svc 8265:8265 >/dev/null 2>&1 &Anda dapat memeriksa node worker TPU dan label
ray.io/tpu-*yang terdeteksi otomatis di tab Cluster di Ray Dashboard.
Menjalankan paralelisme tensor terdistribusi dengan Ray Core
Ray Core menyediakan fungsi slice_placement_group dalam modul ray.util.tpu untuk memesan slice TPU multi-host yang utuh dan class PlacementGroupSchedulingStrategy untuk menjadwalkan satu aktor Ray per perangkat TPU logis di seluruh slice.
Tinjau skrip
ray_core_collectives.pydi repositori contoh:Skrip ini menjalankan paralelisme tensor terdistribusi di seluruh slice TPU dalam tiga langkah:
- Fungsi
slice_placement_groupmencadangkan slice TPU 16 perangkat dan menjadwalkan satu aktorTorchTPUSliceWorkerdi setiap perangkat TPU. - Setiap aktor menghitung peringkat globalnya dari indeks host dan ID perangkat lokal, lalu menginisialisasi grup proses
tpu_dist. - Fungsi
init_device_meshdanparallelize_modulemelakukan sharding pada lapisan feed-forward di 16 perangkat TPU, memverifikasi output terhadap referensi CPU perangkat tunggal, dan menjalankan kolektifall_reducemelalui ICI.
- Fungsi
Kirim tugas Ray Core untuk versi TPU Anda:
Trillium (v6e)
ray job submit \ --address http://localhost:8265 \ --working-dir . \ --runtime-env-json '{"excludes": ["ray-env", ".git", "*.whl"]}' \ -- python3 ray_core_collectives.py --topology=4x4 --accelerator-type=TPU-V6EIronwood (TPU7x)
ray job submit \ --address http://localhost:8265 \ --working-dir . \ --runtime-env-json '{"excludes": ["ray-env", ".git", "*.whl"]}' \ -- python3 ray_core_collectives.py --topology=2x2x2 --accelerator-type=TPU-V7XOutputnya mirip dengan hal berikut ini:
Trillium (v6e)
Rank 0 (worker_id=0, local_rank=0, ip=10.72.3.20): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 1 (worker_id=0, local_rank=1, ip=10.72.3.20): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 2 (worker_id=0, local_rank=2, ip=10.72.3.20): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 3 (worker_id=0, local_rank=3, ip=10.72.3.20): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 4 (worker_id=1, local_rank=0, ip=10.72.14.20): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 5 (worker_id=1, local_rank=1, ip=10.72.14.20): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 6 (worker_id=1, local_rank=2, ip=10.72.14.20): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 7 (worker_id=1, local_rank=3, ip=10.72.14.20): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 8 (worker_id=2, local_rank=0, ip=10.72.7.20): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 9 (worker_id=2, local_rank=1, ip=10.72.7.20): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 10 (worker_id=2, local_rank=2, ip=10.72.7.20): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 11 (worker_id=2, local_rank=3, ip=10.72.7.20): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 12 (worker_id=3, local_rank=0, ip=10.72.6.20): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 13 (worker_id=3, local_rank=1, ip=10.72.6.20): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 14 (worker_id=3, local_rank=2, ip=10.72.6.20): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 15 (worker_id=3, local_rank=3, ip=10.72.6.20): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] All 16 TorchTPU ranks verified DTensor TP parity (max_abs_diff=0.002470) and all_reduce sum = 136.0 ------------------------------------------ Job 'raysubmit_HFTkKrjSnfza3ZFD' succeeded ------------------------------------------Ironwood (TPU7x)
Rank 0 (worker_id=0, local_rank=0, ip=172.16.14.6): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 1 (worker_id=0, local_rank=1, ip=172.16.14.6): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 2 (worker_id=0, local_rank=2, ip=172.16.14.6): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 3 (worker_id=0, local_rank=3, ip=172.16.14.6): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 4 (worker_id=0, local_rank=4, ip=172.16.14.6): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 5 (worker_id=0, local_rank=5, ip=172.16.14.6): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 6 (worker_id=0, local_rank=6, ip=172.16.14.6): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 7 (worker_id=0, local_rank=7, ip=172.16.14.6): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 8 (worker_id=1, local_rank=0, ip=172.16.15.7): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 9 (worker_id=1, local_rank=1, ip=172.16.15.7): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 10 (worker_id=1, local_rank=2, ip=172.16.15.7): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 11 (worker_id=1, local_rank=3, ip=172.16.15.7): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 12 (worker_id=1, local_rank=4, ip=172.16.15.7): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 13 (worker_id=1, local_rank=5, ip=172.16.15.7): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 14 (worker_id=1, local_rank=6, ip=172.16.15.7): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] Rank 15 (worker_id=1, local_rank=7, ip=172.16.15.7): all_reduce_sum=[136.0, 136.0, 136.0, 136.0] All 16 TorchTPU ranks verified DTensor TP parity (max_abs_diff=0.002470) and all_reduce sum = 136.0 ------------------------------------------ Job 'raysubmit_MrJbAe3hvARBcBN2' succeeded ------------------------------------------
Menyesuaikan model Gemma 4 dengan Ray Train dan PyTorch FSDP2
Class TorchTrainer Ray Train mengotomatiskan pemesanan slice TPU, penempatan worker, dan inisialisasi torch.distributed di seluruh slice TPU multi-host.
Tinjau skrip
ray_train_llm_finetune.pydi repositori contoh, yang melakukan fine-tuning pada modelgoogle/gemma-4-E2B-itdi set data instruksidatabricks/databricks-dolly-15k:Skrip ini mengonfigurasi class
TorchTrainerdengan komponen berikut:- Class
ScalingConfigmengonfigurasi topologi worker terdistribusi untuk tugas pelatihan. Menetapkan parameteruse_tpu=True,num_workers=16,topology, danaccelerator_typeakan mereservasi slice TPU 16 perangkat dan menjadwalkan satu worker per TPU core. - Class
TorchConfigmengonfigurasi grup prosestorch.distributeddi seluruh worker. Menetapkan parameterbackend="tpu_dist"akan menghubungkan ke-16 worker melalui jaringan ICI TPU sebelum fungsitrain_funcberjalan. - Fungsi
create_dataloadermendownload dan melakukan tokenisasi pada set data petunjuk, mengelompokkan urutan token dengan objekDataLoaderPyTorch, dan memanggil fungsiray.train.torch.prepare_data_loadersehingga setiap worker menerima shard yang tidak saling tumpang tindih dari setiap batch global di perangkat TPU yang ditetapkan. - Fungsi
train_funcmemuat model dalam presisibfloat16dan memanggil fungsifully_shardPyTorch FSDP2 pada setiap blok feed-forward dan model root untuk melakukan sharding parameter, gradien, dan status pengoptimal di 16 core TPU. - Class
Checkpointdan fungsiray.train.reportmengumpulkan kamus status model lengkap pada peringkat 0 di akhir setiap epoch dan mengupload checkpoint ke bucket Cloud Storage Anda.
- Class
Kirim tugas fine-tuning FSDP2
TorchTraineruntuk versi TPU Anda:Trillium (v6e)
ray job submit \ --address http://localhost:8265 \ --working-dir . \ --runtime-env-json '{"excludes": ["ray-env", ".git", "*.whl"]}' \ -- python3 ray_train_llm_finetune.py \ --topology=4x4 \ --accelerator-type=TPU-V6E \ --storage-path=gs://${BUCKET_NAME}/ray_train_torchtpuIronwood (TPU7x)
ray job submit \ --address http://localhost:8265 \ --working-dir . \ --runtime-env-json '{"excludes": ["ray-env", ".git", "*.whl"]}' \ -- python3 ray_train_llm_finetune.py \ --topology=2x2x2 \ --accelerator-type=TPU-V7X \ --storage-path=gs://${BUCKET_NAME}/ray_train_torchtpuOutputnya mirip dengan hal berikut ini:
Trillium (v6e)
Starting Ray Train FSDP2 SFT job: model=google/gemma-4-E2B-it, topology=4x4, accelerator_type=TPU-V6E, num_workers=16 (TrainController pid=5407) Attempting to start training worker group of size 16 with the following resources: [{'TPU': 1, 'accelerator_type:TPU-V6E': 0.001}] * 16 (RayTrainWorker pid=19733, ip=10.72.3.20) Setting up process group for: env:// [rank=0, world_size=16] (RayTrainWorker pid=19733, ip=10.72.3.20) Epoch 1/3 | loss=3.1402 | epoch_time=28.17s | tokens/s=18613.5 (RayTrainWorker pid=19733, ip=10.72.3.20) Checkpoint successfully created at: Checkpoint(filesystem=gcs, path=my-project-ray-torchtpu/ray_train_torchtpu/torchtpu_gemma4_fsdp2_sft_1791864427/checkpoint_2026-10-13_04-08-10.762175) (RayTrainWorker pid=19733, ip=10.72.3.20) Epoch 2/3 | loss=2.3318 | epoch_time=26.07s | tokens/s=20112.8 (RayTrainWorker pid=19733, ip=10.72.3.20) Checkpoint successfully created at: Checkpoint(filesystem=gcs, path=my-project-ray-torchtpu/ray_train_torchtpu/torchtpu_gemma4_fsdp2_sft_1791864427/checkpoint_2026-10-13_04-10-02.548088) (RayTrainWorker pid=19733, ip=10.72.3.20) Epoch 3/3 | loss=2.2050 | epoch_time=25.52s | tokens/s=20545.2 (RayTrainWorker pid=19733, ip=10.72.3.20) Checkpoint successfully created at: Checkpoint(filesystem=gcs, path=my-project-ray-torchtpu/ray_train_torchtpu/torchtpu_gemma4_fsdp2_sft_1791864427/checkpoint_2026-10-13_04-11-48.701853) Training completed! Final metrics: {'epoch': 3, 'loss': 2.205, 'epoch_time_s': 25.52, 'tokens_per_s': 20545.2} Saved checkpoint: Checkpoint(filesystem=gcs, path=my-project-ray-torchtpu/ray_train_torchtpu/torchtpu_gemma4_fsdp2_sft_1791864427/checkpoint_2026-10-13_04-11-48.701853) ------------------------------------------ Job 'raysubmit_zbm4pnFZitA1YECA' succeeded ------------------------------------------Ironwood (TPU7x)
Starting Ray Train FSDP2 SFT job: model=google/gemma-4-E2B-it, topology=2x2x2, accelerator_type=TPU-V7X, num_workers=16 (TrainController pid=1162) Attempting to start training worker group of size 16 with the following resources: [{'TPU': 1, 'accelerator_type:TPU-V7X': 0.001}] * 16 (RayTrainWorker pid=257, ip=172.16.26.6) Setting up process group for: env:// [rank=0, world_size=16] (RayTrainWorker pid=257, ip=172.16.26.6) Epoch 1/3 | loss=3.1407 | epoch_time=26.28s | tokens/s=19953.3 (RayTrainWorker pid=257, ip=172.16.26.6) Checkpoint successfully created at: Checkpoint(filesystem=gcs, path=my-project-ray-torchtpu/ray_train_torchtpu/torchtpu_gemma4_fsdp2_sft_1791867004/checkpoint_2026-10-13_04-52-00.026930) (RayTrainWorker pid=257, ip=172.16.26.6) Epoch 2/3 | loss=2.3235 | epoch_time=16.68s | tokens/s=31429.9 (RayTrainWorker pid=257, ip=172.16.26.6) Checkpoint successfully created at: Checkpoint(filesystem=gcs, path=my-project-ray-torchtpu/ray_train_torchtpu/torchtpu_gemma4_fsdp2_sft_1791867004/checkpoint_2026-10-13_04-53-33.533341) (RayTrainWorker pid=257, ip=172.16.26.6) Epoch 3/3 | loss=2.1964 | epoch_time=16.98s | tokens/s=30884.6 (RayTrainWorker pid=257, ip=172.16.26.6) Checkpoint successfully created at: Checkpoint(filesystem=gcs, path=my-project-ray-torchtpu/ray_train_torchtpu/torchtpu_gemma4_fsdp2_sft_1791867004/checkpoint_2026-10-13_04-55-01.508219) Training completed! Final metrics: {'epoch': 3, 'loss': 2.1964, 'epoch_time_s': 16.98, 'tokens_per_s': 30884.6} Saved checkpoint: Checkpoint(filesystem=gcs, path=my-project-ray-torchtpu/ray_train_torchtpu/torchtpu_gemma4_fsdp2_sft_1791867004/checkpoint_2026-10-13_04-55-01.508219) ------------------------------------------ Job 'raysubmit_zSNnCXhHkwKiSmJh' succeeded ------------------------------------------Output pelatihan menampilkan hal berikut:
- Epoch 1 mencakup kompilasi grafik XLA awal. Epoch 2 dan 3 menggunakan kembali file yang dapat dieksekusi yang di-cache dari
/dev/shm/torch_tpu_cache, sehingga mencapai lebih dari 20.000 token per detik di TPU Trillium (v6e) dan 31.000 token per detik di Ironwood (TPU7x). - Kerugian entropi silang global yang disinkronkan di semua 16 peringkat worker FSDP2 menurun dari 3,14 di Epoch 1 menjadi 2,20 di Epoch 3 di tiga epoch fine-tuning pada set data instruksi
databricks/databricks-dolly-15k. - Di akhir setiap epoch, peringkat 0 mengumpulkan kamus status model lengkap dan mengupload checkpoint ke bucket Cloud Storage Anda, dengan mempertahankan checkpoint dengan loss terendah seperti yang dikonfigurasi dalam objek
CheckpointConfig(num_to_keep=1, checkpoint_score_attribute="loss", checkpoint_score_order="min").
- Epoch 1 mencakup kompilasi grafik XLA awal. Epoch 2 dan 3 menggunakan kembali file yang dapat dieksekusi yang di-cache dari
Mengamati performa workload
Untuk memantau pemakaian TPU TensorCore, penggunaan HBM, dan metrik cluster Ray di Cloud Monitoring, lihat Mengumpulkan dan melihat log serta metrik untuk cluster Ray di GKE dan Melihat metrik TPU di Dasbor Ray.
Mengakses Dasbor Ray
Untuk memeriksa status aktor Ray, grup penempatan, dan tugas pelatihan di Dasbor Ray bawaan, ikuti langkah-langkah berikut:
Jika penerusan port ke layanan head Ray belum berjalan, mulai di latar belakang:
kubectl port-forward svc/ray-torchtpu-cluster-head-svc 8265:8265 >/dev/null 2>&1 &Di Cloud Shell, klik
Web Preview dan pilih Preview on port 8265, atau buka
http://localhost:8265di browser lokal Anda.Klik tab Jobs, Cluster, dan Metrics untuk memeriksa log worker, status grup penempatan, label node TPU, dan grafik TPU Utilization by Node.
Pembersihan
Agar akun Google Cloud Anda tidak dikenai biaya untuk resource yang digunakan dalam tutorial ini, hapus resource kustom RayCluster, cluster GKE, bucket Cloud Storage, dan repositori Artifact Registry:
Hentikan proses penerusan port latar belakang dan hapus resource kustom RayCluster dan Secret Kubernetes:
pkill -f "kubectl port-forward" || true kubectl delete raycluster ray-torchtpu-cluster kubectl delete secret hf-secret --ignore-not-foundHapus cluster GKE:
Autopilot
gcloud container clusters delete ${CLUSTER_NAME} \ --region=${REGION}Standar
gcloud container clusters delete ${CLUSTER_NAME} \ --zone=${ZONE}Hapus bucket Cloud Storage dan konten checkpoint-nya:
gcloud storage rm --recursive gs://${BUCKET_NAME}Hapus repositori Artifact Registry:
gcloud artifacts repositories delete ${ARTIFACT_REGISTRY} \ --location=${REGION}
Langkah berikutnya
- Pelajari lebih lanjut PyTorch di Cloud TPU.
- Pelajari dokumentasi TorchTPU.
- Pelajari cara menyajikan LLM di TPU multi-host dengan Ray dan TorchTPU.
- Pelajari cara mengoptimalkan pelatihan AI di TPU dengan DWS dan Kueue.
- Baca Tentang TPU di GKE.
- Pelajari dokumentasi Ray Train.