Pelatihan yang terdistribusi

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:

  1. 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.

  2. 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 GPU NVIDIA_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 node n1-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 TF_CONFIG, objek ini diformat sebagai spesifikasi cluster TensorFlow, dan dapat diteruskan ke konstruktor tf.train.ClusterSpec.

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 0 pada salah satunya dan 1 pada tugas lainnya.

"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

CustomJobSpec yang Anda berikan untuk membuat tugas pelatihan saat ini, direpresentasikan sebagai kamus.

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 (chief, worker, ps, atau master) ke daftar alamat jaringan tempat tugas ini dijalankan. Untuk tugas pelatihan tertentu, kamus ini sama untuk setiap VM.

Ini adalah argumen pertama yang valid untuk konstruktor tf.train.ClusterSpec. Perlu diketahui bahwa kamus ini tidak pernah berisi evaluator sebagai kunci, karena evaluator tidak dianggap sebagai bagian dari cluster pelatihan meskipun Anda menggunakannya untuk tugas Anda.

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:

task kolom
type

Jenis tugas yang dijalankan VM ini. Nilai ini ditetapkan ke worker pada pekerja, ps pada server parameter, dan evaluator pada evaluator. Pada worker master tugas Anda, nilainya ditetapkan ke chief atau master; Pelajari lebih lanjut perbedaan antara keduanya di bagian chief versus master dalam dokumen ini.

index

Indeks tugas berbasis nol. Misalnya, jika tugas pelatihan Anda menyertakan dua worker, nilai ini ditetapkan ke 0 pada salah satunya dan 1 pada tugas lainnya.

trial

ID uji coba penyesuaian hyperparameter yang saat ini berjalan di VM ini. Kolom ini hanya ditetapkan jika tugas pelatihan saat ini adalah tugas penyesuaian hyperparameter.

Untuk tugas penyesuaian hyperparameter, Vertex AI menjalankan kode pelatihan Anda berulang kali dalam banyak uji coba dengan hyperparameter yang berbeda setiap waktu. Kolom ini berisi nomor uji coba saat ini, mulai dari 1 untuk uji coba pertama.

cloud

ID yang digunakan secara internal oleh Vertex AI. Anda dapat mengabaikan kolom ini.

job

CustomJobSpec yang Anda berikan untuk membuat tugas pelatihan saat ini, direpresentasikan sebagai kamus.

environment

String cloud.

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