Ringkasan Multislice Cloud TPU
Cloud TPU Multislice adalah teknologi penskalaan performa full stack yang memungkinkan tugas pelatihan menggunakan beberapa slice TPU dalam satu Pod atau pada slice di beberapa Pod dengan paralelisme data sederhana. Dengan chip TPU v4, ini berarti tugas pelatihan dapat menggunakan lebih dari 4.096 chip dalam satu proses. Untuk tugas pelatihan yang memerlukan kurang dari 4.096 chip, satu irisan dapat menawarkan performa terbaik. Namun, beberapa irisan yang lebih kecil akan lebih mudah tersedia, sehingga memungkinkan waktu startup yang lebih cepat ketika Multislice digunakan dengan irisan yang lebih kecil.
Saat di-deploy dalam konfigurasi Multislice, chip TPU di setiap slice berkomunikasi melalui inter-chip-interconnect (ICI). Chip TPU di berbagai irisan berkomunikasi dengan mentransfer data ke CPU (host) yang kemudian mengirimkan data melalui jaringan pusat data (DCN).
Developer tidak perlu menulis kode untuk menerapkan komunikasi DCN antar-slice. Compiler XLA membuat kode tersebut untuk Anda dan tumpang tindih dengan komunikasi dengan komputasi untuk performa maksimum.
Konsep
- Jenis akselerator
- Bentuk setiap slice TPU yang terdiri dari Multislice. Setiap
irisan dalam permintaan multislice memiliki jenis akselerator yang sama. Jenis akselerator terdiri dari jenis TPU (v4 atau v5e) yang diikuti dengan jumlah TensorCore. Misalnya,
v4-128
menentukan TPU v4 dengan 128 TensorCore. - Perbaikan otomatis
- Saat slice mengalami peristiwa pemeliharaan, preemption, atau kegagalan hardware, Cloud TPU akan membuat slice baru. Dalam kasus yang jarang terjadi, jika resource tidak cukup untuk membuat slice baru, pembuatan tidak akan selesai sampai hardware tersedia. Setelah slice baru dibuat, semua slice lain di lingkungan Multislice akan dimulai ulang sehingga pelatihan dapat dilanjutkan.Dengan skrip startup yang dikonfigurasi dengan benar, skrip pelatihan dapat otomatis diluncurkan kembali tanpa intervensi pengguna, memuat, dan melanjutkan dari checkpoint terbaru.
- Dataset
- Data yang digunakan oleh model untuk pelatihan atau inferensi.
- Jaringan Pusat Data (DCN)
- Jaringan dengan latensi lebih tinggi dengan throughput lebih rendah (jika dibandingkan dengan ICI) yang menghubungkan slice TPU dalam konfigurasi Multislice.
- Penjadwalan geng
- Saat semua slice TPU disediakan bersama, pada saat yang sama, menjamin bahwa semua slice atau tidak berhasil disediakan.
- Host
- Host adalah komputer fisik yang menjalankan VM. Host dapat menjalankan maksimal empat VM sekaligus. Setiap VM memiliki TPU khusus.
- Inferensi
- Memuat model machine learning terlatih ke host dan membuat prediksi pada data.
- Interchip interconnect (ICI)
- Link internal berkecepatan tinggi dan berlatensi rendah yang menghubungkan TPU di dalam Pod TPU.
- Multiiris
- Dua atau lebih potongan chip TPU yang dapat berkomunikasi melalui DCN.
- Node
- Dalam konteks Multislice, node mengacu pada satu slice TPU. Setiap irisan TPU dalam Multislice diberi ID node.
- Pod
- Kumpulan chip TPU yang terhubung melalui antarmuka jaringan ICI khusus. Dengan Pod, Anda dapat mendistribusikan beban pemrosesan di beberapa TPU.
- Resource dalam antrean (QR)
- Representasi resource TPU, yang digunakan untuk mengantrekan dan mengelola permintaan untuk lingkungan TPU slice tunggal atau Multislice.
- Skrip startup
- Skrip startup Compute Engine standar yang dijalankan setiap kali VM di-booting atau dimulai ulang. Untuk Multislice, parameter ini ditentukan dalam permintaan pembuatan QR. Untuk mengetahui informasi selengkapnya tentang skrip startup Cloud TPU, baca Mengelola resource TPU.
- Irisan TPU
- Subbagian logis dari Pod TPU yang terdiri dari chip TPU. Semua chip dalam slice berkomunikasi satu sama lain menggunakan jaringan ICI.
- VM TPU
- Virtual machine yang menjalankan Linux yang memiliki akses ke TPU yang mendasarinya. Untuk TPU v4, setiap VM TPU memiliki akses langsung ke empat chip. Terkadang kita menyebut VM TPU sebagai pekerja.
- Tensor
- Struktur data yang digunakan untuk merepresentasikan data multidimensi dalam model machine learning.
- Tensor processing unit (TPU)
- Chip akselerasi ML yang dikembangkan secara internal Google. Fitur ini dirancang untuk menawarkan komputasi yang cepat dan hemat daya untuk tugas-tugas machine learning utama seperti perkalian matriks.
- Jenis kapasitas Cloud TPU
TPU dapat dibuat dari tiga jenis kapasitas (lihat Opsi Penggunaan di bagian Cara kerja penetapan harga TPU) :
- Reservasi: Menargetkan kuota yang direservasi. Untuk menggunakan kuota yang dicadangkan, Anda harus memiliki perjanjian reservasi dengan Google. Gunakan flag
--reserved
saat membuat resource. - Preemptible: Menargetkan kuota yang dapat dihentikan. Resource Anda mungkin di-preempt untuk memberi ruang bagi permintaan tugas dengan prioritas yang lebih tinggi. Gunakan flag
--best-effort
saat membuat resource. - On-demand: Menarget kuota on demand, yang tidak memerlukan reservasi dan tidak akan di-preempt. Permintaan TPU akan diantrekan ke antrean kuota on demand yang ditawarkan oleh Cloud TPU. Ketersediaan resource tidak dijamin. Dipilih secara default, tidak diperlukan tanda.
- Reservasi: Menargetkan kuota yang direservasi. Untuk menggunakan kuota yang dicadangkan, Anda harus memiliki perjanjian reservasi dengan Google. Gunakan flag
Mulai
Jika Anda belum pernah menggunakan TPU, mulailah dengan menginstal Google Cloud CLI, dan menyiapkan lingkungan Cloud TPU Anda. Untuk menggunakan Multislice, resource TPU Anda harus dikelola sebagai Resource yang Diantrekan.
Jika Anda adalah pengguna TPU v4 lama dan memiliki reservasi, Anda mungkin perlu memigrasikan reservasi ke sistem reservasi baru. Untuk mengetahui informasi selengkapnya, hubungi perwakilan akun Google Cloud Anda.
Contoh pendahuluan
Tutorial ini menggunakan kode dari repo GitHub MaxText. MaxText adalah LLM dasar berperforma tinggi, skalabel secara arbitrer, open source, dan sudah teruji dengan baik yang ditulis di Python dan Jax. MaxText dirancang untuk berlatih secara efisien di Cloud TPU.
Kode di shardings.py
dirancang untuk membantu Anda mulai bereksperimen dengan berbagai opsi
paralelisme. Misalnya, paralelisme data, paralelisme data dengan sharding (FSDP),
dan paralelisme tensor. Kode diskalakan dari lingkungan satu slice ke Multislice.
Paralelisme ICI
ICI mengacu pada interkoneksi berkecepatan tinggi yang menghubungkan TPU dalam satu
irisan. Sharding ICI berkaitan dengan sharding dalam sebuah slice. shardings.py
menyediakan tiga parameter paralelisme ICI:
ici_data_parallelism
ici_fsdp_parallelism
ici_tensor_parallelism
Nilai yang Anda tetapkan untuk parameter ini akan menentukan jumlah shard untuk setiap metode paralelisme.
Input ini harus dibatasi agar
ici_data_parallelism * ici_fsdp_parallelism * ici_tensor_parallelism
sama
dengan jumlah chip dalam irisan.
Tabel berikut menunjukkan contoh input pengguna untuk paralelisme ICI untuk empat chip yang tersedia di v4-8:
ici_data_parallelism | ici_fsdp_parallelism | ici_tensor_parallelism | |
FSDP 4 Arah | 1 | 4 | 1 |
Paralelisme Tensor 4 arah | 1 | 1 | 4 |
FSDP 2 arah + paralelisme Tensor 2 arah | 1 | 2 | 2 |
Perlu diperhatikan bahwa ici_data_parallelism
harus dibiarkan sebagai 1 dalam sebagian besar kasus karena
jaringan ICI cukup cepat untuk hampir selalu lebih memilih FSDP daripada paralelisme data.
Contoh ini mengasumsikan bahwa Anda telah memahami cara menjalankan kode pada satu irisan TPU, seperti dalam artikel Menjalankan penghitungan di VM Cloud TPU menggunakan JAX.
Contoh ini menunjukkan cara menjalankan shardings.py
pada satu irisan.
Menyiapkan lingkungan:
$ gcloud auth login $ gcloud config set project your-project-id $ gcloud config set compute/zone your-zone
Membuat kunci SSH untuk
gcloud
. Sebaiknya biarkan sandi kosong (tekan enter dua kali setelah menjalankan perintah berikut). Jika Anda diminta bahwa filegoogle_compute_engine
sudah ada, ganti versi yang ada.$ ssh-keygen -f ~/.ssh/google_compute_engine
Sediakan TPU Anda dengan perintah berikut:
$ gcloud alpha compute tpus queued-resources \ create your-qr-id \ --accelerator-type your-accelerator-type \ --runtime-version tpu-ubuntu2204-base \ --node-id qr-id \ [--reserved |--best-effort]
Deskripsi flag perintah
your-qr-id
- String yang ditentukan pengguna yang mengidentifikasi permintaan QR.
accelerator-type
- Jenis akselerator menentukan versi dan ukuran Cloud TPU yang ingin Anda buat. Untuk mengetahui informasi selengkapnya tentang jenis akselerator yang didukung untuk setiap versi TPU, lihat versi TPU.
runtime-version
- [Versi software Cloud TPU](/tpu/docs/supported-tpu-configurations#tpu_software_version).
node-id
- ID resource TPU yang akan dibuat sebagai respons terhadap permintaan QR.
reserved
- Gunakan kuota yang dicadangkan saat membuat slice.
best-effort
- Gunakan kuota upaya terbaik saat membuat slice [Default].
Google Cloud CLI tidak mendukung semua opsi pembuatan QR, seperti tag. Untuk mengetahui informasi selengkapnya, lihat Membuat QR.
Tunggu hingga QR berada dalam status
ACTIVE
yang berarti node pekerja berada dalam statusREADY
. Setelah penyediaan QR dimulai, mungkin perlu waktu satu hingga lima menit untuk menyelesaikan, bergantung pada ukuran QR. Anda dapat memeriksa status permintaan QR menggunakan perintah berikut:$ gcloud compute tpus queued-resources \ list --filter=your-qr-id
Slice v4-8 memiliki satu VM TPU. Hubungkan ke VM TPU menggunakan SSH:
$ gcloud compute tpus tpu-vm ssh your-qr-id
Clone MaxText (yang mencakup
shardings.py
) ke VM TPU Anda.Dalam direktori repositori MaxText, jalankan skrip penyiapan untuk menginstal JAX dan dependensi lainnya pada slice TPU Anda. Skrip penyiapan membutuhkan waktu beberapa menit untuk dijalankan.
$ bash setup.sh
Jalankan perintah berikut untuk menjalankan
shardings.py
di slice TPU Anda.$ python3 pedagogical_examples/shardings.py \ --ici_fsdp_parallelism 4 \ --batch_size 131072 \ --embedding_dimension 2048
Anda dapat melihat hasilnya di log. TPU Anda akan mencapai sekitar 260 TFLOP per detik atau pemanfaatan FLOP lebih dari 90%secara mengesankan. Dalam hal ini, kita telah memilih kira-kira batch maksimum yang sesuai dengan High Bandwidth Memory (HBM) TPU.
Jangan ragu untuk mempelajari strategi sharding lain melalui ICI. Misalnya, Anda dapat mencoba kombinasi berikut:
$ python3 pedagogical_examples/shardings.py \ --ici_tensor_parallelism 4 \ --batch_size 131072 \ --embedding_dimension 2048
Hapus slice QR dan TPU jika sudah selesai. Anda harus menjalankan langkah-langkah pembersihan ini dari lingkungan tempat Anda menyiapkan slice (jalankan
exit
terlebih dahulu untuk keluar dari sesi SSH). Proses penghapusan akan memerlukan waktu dua hingga lima menit, dan dapat dijalankan di latar belakang dengan flag--async
opsional.$ gcloud compute tpus queued-resources delete your-qr-id --force (--async)
Sharding multislice menggunakan paralelisme DCN
Skrip shardings.py
menggunakan tiga parameter yang menentukan paralelisme DCN, sesuai dengan jumlah shard dari setiap jenis paralelisme data:
- dcn_data_parallelism
- dcn_fsdp_parallelism
- dcn_tensor_parallelism
Nilai parameter ini harus dibatasi agar
dcn_data_parallelism * dcn_fsdp_parallelism * dcn_tensor_parallelism
sama
dengan jumlah irisan.
Sebagai contoh untuk dua irisan, gunakan --dcn_data_parallelism = 2
.
dcn_data_parallelism | dcn_fsdp_parallelism | dcn_tensor_parallelism | # irisan | |
Paralelisme data 2 arah | 2 | 1 | 1 | 2 |
dcn_tensor_parallelism
harus selalu ditetapkan ke 1
karena DCN tidak cocok
untuk sharding tersebut. Untuk beban kerja LLM standar pada chip v4,
dcn_fsdp_parallelism
juga harus ditetapkan ke 1
, sehingga
dcn_data_parallelism
harus ditetapkan ke jumlah slice, tetapi cara ini
bergantung pada aplikasi.
Meningkatkan jumlah irisan (dengan asumsi ukuran irisan dan batch per irisan konstan), Anda akan meningkatkan jumlah paralelisme data.
Menjalankan shardings.py
di lingkungan Multislice
Anda dapat menjalankan shardings.py
di lingkungan Multislice menggunakan multihost_runner.py
atau dengan menjalankan shardings.py
di setiap VM TPU. Di sini kita menggunakan
multihost_runner.py
. Langkah-langkah berikut sangat mirip dengan
Memulai: Eksperimen Cepat di Beberapa slices
dari repositori MaxText, hanya saja di sini kami menjalankan shardings.py
, bukan
LLM yang lebih kompleks di train.py
.
Alat multihost_runner.py
dioptimalkan untuk eksperimen cepat, yang berulang kali menggunakan kembali TPU yang sama. Karena skrip multihost_runner.py
bergantung pada koneksi SSH yang tahan lama, kami tidak merekomendasikannya untuk tugas yang berjalan lama.
Jika Anda ingin menjalankan tugas yang lebih lama (misalnya, jam atau hari), sebaiknya gunakan multihost_job.py
.
Dalam tutorial ini, kami menggunakan istilah runner untuk menunjukkan mesin tempat Anda
menjalankan skrip multihost_runner.py
. Kami menggunakan istilah pekerja untuk menunjukkan
VM TPU yang membentuk bagian Anda. Anda dapat menjalankan multihost_runner.py
di mesin lokal atau VM Compute Engine apa pun dalam project yang sama dengan slice Anda. Menjalankan
multihost_runner.py
pada pekerja tidak didukung.
multihost_runner.py
otomatis terhubung ke pekerja TPU menggunakan SSH.
Dalam contoh ini, kita menjalankan shardings.py
pada dua slice v4-16, total empat VM dan 16 chip TPU. Anda dapat mengubah contoh untuk dijalankan di lebih banyak TPU.
Menyiapkan lingkungan Anda
Clone MaxText pada mesin runner Anda.
Buka direktori repositori.
Buat kunci SSH untuk
gcloud
. Sebaiknya biarkan sandi kosong (tekan enter dua kali setelah menjalankan perintah berikut). Jika Anda diminta bahwa filegoogle_compute_engine
sudah ada, pilih untuk tidak mempertahankan versi yang sudah ada.$ ssh-keygen -f ~/.ssh/google_compute_engine
Tambahkan variabel lingkungan untuk menetapkan jumlah slice TPU ke
2
.$ export SLICE_COUNT=2
Buat lingkungan Multislice menggunakan
queued-resources create
.Perintah berikut menunjukkan cara membuat TPU Multislice v4. Untuk menggunakan v5e, tentukan
accelerator-type
v5e (misalnyav5litepod-16
) danruntime-version
v5e (v2-alpha-tpuv5-lite
).$ gcloud alpha compute tpus queued-resources
create your-qr-id
--accelerator-type=your-accelerator-type
--runtime-version=tpu-vm-runtime-version
--node-count=node-count
--node-prefix=your-qr-id
[--reserved|--best-effort]Deskripsi flag perintah
your-qr-id
- String yang ditentukan pengguna yang mengidentifikasi permintaan QR.
accelerator-type
- Jenis akselerator menentukan versi dan ukuran Cloud TPU yang ingin Anda buat. Untuk mengetahui informasi selengkapnya tentang jenis akselerator yang didukung untuk setiap versi TPU, lihat versi TPU.
runtime-version
- Versi software Cloud TPU.
node-count
- Jumlah irisan yang akan dibuat.
node-prefix
- Awalan yang digunakan untuk membuat nama setiap irisan. Angka ditambahkan ke awalan untuk setiap irisan. Misalnya, jika Anda menetapkan
node-prefix
kemySlice
, irisan akan diberi nama:mySlice-0
,mySlice-1
, dan seterusnya. reserved
- Gunakan kuota yang dicadangkan saat membuat slice.
best-effort
- Gunakan kuota upaya terbaik saat membuat slice [Default].
Saat penyediaan QR dimulai, mungkin perlu waktu hingga lima menit untuk menyelesaikannya, bergantung pada ukuran QR. Tunggu hingga Queued Resource (QR) berada dalam status
ACTIVE
. Anda dapat memeriksa status permintaan QR menggunakan perintah berikut:$ gcloud compute tpus queued-resources list \ --filter=your-qr-id
Tindakan ini akan menghasilkan output yang terlihat seperti ini:
NAME ZONE NODE_COUNT ACCELERATOR_TYPE STATE ... que-res-id us-central2-b 4 v4-16 ACTIVE ...
Hubungi perwakilan akun Google Cloud Anda jika status QR menampilkan status
WAITING_FOR_RESOURCES
atauPROVISIONING
selama lebih dari 15 menit.Instal dependensi.
$ python3 multihost_runner.py \ --TPU_PREFIX=your-qr-id \ --COMMAND="bash setup.sh"
Menjalankan
shardings.py
pada setiap pekerja menggunakanmultihost_runner.py
.$ python3 multihost_runner.py \ --TPU_PREFIX=your-qr-id \ --COMMAND="python3 pedagogical_examples/shardings.py \ --dcn_data_parallelism $SLICE_COUNT \ --ici_fsdp_parallelism 8 \ --batch_size 131072 \ --embedding_dimension 2048"
Anda akan melihat performa sekitar 230 TFLOP per detik dalam file log.
Bersihkan TPU dan QR saat selesai. Proses penghapusan akan memerlukan waktu dua hingga lima menit, dan dapat dijalankan di latar belakang dengan flag
--async
opsional.
Menskalakan workload ke Multislice
Sebelum menjalankan model Anda di lingkungan Multislice, buat perubahan kode berikut:
- Gunakan jax.experimental.mesh_utils.create_hybrid_device_mesh, bukan jax.experimental.mesh_utils.create_device_mesh saat membuat mesh Anda.
Ini akan menjadi satu-satunya perubahan kode yang diperlukan saat beralih ke Multislice. Untuk mencapai performa tinggi, DCN harus dipetakan ke data paralel, sumbu paralel data yang di-sharding sepenuhnya, atau sumbu paralel pipeline. Pertimbangan performa dan strategi sharding dibahas secara lebih mendetail di Melakukan Sharding dengan Multislice untuk Performa Maksimal.
Untuk memvalidasi bahwa kode Anda dapat mengakses semua perangkat, Anda dapat menyatakan bahwa len(jax.devices())
sama dengan jumlah chip di lingkungan Multislice. Misalnya, jika menggunakan empat irisan v4-16
, Anda memiliki
delapan chip per irisan * 4 irisan, sehingga len(jax.devices())
akan menampilkan 32.
Memilih ukuran irisan untuk lingkungan Multislice
Untuk mendapatkan kecepatan linear, tambahkan irisan baru yang berukuran sama dengan potongan
yang ada. Misalnya, jika Anda menggunakan irisan v4-512
, Multislice akan
mencapai performa sekitar dua kali lipat dengan menambahkan slice v4-512
kedua
dan menggandakan ukuran batch global Anda. Untuk informasi selengkapnya, lihat
Melakukan Sharding dengan Multislice untuk Performa Maksimal.
Menjalankan Tugas Anda pada beberapa irisan
Ada tiga pendekatan berbeda untuk menjalankan beban kerja kustom di lingkungan Multislice:
- Menggunakan skrip runner eksperimen,
multihost_runner.py
- Menggunakan skrip runner produksi,
multihost_job.py
- Menggunakan pendekatan manual
Skrip runner eksperimen
Skrip multihost_runner.py
mendistribusikan kode ke lingkungan Multislice yang ada, dan menjalankan perintah Anda di setiap host, menyalin kembali log, dan melacak status error setiap perintah. Skrip multihost_runner.py
didokumentasikan dalam
README MaxText.
Karena mempertahankan koneksi SSH persisten, multihost_runner.py
hanya cocok untuk eksperimen berukuran sedang yang relatif singkat. Anda dapat
menyesuaikan langkah-langkah dalam tutorial multihost_runner.py
untuk konfigurasi workload dan hardware.
Skrip runner produksi
Untuk tugas produksi yang memerlukan ketahanan terhadap kegagalan hardware dan preemption lainnya, sebaiknya langsung integrasikan dengan Create Queued Resource API. Sebagai contoh praktis, kami menyediakan multihost_job.py
,
yang memicu panggilan API Resource Antrean yang Dibuat dengan skrip startup
yang sesuai untuk menjalankan pelatihan dan melanjutkan pelatihan saat terjadi preemption. Skrip multihost_job.py
didokumentasikan dalam README MaxText.
Karena harus menyediakan resource untuk setiap run, multihost_job.py
tidak
menyediakan siklus iterasi secepat multihost_runner.py
.
Pendekatan manual
Sebaiknya gunakan atau sesuaikan multihost_runner.py atau multihost_job.py untuk menjalankan beban kerja kustom Anda dalam konfigurasi Multislice. Namun, jika Anda lebih memilih untuk menyediakan dan mengelola lingkungan menggunakan perintah QR secara langsung, lihat Mengelola Lingkungan Multislice.
Mengelola lingkungan Multislice
Untuk menyediakan dan mengelola QR secara manual tanpa menggunakan alat yang disediakan dalam repo MaxText, baca bagian berikut.
Buat QR
Tetapkan variabel lingkungan berikut sebelum menyediakan kapasitas:
$ export your-qr-id=your-queued-resource-id $ export PROJECT=your-project-name $ export ZONE=us-central2-b $ export NETWORK_NAME=your-network-name $ export SUBNETWORK_NAME=your-subnetwork-name $ export RUNTIME_VERSION=tpu-ubuntu2204-base $ export ACCELERATOR_TYPE=v4-16 $ export SLICE_COUNT=4 $ export STARTUP_SCRIPT="#!/bin/bash\n ..." $ gcloud config set project project-name $ gcloud config set compute/zone zone
Input | Deskripsi |
your-qr-id | ID QR yang ditetapkan pengguna. |
PROYEK | Nama Project Google Cloud |
ZONA | us-central2-b |
NETWORK_NAME | Nama jaringan VPC. |
SUBNETWORK_NAME | Nama subnet di jaringan VPC |
RUNTIME_VERSION | {i>tpu-ubuntu2204-base<i} |
ACCELERATOR_TYPE | v4-16 |
EXAMPLE_TAG_1, EXAMPLE_TAG_2... | Tag yang digunakan untuk mengidentifikasi sumber atau target yang valid untuk firewall jaringan |
SLICE_COUNT | Jumlah irisan. Dibatasi maksimum 256 irisan. |
STARTUP_SCRIPT | Jika ditambahkan ke permintaan pembuatan, skrip startup dapat dijalankan setiap kali slice TPU disediakan atau dimulai ulang dan jika slice TPU diperbaiki atau direset. |
Buat permintaan QR menggunakan gcloud
$ gcloud alpha compute tpus queued-resources \ create ${your-qr-id} \ --project your-project-id \ --zone your-zone \ --node-count ${SLICE_COUNT} \ --accelerator-type ${ACCELERATOR_TYPE} \ --runtime-version ${RUNTIME_VERSION} \ --network ${NETWORK_NAME} \ --subnetwork ${SUBNETWORK_NAME} \ --tags ${EXAMPLE_TAG_1},${EXAMPLE_TAG_2} \ --metadata=startup-script='${STARTUP_SCRIPT}' [--reserved|--best-effort]
Deskripsi flag perintah
your-qr-id
- String yang ditentukan pengguna yang mengidentifikasi permintaan QR.
project
- String yang ditentukan pengguna yang mengidentifikasi permintaan QR.
zone
- Zona Google Cloud tempat pembuatan QR.
node-count
- Jumlah irisan yang akan dibuat.
accelerator-type
- Jenis akselerator menentukan versi dan ukuran Cloud TPU yang ingin Anda buat. Untuk mengetahui informasi selengkapnya tentang jenis akselerator yang didukung untuk setiap versi TPU, lihat versi TPU.
runtime-version
- Versi software Cloud TPU.
network
- Nama jaringan VPC tempat untuk melampirkan resource TPU.
subnetwork
- Nama subnetwork VPC tempat untuk memasang resource TPU.
reserved
- Gunakan kuota yang dicadangkan saat membuat slice.
best-effort
- Gunakan kuota upaya terbaik saat membuat slice [Default].
Pastikan Anda memiliki kuota masing-masing sebelum memilih --reserved
, atau
--best_effort
, atau kuota on-demand default. Untuk mengetahui informasi mengenai jenis kuota, lihat Kebijakan Kuota.
Buat permintaan QR menggunakan curl
Buat file bernama queued-resource-req.json
dan salin JSON berikut ke dalamnya.
{ "guaranteed": { "reserved": true }, "tpu": { "node_spec": [ { "parent": "projects/your-project-number/locations/your-zone", "node": { "accelerator_type": "accelerator-type", "runtime_version": "tpu-vm-runtime-version", "network_config": { "network": "your-network-name", "subnetwork": "your-subnetwork-name", "enable_external_ips": true }, "tags" : ["example-tag-1"] "metadata": { "startup-script": "your-startup-script" } }, "multi_node_params": { "node_count": slice-count, "node_id_prefix": "your-queued-resource-id" } } ] } }
- your-project-number - Nomor project Google Cloud Anda
- your-zone - Zona tempat Anda ingin membuat QR
- accelerator-type - Versi dan ukuran irisan tunggal
- tpu-vm-runtime-version - Versi runtime VM TPU
- your-network-name - Opsional, jaringan tempat QR akan dilampirkan
- your-subnetwork-name - Opsional, subnetwork tempat QR akan dilampirkan
- example-tag-1 - Opsional, string tag arbitrer
- your-startup-script - Skrip startup yang akan dijalankan saat QR dialokasikan
- slice-count - Jumlah slice TPU di lingkungan Multislice Anda
- your-qr-id - ID yang disediakan pengguna untuk QR
Untuk informasi selengkapnya, lihat dokumentasi REST Queued Resource API untuk semua opsi yang tersedia.
Untuk menggunakan kapasitas yang dapat dihentikan, ganti:
"guaranteed": { "reserved": true }
dengan "best_effort": {}
Atau hapus garis untuk menggunakan kapasitas on demand default.
Kirim permintaan pembuatan QR dengan payload JSON:
$ curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" -d @queuedresourcereq.json https://tpu.googleapis.com/v2alpha1/projects/your-project-id/locations/your-zone/queuedResources\?queued_resource_id\=your-qr-id
- your-project-id - ID Project Google Cloud Anda
- your-zone - Zona tempat Anda ingin membuat QR
- your-qr-id - ID yang disediakan pengguna untuk QR
Responsnya akan terlihat seperti berikut:
{ "name": "projects/<your-project-id>/locations/<your-zone>/operations/operation-<your-qr-guid>", "metadata": { "@type": "type.googleapis.com/google.cloud.common.OperationMetadata", "createTime": "2023-11-01T00:17:05.742546311Z", "target": "projects/<your-project-id>/locations/<your-zone>/queuedResources/<your-qa-id>", "verb": "create", "cancelRequested": false, "apiVersion": "v2alpha1" }, "done": false }
Gunakan nilai GUID di akhir nilai string untuk atribut name
guna mendapatkan
informasi tentang permintaan QR.
Mengambil status QR
Untuk mendapatkan status permintaan QR, gunakan perintah berikut:
$ curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://tpu.googleapis.com/v2/projects/your-project-id/locations/your-zone/operations/operation-your-qr-guid
- your-project-id - ID Project Google Cloud Anda
- your-zone - Zona tempat membuat QR
- your-qr-guid - GUID yang mengikuti
name
dalam output dari permintaan pembuatan QR.
Respons perintah ini berisi status operasi:
{ "name": "projects/<your-project-id>/locations/<your-zone>/operations/operation-<your-qa-guid>, "metadata": {...}, "done": true, "response": { "@type": "type.googleapis.com/google.cloud.tpu.v2.QueuedResource", ... "state": { "state": "WAITING_FOR_RESOURCES" } } }
Jika QR berhasil dibuat ("done = true")
, status dalam kolom
response
akan menjadi WAITING_FOR_RESOURCES
atau FAILED
.
Jika QR berada dalam status WAITING_FOR_RESOURCES
, artinya QR telah
diantrekan dan akan memulai penyediaan jika ada resource yang cukup. Jika QR
berada dalam status FAILED
, alasan kegagalan akan ada di output. Untuk informasi
selengkapnya tentang kemungkinan status lainnya, lihat
Panduan pengguna resource yang diantrekan.
Setelah operasi selesai, gunakan describe QR untuk memantau tahap QR.
Pada skenario yang jarang terjadi, Anda mungkin menemukan QR dalam status FAILED
, sementara beberapa
irisan berupa ACTIVE
. Jika hal ini terjadi, hapus resource yang telah dibuat, dan coba lagi dalam beberapa menit, atau hubungi tim Cloud TPU untuk menyelesaikan masalah tersebut.
SSH dan menginstal dependensi
Menjalankan kode JAX pada slice Pod TPU
menjelaskan cara terhubung ke VM TPU menggunakan SSH dalam satu irisan. Untuk terhubung ke semua VM TPU di lingkungan Multislice melalui SSH dan menginstal dependensi, gunakan perintah gcloud
berikut:
$ gcloud compute tpus queued-resources ssh ${your-qr-id} \ --zone your-zone \ --node=all \ --worker=all \ --command="command-to-run" --batch-size=4
Perintah gcloud
ini mengirimkan perintah yang ditentukan ke semua pekerja dan node dalam
QR menggunakan SSH. Perintah ini dikelompokkan ke dalam kelompok yang terdiri dari empat orang dan dikirim
secara bersamaan. Batch perintah berikutnya dikirim saat batch saat ini
menyelesaikan eksekusi. Jika terjadi kegagalan dengan salah satu perintah, pemrosesan
akan dihentikan, dan tidak ada batch lebih lanjut yang dikirim. Untuk informasi selengkapnya, lihat
Referensi API resource yang diantrekan.
Jika jumlah slice yang Anda gunakan melebihi batas threading komputer lokal (juga disebut batas pengelompokan), Anda akan mengalami deadlock. Sebagai contoh, anggaplah batas pengelompokan pada mesin lokal Anda adalah 64. Jika Anda mencoba menjalankan skrip pelatihan di lebih dari 64 slice, misalnya 100, perintah SSH akan membagi slice menjadi beberapa bagian. Skrip ini akan menjalankan skrip pelatihan pada batch pertama dari 64 slice dan menunggu hingga skrip selesai sebelum menjalankan skrip di batch lainnya yang terdiri dari 36 slice. Namun, batch pertama dari 64 irisan tidak dapat
selesai hingga 36 irisan yang tersisa mulai menjalankan skrip, sehingga menyebabkan
deadlock.
Untuk mencegah skenario ini, Anda dapat menjalankan skrip pelatihan di latar belakang pada setiap VM dengan menambahkan ampersand (&
) ke perintah skrip yang Anda tentukan dengan tanda --command
. Saat Anda melakukannya, setelah memulai skrip pelatihan pada batch slice pertama, kontrol akan segera kembali ke perintah SSH. Kemudian, perintah SSH dapat mulai menjalankan skrip pelatihan pada batch 36 slice yang tersisa. Anda harus menyalurkan aliran data stdout
dan stderr
dengan tepat saat menjalankan perintah di latar belakang. Untuk meningkatkan
paralelisme dalam QR yang sama, Anda dapat memilih bagian tertentu menggunakan parameter
--node
.
Penyiapan jaringan
Pastikan slice TPU dapat saling berkomunikasi dengan menjalankan langkah-langkah berikut.
Instal JAX pada setiap irisan. Untuk mengetahui informasi selengkapnya, baca
Menjalankan kode JAX pada slice Pod TPU. Nyatakan bahwa
len(jax.devices())
sama dengan jumlah chip di lingkungan
Multislice Anda. Untuk melakukannya, pada setiap irisan, jalankan:
$ python3 -c 'import jax; print(jax.devices())'
Jika Anda menjalankan kode ini di empat irisan v4-16, ada delapan chip per
irisan dan empat irisan, total 32 chip (perangkat) harus ditampilkan
oleh jax.devices()
.
Mencantumkan QR
Anda dapat melihat status QR menggunakan perintah queued-resources list
:
$ gcloud compute tpus queued-resources list NAME ZONE NODE_COUNT ACCELERATOR_TYPE STATE ... que-res-id us-central2-b 4 v4-16 ACTIVE ...
Menjelaskan QR
Untuk melihat konfigurasi dan status QR yang mendetail, gunakan
QR API yang dideskripsikan. Anda dapat memanggil API ini menggunakan gcloud
atau curl
.
Menggunakan gcloud
:
$ gcloud compute tpus queued-resources describe ${your-qr-id} ...state: state: ACTIVE ...
Menggunakan curl
:
$ curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://tpu.googleapis.com/v2/projects/your-project-id/locations/your-zone/queuedResources/${your-qr-id} { "name": your-queued-res, "tpu": { "nodeSpec": [ { ... // node 1 }, { ... // node 2 }, ... ] }, ... "state": "ACTIVE" }
state
merepresentasikan status QR. Untuk informasi selengkapnya tentang kemungkinan
status QR, lihat Resource yang diantrekan.
Memulai pekerjaan Anda di lingkungan yang disediakan
Anda dapat menjalankan beban kerja secara manual dengan menghubungkan ke semua host di setiap bagian melalui SSH dan menjalankan perintah berikut pada semua host.
$ gcloud compute tpus tpu-vm ssh your-qr-id \ --zone=your-zone \ --worker=all \ --node=all \ --command="command-to-run"
Mereset QR
ResetQueuedResource
API dapat digunakan untuk mereset
semua VM dalam QR ACTIVE
. Mereset VM akan menghapus memori mesin secara paksa dan mereset VM ke status awal. Setiap data yang disimpan secara lokal akan
tetap utuh dan skrip startup akan dipanggil setelah reset. ResetQueuedResource
API dapat berguna saat Anda ingin memulai ulang semua TPU. Misalnya, saat pelatihan terhenti dan mereset semua VM lebih mudah daripada proses debug.
Reset semua VM dilakukan secara paralel dan operasi ResetQueuedResource
memerlukan waktu satu hingga dua menit untuk diselesaikan. Untuk memanggil API, gunakan perintah
berikut:
$ gcloud compute tpus queued-resources reset your-qr-id
Menghapus QR
Untuk melepaskan resource di akhir sesi pelatihan, hapus resource yang diantrekan dengan tanda --force
. Proses penghapusan akan memerlukan waktu dua hingga lima menit, dan dapat dijalankan di latar belakang dengan flag --async
opsional.
$ gcloud compute tpus queued-resources \ delete your-qr-id --force (--async)
Pemulihan kegagalan otomatis
Jika terjadi gangguan, Multislice menawarkan perbaikan bebas intervensi untuk slice yang terpengaruh dan mereset semua slice setelahnya. Slice yang terpengaruh akan diganti dengan slice baru dan slice lain yang seharusnya responsif akan direset. Jika tidak ada kapasitas yang tersedia untuk mengalokasikan slice pengganti, pelatihan akan berhenti.
Untuk melanjutkan pelatihan secara otomatis setelah terjadi gangguan, Anda harus menentukan skrip startup yang memeriksa dan memuat checkpoint tersimpan terakhir. Skrip startup Anda otomatis berjalan setiap kali slice dialokasikan ulang atau VM direset. Anda menentukan skrip startup dalam payload JSON yang Anda kirim ke API permintaan QR pembuatan.
Skrip startup berikut (digunakan dalam Membuat QR) memungkinkan Anda pulih secara otomatis dari kegagalan dan melanjutkan pelatihan dari checkpoint yang disimpan di bucket Cloud Storage selama pelatihan MaxText:
{ "tpu": { "node_spec": [ { ... "metadata": { "startup-script": "#! /bin/bash \n pwd \n runuser -l user1 -c 'cd /home/user1/MaxText && python3 MaxText/train.py MaxText/configs/base.yml run_name=run_test_failure_recovery dcn_data_parallelism=4 ici_fsdp_parallelism=8 steps=10000 save_period=10 base_output_directory='gs://user1-us-central2'' EOF" } ... } ] } }
Clone repo MaxText sebelum mencobanya.
Pembuatan profil dan proses debug
Pembuatan profil sama di lingkungan irisan tunggal dan Multislice. Untuk mengetahui informasi selengkapnya, lihat Membuat profil program JAX.
Mengoptimalkan pelatihan
Sharding dengan Multislice untuk performa maksimum
Untuk mencapai performa maksimum di lingkungan Multislice, Anda harus mempertimbangkan cara melakukan sharding di beberapa slice. Biasanya ada tiga pilihan (paralelisme data, paralelisme data dengan shard sepenuhnya, dan paralelisme pipeline). Sebaiknya jangan melakukan aktivasi sharding di seluruh dimensi model (terkadang disebut paralelisme tensor) karena memerlukan terlalu banyak bandwidth antar-slice. Untuk semua strategi ini, Anda dapat mempertahankan strategi sharding yang sama dalam slice yang pernah bekerja untuk Anda sebelumnya.
Sebaiknya mulai dengan paralelisme data yang murni. Menggunakan paralelisme data sharding sepenuhnya berguna untuk mengosongkan penggunaan memori. Kekurangannya adalah komunikasi antarslice menggunakan jaringan DCN dan akan memperlambat beban kerja Anda. Gunakan paralelisme pipeline hanya jika diperlukan berdasarkan ukuran batch (seperti yang dianalisis di bawah).
Kapan harus menggunakan paralelisme data
Paralelisme data murni akan berfungsi dengan baik jika Anda memiliki beban kerja yang berjalan dengan baik, tetapi Anda ingin meningkatkan performanya dengan menskalakan di beberapa bagian.
Untuk mencapai penskalaan yang kuat di beberapa bagian, jumlah waktu yang diperlukan untuk melakukan semua pengurangan melalui DCN harus kurang dari jumlah waktu yang diperlukan untuk melakukan penerusan mundur. DCN digunakan untuk komunikasi antara potongan dan merupakan faktor pembatas dalam throughput beban kerja.
Setiap chip TPU v4 berperforma pada puncak 275 * 1012 FLOPS per detik.
Ada empat chip per host TPU, dan setiap host memiliki bandwidth jaringan maksimum 50 Gbps.
Artinya, intensitas aritmetika adalah 4 * 275 * 1012 FLOPS / 50 Gbps = 22.000 FLOPS / bit.
Model Anda akan menggunakan bandwidth DCN 32 hingga 64 bit untuk setiap parameter per langkah. Jika Anda menggunakan dua irisan, model akan menggunakan bandwidth DCN 32 bit. Jika Anda menggunakan lebih dari dua irisan, compiler akan melakukan operasi pengurangan penuh pengacakan penuh dan Anda akan menggunakan bandwidth DCN hingga 64 bit untuk setiap parameter per langkah. Jumlah FLOPS yang diperlukan untuk setiap parameter akan bervariasi bergantung pada model Anda. Secara khusus, untuk model bahasa berbasis Transformer, jumlah FLOPS yang diperlukan untuk penerusan maju dan mundur sekitar 6 * B * P, dengan:
- B adalah ukuran tumpukan dalam token
- P adalah jumlah parameter
Jumlah FLOPS per parameter adalah 6 * B
dan jumlah FLOPS per parameter
selama penerusan mundur adalah 4 * B
.
Untuk memastikan penskalaan yang kuat di beberapa bagian, pastikan intensitas
operasional melebihi intensitas aritmetika hardware TPU. Untuk menghitung
intensitas operasional, bagi jumlah FLOPS per parameter selama
proses penerusan mundur dengan bandwidth jaringan (dalam bit) per parameter per langkah:
Operational Intensity = FLOPSbackwards_pass / DCN bandwidth
Oleh karena itu, untuk model bahasa berbasis Transformer, jika Anda menggunakan dua irisan:
Operational intensity = 4 * B / 32
Jika Anda menggunakan lebih dari dua irisan: Operational intensity = 4 * B/64
Hal ini menyarankan ukuran batch minimum antara 176 ribu dan 352 ribu untuk model bahasa berbasis Transformer. Karena jaringan DCN dapat menghapus paket dalam waktu singkat, sebaiknya pertahankan margin error yang signifikan, yaitu men-deploy paralelisme data hanya jika ukuran batch per Pod minimal 350 ribu (dua Pod) hingga 700 ribu (banyak Pod).
Untuk arsitektur model lainnya, Anda harus memperkirakan runtime penerusan mundur per irisan (dengan mengatur waktu menggunakan profiler atau dengan menghitung FLOPS). Kemudian, Anda dapat membandingkannya dengan waktu proses yang diharapkan untuk mengurangi keseluruhan DCN dan mendapatkan perkiraan yang akurat terkait apakah paralelisme data cocok bagi Anda.
Kapan harus menggunakan paralelisme data dengan sharding penuh (FSDP)
Paralelisme data dengan sharding penuh (FSDP) menggabungkan paralelisme data (mem-sharding data di seluruh node) dengan sharding bobot di seluruh node. Untuk setiap operasi pada penerusan maju dan mundur, bobot dikumpulkan sehingga setiap irisan memiliki bobot yang dibutuhkan. Daripada menyinkronkan gradien menggunakan semua pengurangan, gradien akan mengurangi tersebar saat dihasilkan. Dengan cara ini, setiap irisan hanya mendapatkan gradien untuk bobot yang menjadi tanggung jawabnya.
Serupa dengan paralelisme data, FSDP akan memerlukan penskalaan ukuran batch global secara linear dengan jumlah irisan. FSDP akan menurunkan tekanan memori saat Anda menambah jumlah slice. Hal ini karena jumlah bobot dan status pengoptimal per bagian menurun, tetapi hal ini terjadi karena adanya kenaikan traffic jaringan dan kemungkinan pemblokiran yang lebih besar karena adanya kolektif yang tertunda.
Dalam praktiknya, FSDP lintas irisan adalah pilihan terbaik jika Anda meningkatkan batch per irisan, menyimpan lebih banyak aktivasi untuk meminimalkan re-materialisasi selama proses mundur atau meningkatkan jumlah parameter dalam jaringan neural Anda.
Operasi yang mencakup semua dan semua pengurangan di FSDP berfungsi mirip dengan operasi di DP, sehingga Anda dapat menentukan apakah beban kerja FSDP Anda dibatasi oleh performa DCN dengan cara yang sama seperti yang dijelaskan di bagian sebelumnya.
Kapan harus menggunakan paralelisme pipeline
Paralelisme pipeline menjadi relevan saat mencapai performa tinggi dengan strategi paralelisme lainnya yang memerlukan ukuran batch global lebih besar dari ukuran batch maksimum yang Anda pilih. Paralelisme pipeline memungkinkan irisan yang terdiri dari pipeline untuk "membagikan" batch. Namun, paralelisme pipeline memiliki dua kelemahan signifikan:
- Hal ini menyebabkan "gelembung pipeline" ketika chip tidak ada aktivitas karena sedang menunggu data.
- Implementasi ini memerlukan micro-batching yang mengurangi ukuran tumpukan yang efektif, intensitas aritmetika, dan pada akhirnya memodelkan penggunaan FLOP.
Paralelisme pipeline hanya boleh digunakan jika strategi paralelisme lainnya memerlukan ukuran batch global yang terlalu besar. Sebelum mencoba paralelisme pipeline, sebaiknya lakukan eksperimen untuk melihat secara empiris apakah konvergensi per sampel melambat pada ukuran tumpukan yang diperlukan untuk mencapai FSDP berperforma tinggi. FSDP cenderung mencapai pemanfaatan FLOP model yang lebih tinggi, tetapi jika konvergensi per sampel melambat saat ukuran tumpukan bertambah, paralelisme pipeline mungkin masih menjadi pilihan yang lebih baik. Sebagian besar beban kerja dapat menoleransi ukuran tumpukan yang cukup besar agar tidak mendapatkan manfaat dari paralelisme pipeline, tetapi beban kerja Anda mungkin berbeda.
Jika paralelisme pipeline diperlukan, sebaiknya gabungkan dengan paralelisme data atau FSDP. Dengan begitu, Anda dapat meminimalkan kedalaman pipeline sekaligus meningkatkan ukuran batch per pipeline hingga latensi DCN menjadi faktor yang lebih kecil dalam throughput. Konkretnya, jika Anda memiliki irisan N, pertimbangkan pipeline dengan replika kedalaman 2 dan N/2 dari paralelisme data, lalu pipeline kedalaman 4 dan replika N/4 dari paralelisme data, dan seterusnya, hingga batch per pipeline menjadi cukup besar sehingga kolektif DCN dapat disembunyikan di balik aritmetika dalam proses mundur. Hal ini akan meminimalkan perlambatan yang ditimbulkan oleh paralelisme pipeline sekaligus memungkinkan Anda melakukan penskalaan melewati batas ukuran batch global.
Praktik terbaik multislice
Pemuatan data
Selama pelatihan, kita berulang kali memuat batch dari set data untuk dimasukkan ke dalam model. Memiliki loader data asinkron yang efisien yang melakukan sharding batch di seluruh host sangat penting untuk menghindari kelaparan TPU pekerjaan. Loader data saat ini di MaxText membuat setiap host memuat subset contoh yang sama. Solusi ini memadai untuk teks, tetapi memerlukan pengoptimalan dalam model. Selain itu, MaxText belum menawarkan snapshot deterministik yang memungkinkan iterator data memuat data yang sama sebelum dan sesudah preemption.
Checkpoint
Library checkpoint Orbax menyediakan primitif untuk checkpoint JAX PyTrees ke penyimpanan lokal atau Google Cloud Storage.
Kami menyediakan integrasi referensi dengan checkpoint sinkron ke MaxText di checkpointing.py
.
Konfigurasi yang didukung
Bentuk
Semua irisan harus memiliki bentuk yang sama (misalnya, AcceleratorType
yang sama).
Bentuk irisan heterogen tidak didukung.
Orkestrasi
Orkestrasi didukung dengan GKE. Untuk mengetahui informasi selengkapnya, lihat TPU di GKE.
Framework
Multislice hanya mendukung workload JAX dan PyTorch.
Keparalelan
Sebaiknya pengguna menguji Multislice dengan paralelisme data. Untuk mempelajari lebih lanjut cara menerapkan paralelisme pipeline dengan Multislice, hubungi perwakilan akun Google Cloud Anda.
Dukungan dan Masukan
Kami menerima semua masukan! Untuk memberikan masukan atau meminta dukungan, hubungi kami menggunakan formulir Dukungan atau Masukan Cloud TPU.