Halaman ini menjelaskan cara menjalankan tugas pelatihan terdistribusi pada Vertex AI.
Persyaratan kode
Gunakan framework ML yang mendukung pelatihan terdistribusi. Dalam kode pelatihan, Anda dapat menggunakan variabel lingkungan CLUSTER_SPEC
atau TF_CONFIG
untuk mereferensikan bagian tertentu dari cluster pelatihan Anda.
Struktur cluster pelatihan
Jika menjalankan tugas pelatihan terdistribusi dengan Vertex AI, Anda akan menentukan beberapa mesin (node) dalam cluster pelatihan. Layanan pelatihan mengalokasikan resource untuk jenis mesin yang Anda tentukan. Tugas Anda yang sedang berjalan pada node tertentu disebut replika. Sekelompok replika dengan konfigurasi yang sama disebut worker pool.
Setiap replika dalam cluster pelatihan diberi satu peran atau tugas dalam pelatihan terdistribusi. Contoh:
Replika utama: Hanya satu replika yang ditetapkan sebagai replika utama. Tugas ini mengelola tugas lainnya dan melaporkan status untuk pekerjaan secara keseluruhan.
Pekerja: Satu atau beberapa replika dapat ditetapkan sebagai pekerja. Replika ini melakukan bagian tugasnya seperti yang Anda tetapkan dalam konfigurasi tugas.
Server parameter: Jika didukung oleh framework ML Anda, satu atau beberapa replika dapat ditetapkan sebagai server parameter. Replika ini menyimpan parameter model dan mengoordinasikan status model bersama antar-worker.
Evaluator: Jika didukung oleh framework ML Anda, satu atau beberapa replika dapat ditetapkan sebagai evaluator. Replika ini dapat digunakan untuk mengevaluasi model Anda. Jika Anda menggunakan TensorFlow, perhatikan bahwa TensorFlow umumnya mengharapkan Anda menggunakan tidak lebih dari satu evaluator.
Mengonfigurasi tugas pelatihan terdistribusi
Anda dapat mengonfigurasi tugas pelatihan kustom sebagai tugas pelatihan terdistribusi dengan menentukan beberapa worker pool. Anda juga dapat menjalankan pelatihan terdistribusi dalam pipeline pelatihan atau tugas penyesuaian hyperparameter.
Untuk mengonfigurasi tugas pelatihan terdistribusi, tentukan daftar worker pool (workerPoolSpecs[]
), dengan menetapkan satu WorkerPoolSpec
untuk setiap jenis tugas:
Posisi di workerPoolSpecs[] |
Tugas dilakukan di cluster |
---|---|
Pertama (workerPoolSpecs[0] ) |
Utama, kepala, penjadwal, atau "master" |
Kedua (workerPoolSpecs[1] ) |
Sekunder, replika, worker |
Ketiga (workerPoolSpecs[2] ) |
Server parameter, Server Reduksi |
Keempat (workerPoolSpecs[3] ) |
Evaluator |
Anda harus menentukan replika utama, yang mengoordinasikan pekerjaan yang dilakukan oleh semua
replika lainnya. Gunakan spesifikasi kumpulan pekerja pertama hanya untuk replika
utama, dan tetapkan
replicaCount
ke 1
:
{
"workerPoolSpecs": [
// `WorkerPoolSpec` for worker pool 0, primary replica, required
{
"machineSpec": {...},
"replicaCount": 1,
"diskSpec": {...},
...
},
// `WorkerPoolSpec` for worker pool 1, optional
{},
// `WorkerPoolSpec` for worker pool 2, optional
{},
// `WorkerPoolSpec` for worker pool 3, optional
{}
]
...
}
Menentukan kumpulan pekerja tambahan
Bergantung pada framework ML, Anda dapat menentukan kumpulan pekerja tambahan untuk tujuan lain. Misalnya, jika menggunakan TensorFlow, Anda dapat menentukan worker pool untuk mengonfigurasi replika worker, replika server parameter, dan replika evaluator.
Urutan kumpulan pekerja yang Anda tentukan dalam daftar workerPoolSpecs[]
akan menentukan jenis worker pool. Tetapkan nilai kosong untuk worker pool yang tidak ingin Anda gunakan, sehingga Anda dapat melewatinya dalam daftar workerPoolSpecs[]
untuk menentukan worker pool yang ingin Anda gunakan. Contoh:
Jika ingin menentukan tugas yang hanya memiliki replika utama dan worker pool server parameter, Anda harus menetapkan nilai kosong untuk worker pool 1:
{
"workerPoolSpecs": [
// `WorkerPoolSpec` for worker pool 0, required
{
"machineSpec": {...},
"replicaCount": 1,
"diskSpec": {...},
...
},
// `WorkerPoolSpec` for worker pool 1, optional
{},
// `WorkerPoolSpec` for worker pool 2, optional
{
"machineSpec": {...},
"replicaCount": 1,
"diskSpec": {...},
...
},
// `WorkerPoolSpec` for worker pool 3, optional
{}
]
...
}
Mengurangi waktu pelatihan dengan Server Reduksi
Saat Anda melatih model ML besar menggunakan beberapa node, mengomunikasikan gradien antar-node dapat menyebabkan latensi yang signifikan. Server Reduksi adalah algoritma semua reduksi yang dapat meningkatkan throughput dan mengurangi latensi untuk pelatihan terdistribusi. Vertex AI menyediakan Server Reduksi di image container Docker yang dapat Anda gunakan untuk salah satu kumpulan pekerja selama pelatihan terdistribusi.
Untuk mempelajari cara kerja Server Reduksi, lihat Pelatihan GPU terdistribusi yang lebih cepat dengan Server Reduksi di Vertex AI.
Prasyarat
Anda dapat menggunakan Server Reduksi jika memenuhi persyaratan berikut:
Anda sedang melakukan pelatihan terdistribusi dengan worker GPU.
Kode pelatihan Anda menggunakan TensorFlow atau PyTorch dan dikonfigurasi untuk pelatihan paralel data multi-host dengan GPU menggunakan all-Reduce NCCL. (Anda mungkin juga dapat menggunakan framework ML lain yang menggunakan NCCL.)
Container yang berjalan di node utama (
workerPoolSpecs[0]
) dan worker (workerPoolSpecs[1]
) Anda mendukung Server Reduksi. Secara khusus, setiap container adalah salah satu dari hal berikut:Container pelatihan TensorFlow bawaan, versi 2.3 atau yang lebih baru.
Container pelatihan Pytorch bawaan, versi 1.4 atau yang lebih baru.
Container kustom dengan NCCL 2.7 atau yang lebih baru dan paket
google-reduction-server
yang diinstal. Anda dapat menginstal paket ini pada image container kustom dengan menambahkan baris berikut ke Dockerfile Anda:RUN echo "deb https://packages.cloud.google.com/apt google-fast-socket main" | tee /etc/apt/sources.list.d/google-fast-socket.list && \ curl -s -L https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \ apt update && apt install -y google-reduction-server
Latih menggunakan Server Reduksi
Untuk menggunakan Server Reduksi, lakukan hal berikut saat Anda membuat resource pelatihan kustom:
Tentukan salah satu URI berikut di kolom
containerSpec.imageUri
worker pool ketiga (workerPoolSpecs[2]
):us-docker.pkg.dev/vertex-ai-restricted/training/reductionserver:latest
europe-docker.pkg.dev/vertex-ai-restricted/training/reductionserver:latest
asia-docker.pkg.dev/vertex-ai-restricted/training/reductionserver:latest
Memilih multi-region yang terdekat dengan tempat Anda melakukan pelatihan kustom dapat mengurangi latensi.
Saat memilih jenis mesin dan jumlah node untuk worker pool ketiga, pastikan total bandwidth jaringan dari worker pool ketiga cocok atau melebihi total bandwidth jaringan dari worker pool pertama dan kedua.
Untuk mempelajari bandwidth maksimum yang tersedia dari setiap node pada worker pool kedua, lihat Bandwidth dan GPU jaringan.
Anda tidak menggunakan GPU untuk node Server Reduksi. Untuk mempelajari bandwidth maksimum yang tersedia dari setiap node di worker pool ketiga, lihat kolom "Bandwidth traffic keluar maksimum (Gbps)" di Kelompok mesin tujuan umum.
Misalnya, jika Anda mengonfigurasi worker pool pertama dan kedua untuk menggunakan 5 node
n1-highmem-96
, masing-masing dengan 8 GPUNVIDIA_TESLA_V100
, setiap node memiliki bandwidth maksimum yang tersedia sebesar 100 Gbps, untuk bandwidth total 500 Gbps. Untuk mencocokkan bandwidth ini dengan worker pool ketiga, Anda dapat menggunakan 16 noden1-highcpu-16
, masing-masing dengan bandwidth maksimum 32 Gbps, untuk total bandwidth 512 Gbps.Sebaiknya gunakan jenis mesin
n1-highcpu-16
untuk node Server Reduksi, karena jenis mesin ini menawarkan bandwidth yang relatif tinggi untuk resource-nya.
Perintah berikut memberikan contoh cara membuat resource CustomJob
yang menggunakan Server Reduksi:
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--worker-pool-spec=machine-type=n1-highmem-96,replica-count=1,accelerator-type=NVIDIA_TESLA_V100,accelerator-count=8,container-image-uri=CUSTOM_CONTAINER_IMAGE_URI \
--worker-pool-spec=machine-type=n1-highmem-96,replica-count=4,accelerator-type=NVIDIA_TESLA_V100,accelerator-count=8,container-image-uri=CUSTOM_CONTAINER_IMAGE_URI \
--worker-pool-spec=machine-type=n1-highcpu-16,replica-count=16,container-image-uri=us-docker.pkg.dev/vertex-ai-restricted/training/reductionserver:latest
Untuk konteks selengkapnya, lihat
panduan untuk membuat CustomJob
.
Praktik terbaik untuk pelatihan menggunakan Server Reduksi
Jenis dan jumlah Mesin
Dalam pelatihan Server Reduksi, setiap pekerja harus terhubung ke semua host reduksi. Untuk meminimalkan jumlah koneksi pada host worker, gunakan jenis mesin dengan bandwidth jaringan tertinggi untuk host reduksi Anda.
Pilihan yang tepat untuk host reduksi adalah VM N1/N2 tujuan umum dengan minimal 16 vCPU yang menyediakan bandwidth keluar 32 Gbps, seperti n1-highcpu-16
dan n2-highcpu-16
. Bandwidth VM Tingkat 1 untuk VM N1/N2 meningkatkan bandwidth keluar maksimum antara 50 Gbps dan 100 Gbps, sehingga menjadikannya pilihan tepat untuk node VM reduksi.
Total bandwidth traffic keluar worker dan reduksi harus sama. Misalnya, jika Anda menggunakan 8 VM a2-megagpu-16g
sebagai worker, Anda harus menggunakan minimal 25 VM n1-highcpu-16
sebagai reduksi.
`(8 worker VMs * 100 Gbps) / 32 Gbps egress = 25 reducer VMs`.
Mengelompokkan pesan kecil
Server Reduksi berfungsi optimal jika pesan yang akan digabungkan cukup besar. Sebagian besar framework ML sudah menyediakan teknik berdasarkan terminologi yang berbeda untuk mengelompokkan tensor gradien kecil sebelum melakukan all-Reduce.
Horovod
Horovod mendukung Tensor Fusion untuk mengelompokkan
tensor kecil untuk semua reduksi. Tensor diisi dengan buffer fusion hingga buffer terisi sepenuhnya dan operasi pengurangan semua di buffer dijalankan. Anda dapat menyesuaikan ukuran
fusion buffer dengan menetapkan variabel lingkungan HOROVOD_FUSION_THRESHOLD
.
Nilai yang direkomendasikan untuk variabel lingkungan HOROVOD_FUSION_THRESHOLD
minimal 128 MB. Dalam hal ini, tetapkan variabel lingkungan HOROVOD_FUSION_THRESHOLD
ke 134217728 (128 * 1024 * 1024).
PyTorch
PyTorch DistributedDataParallel
mendukung pesan batch sebagai "pengelompokan gradien". Tetapkan parameter bucket_cap_mb
di konstruktor DistributedDataParallel
untuk mengontrol ukuran bucket batch Anda.
Ukuran default-nya adalah 25 MB.
PRAKTIK TERBAIK: Nilai bucket_cap_mb yang direkomendasikan adalah 64 (64 MB).
Variabel lingkungan untuk cluster Anda
Vertex AI mengisi variabel lingkungan, CLUSTER_SPEC
, di
setiap replika untuk mendeskripsikan cara keseluruhan cluster disiapkan. Seperti TF_CONFIG
TensorFlow, CLUSTER_SPEC
menjelaskan setiap replika dalam cluster, termasuk indeks dan perannya (replika utama, worker, server parameter, atau evaluator).
Saat Anda menjalankan pelatihan terdistribusi dengan TensorFlow, TF_CONFIG
akan diurai menjadi tf.train.ClusterSpec
.
Demikian pula, saat menjalankan pelatihan terdistribusi dengan framework ML lain, Anda harus mengurai CLUSTER_SPEC
untuk mengisi variabel atau setelan lingkungan yang diperlukan oleh framework.
Format CLUSTER_SPEC
Variabel lingkungan CLUSTER_SPEC
adalah string JSON dengan format berikut:
Kunci | Deskripsi | |
---|---|---|
"cluster"
|
Deskripsi cluster untuk container kustom Anda. Seperti halnya
Deskripsi cluster berisi daftar nama replika untuk setiap worker pool yang Anda tentukan. |
|
"workerpool0"
|
Semua tugas pelatihan terdistribusi memiliki satu replika utama di worker pool pertama. | |
"workerpool1"
|
Worker pool ini berisi replika worker, jika Anda menentukannya saat membuat tugas. | |
"workerpool2"
|
Worker pool ini berisi server parameter, jika Anda menentukannya saat membuat tugas. | |
"workerpool3"
|
Worker pool ini berisi evaluator, jika Anda menentukannya saat membuat tugas. | |
"environment"
|
String cloud .
|
|
"task"
|
Menjelaskan tugas node tertentu tempat kode Anda dijalankan. Anda dapat menggunakan informasi ini untuk menulis kode bagi pekerja tertentu dalam tugas yang didistribusikan. Entri ini merupakan kamus dengan kunci berikut: | |
"type"
|
Jenis worker pool tempat tugas ini berjalan. Misalnya,
"workerpool0" merujuk pada replika utama.
|
|
"index"
|
Indeks tugas berbasis nol. Misalnya, jika tugas pelatihan Anda menyertakan dua worker, nilai ini ditetapkan ke |
|
"trial"
|
ID uji coba penyesuaian hyperparameter yang saat ini berjalan. Saat mengonfigurasi penyesuaian hyperparameter untuk tugas, Anda akan menetapkan jumlah uji coba untuk dilatih. Nilai ini memberi Anda cara untuk membedakan kode antara uji coba yang sedang berjalan. ID adalah nilai string yang berisi nomor uji coba, mulai dari 1. | |
job |
|
Contoh CLUSTER_SPEC
Berikut adalah contoh nilai:
{ "cluster":{ "workerpool0":[ "cmle-training-workerpool0-ab-0:2222" ], "workerpool1":[ "cmle-training-workerpool1-ab-0:2222", "cmle-training-workerpool1-ab-1:2222" ], "workerpool2":[ "cmle-training-workerpool2-ab-0:2222", "cmle-training-workerpool2-ab-1:2222" ], "workerpool3":[ "cmle-training-workerpool3-ab-0:2222", "cmle-training-workerpool3-ab-1:2222", "cmle-training-workerpool3-ab-2:2222" ] }, "environment":"cloud", "task":{ "type":"workerpool0", "index":0, "trial":"TRIAL_ID" }, "job": { ... } }
Format TF_CONFIG
Selain CLUSTER_SPEC
, Vertex AI menetapkan
variabel lingkungan TF_CONFIG
pada setiap replika semua tugas pelatihan terdistribusi. Vertex AI
tidak menetapkan TF_CONFIG
untuk tugas pelatihan replika tunggal.
CLUSTER_SPEC
dan TF_CONFIG
memiliki beberapa nilai yang sama, tetapi memiliki format
yang berbeda. Kedua variabel lingkungan ini menyertakan kolom tambahan selain yang diperlukan TensorFlow.
Pelatihan terdistribusi dengan TensorFlow berfungsi dengan cara yang sama saat Anda menggunakan container kustom seperti saat Anda menggunakan container yang telah dibangun sebelumnya.
Variabel lingkungan TF_CONFIG
adalah string JSON dengan format berikut:
TF_CONFIG kolom |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
cluster |
Deskripsi cluster TensorFlow. Kamus yang memetakan satu atau beberapa
nama tugas ( Ini adalah argumen pertama yang valid untuk konstruktor |
||||||||||
task |
Deskripsi tugas VM tempat variabel lingkungan ini ditetapkan. Untuk tugas pelatihan tertentu, kamus ini berbeda untuk setiap VM. Anda dapat menggunakan informasi ini untuk menyesuaikan kode yang dijalankan pada setiap VM dalam tugas pelatihan terdistribusi. Anda juga dapat menggunakannya untuk mengubah perilaku kode pelatihan untuk berbagai uji coba tugas penyesuaian hyperparameter. Kamus ini mencakup pasangan nilai kunci berikut:
|
||||||||||
job |
|
||||||||||
environment |
String |
Contoh TF_CONFIG
Kode contoh berikut mencetak variabel lingkungan TF_CONFIG
ke log pelatihan Anda:
import json
import os
tf_config_str = os.environ.get('TF_CONFIG')
tf_config_dict = json.loads(tf_config_str)
# Convert back to string just for pretty printing
print(json.dumps(tf_config_dict, indent=2))
Dalam tugas penyesuaian hyperparameter yang berjalan pada runtime versi 2.1 atau yang lebih baru dan menggunakan worker master, dua worker, dan satu server parameter, kode ini menghasilkan log berikut untuk salah satu worker selama penyesuaian hyperparameter pertama. Contoh output menyembunyikan kolom job
agar lebih ringkas dan mengganti
beberapa ID dengan nilai generik.
{
"cluster": {
"chief": [
"training-workerpool0-[ID_STRING_1]-0:2222"
],
"ps": [
"training-workerpool2-[ID_STRING_1]-0:2222"
],
"worker": [
"training-workerpool1-[ID_STRING_1]-0:2222",
"training-workerpool1-[ID_STRING_1]-1:2222"
]
},
"environment": "cloud",
"job": {
...
},
"task": {
"cloud": "[ID_STRING_2]",
"index": 0,
"trial": "1",
"type": "worker"
}
}
Kapan menggunakan TF_CONFIG
TF_CONFIG
hanya ditetapkan untuk tugas pelatihan terdistribusi.
Anda mungkin tidak perlu berinteraksi dengan variabel lingkungan TF_CONFIG
secara langsung dalam kode pelatihan. Hanya akses variabel lingkungan TF_CONFIG
jika strategi distribusi TensorFlow dan alur kerja penyesuaian hyperparameter standar Vertex AI, yang keduanya dijelaskan di bagian berikutnya, tidak berfungsi untuk tugas Anda.
Pelatihan yang terdistribusi
Vertex AI menetapkan variabel lingkungan TF_CONFIG
untuk memperluas
spesifikasi yang diperlukan TensorFlow untuk pelatihan
terdistribusi.
Untuk melakukan pelatihan terdistribusi dengan TensorFlow, gunakan tf.distribute.Strategy
API.
Secara khusus, sebaiknya gunakan Keras API bersama dengan
MultiWorkerMirroredStrategy
atau, jika Anda
menentukan server parameter untuk tugas Anda, ParameterServerStrategy
.
Namun, perlu diperhatikan bahwa TensorFlow saat ini hanya menyediakan dukungan eksperimental untuk strategi ini.
Strategi distribusi ini menggunakan variabel lingkungan TF_CONFIG
untuk menetapkan peran ke setiap VM dalam tugas pelatihan Anda, dan untuk memfasilitasi komunikasi antara VM. Anda tidak perlu mengakses variabel lingkungan TF_CONFIG
secara langsung dalam kode pelatihan karena TensorFlow akan menanganinya untuk Anda.
Hanya uraikan variabel lingkungan TF_CONFIG
secara langsung jika Anda ingin menyesuaikan perilaku berbagai VM yang menjalankan tugas pelatihan Anda.
Penyesuaian hyperparameter
Saat Anda menjalankan tugas penyesuaian hyperparameter, Vertex AI menyediakan argumen berbeda ke kode pelatihan Anda untuk setiap uji coba. Kode pelatihan Anda tidak perlu mengetahui uji coba yang sedang berjalan. Selain itu, Anda dapat memantau progres tugas penyesuaian hyperparameter di konsol Google Cloud.
Jika diperlukan, kode Anda dapat membaca nomor uji coba saat ini dari kolom trial
pada kolom task
dari variabel lingkungan TF_CONFIG
.
Langkah selanjutnya
- Buat pipeline pelatihan.