Accelerate documentation

Meluncurkan skrip Accelerate

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.15.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Meluncurkan skrip Accelerate

Pada tutorial sebelumnya, Anda diperkenalkan dengan cara memodifikasi skrip pelatihan Anda saat ini untuk menggunakan Accelerate. Versi akhir dari kode tersebut ditampilkan di bawah ini:

from accelerate import Accelerator

accelerator = Accelerator()

model, optimizer, training_dataloader, scheduler = accelerator.prepare(
    model, optimizer, training_dataloader, scheduler
)

for batch in training_dataloader:
    optimizer.zero_grad()
    inputs, targets = batch
    outputs = model(inputs)
    loss = loss_function(outputs, targets)
    accelerator.backward(loss)
    optimizer.step()
    scheduler.step()

Namun, bagaimana cara menjalankan kode ini agar memanfaatkan perangkat keras khusus yang tersedia?

Pertama, Anda harus menulis ulang kode di atas menjadi sebuah fungsi, dan membuatnya dapat dipanggil sebagai skrip. Sebagai contoh:

  from accelerate import Accelerator
  
+ def main():
      accelerator = Accelerator()

      model, optimizer, training_dataloader, scheduler = accelerator.prepare(
          model, optimizer, training_dataloader, scheduler
      )

      for batch in training_dataloader:
          optimizer.zero_grad()
          inputs, targets = batch
          outputs = model(inputs)
          loss = loss_function(outputs, targets)
          accelerator.backward(loss)
          optimizer.step()
          scheduler.step()

+ if __name__ == "__main__":
+     main()

Selanjutnya, Anda perlu menjalankannya dengan accelerate launch.

Disarankan untuk menjalankan accelerate config sebelum menggunakan accelerate launch untuk mengonfigurasi lingkungan sesuai keinginan Anda. Jika tidak, Accelerate akan menggunakan nilai default yang sangat dasar tergantung pada konfigurasi sistem Anda.

Menggunakan accelerate launch

Accelerate memiliki perintah CLI khusus untuk membantu Anda menjalankan kode di sistem Anda melalui accelerate launch. Perintah ini membungkus semua perintah berbeda yang diperlukan untuk menjalankan skrip Anda di berbagai platform, tanpa Anda harus mengingat apa saja perintah tersebut.

Jika Anda terbiasa menjalankan skrip di PyTorch sendiri, misalnya dengan torchrun, Anda tetap bisa melakukannya. Tidak diwajibkan untuk menggunakan accelerate launch.

Anda dapat menjalankan skrip Anda dengan cepat menggunakan:

accelerate launch {script_name.py} --arg1 --arg2 ...

Cukup tambahkan accelerate launch di awal perintah Anda, lalu berikan argumen dan parameter tambahan ke skrip Anda seperti biasa!

Karena ini menjalankan berbagai metode torch spawn, semua variabel lingkungan yang diharapkan juga dapat dimodifikasi di sini. Sebagai contoh, berikut adalah cara menggunakan accelerate launch dengan satu GPU:

# for cuda device:
CUDA_VISIBLE_DEVICES="0" accelerate launch {script_name.py} --arg1 --arg2 ...
# for xpu device:
ZE_AFFINITY_MASK="0" accelerate launch {script_name.py} --arg1 --arg2 ...

Anda juga dapat menggunakan accelerate launch tanpa terlebih dahulu menjalankan accelerate config, tetapi Anda mungkin perlu secara manual meneruskan parameter konfigurasi yang tepat. Dalam kasus ini, Accelerate akan membuat beberapa keputusan hiperparameter untuk Anda, misalnya, jika GPU tersedia, secara default akan menggunakan semuanya tanpa mixed precision. Berikut adalah cara menggunakan semua GPU dan melatih dengan mixed precision dinonaktifkan:

accelerate launch --multi_gpu {script_name.py} {--arg1} {--arg2} ...

Atau dengan menentukan jumlah GPU yang akan digunakan:

accelerate launch --num_processes=2 {script_name.py} {--arg1} {--arg2} ...

Untuk lebih spesifik, Anda harus meneruskan parameter yang diperlukan sendiri. Misalnya, berikut adalah cara Anda juga menjalankan skrip yang sama di dua GPU menggunakan presisi campuran sambil menghindari semua peringatan:

accelerate launch --multi_gpu --mixed_precision=fp16 --num_processes=2 {script_name.py} {--arg1} {--arg2} ...

Untuk daftar lengkap parameter yang dapat Anda teruskan, jalankan:

accelerate launch -h

Meskipun Anda tidak menggunakan Accelerate dalam kode Anda, Anda tetap dapat menggunakan launcher untuk menjalankan skrip Anda!

Untuk visualisasi perbedaan ini, accelerate launch sebelumnya pada multi-gpu akan terlihat seperti ini dengan torchrun:

MIXED_PRECISION="fp16" torchrun --nproc_per_node=2 --nnodes=1 {script_name.py} {--arg1} {--arg2} ...

Anda juga dapat menjalankan skrip Anda dengan memanfaatkan CLI launch sebagai modul python itu sendiri, sehingga memungkinkan Anda untuk meneruskan perilaku peluncuran spesifik python lainnya. Untuk melakukannya, gunakan accelerate.commands.launch alih-alih accelerate launch:

python -m accelerate.commands.launch --num_processes=2 {script_name.py} {--arg1} {--arg2}

Jika Anda ingin menjalankan skrip dengan flag python lainnya, Anda juga dapat meneruskannya seperti -m, seperti pada contoh di bawah yang mengaktifkan stdout dan stderr tanpa buffer:

python -u -m accelerate.commands.launch --num_processes=2 {script_name.py} {--arg1} {--arg2}

Anda juga dapat menjalankan kode Anda di CPU! Ini sangat berguna untuk keperluan debugging dan pengujian pada model dan dataset kecil.

accelerate launch --cpu {script_name.py} {--arg1} {--arg2}

Mengapa Anda harus selalu menggunakan accelerate config

Mengapa hal ini sangat berguna hingga Anda harus selalu menjalankan accelerate config?

Ingat panggilan accelerate launch dan torchrun sebelumnya? Setelah konfigurasi, untuk menjalankan skrip tersebut dengan bagian-bagian yang diperlukan, Anda cukup menggunakan accelerate launch langsung, tanpa perlu meneruskan argumen lain:

accelerate launch {script_name.py} {--arg1} {--arg2} ...

Konfigurasi Kustom

Seperti yang disinggung sebelumnya, accelerate launch sebaiknya digunakan terutama dengan menggabungkan konfigurasi yang dibuat menggunakan perintah accelerate config. Konfigurasi ini disimpan ke file default_config.yaml di folder cache Anda untuk Accelerate. Folder cache ini terletak di (dengan urutan prioritas menurun):

  • Konten variabel lingkungan Anda HF_HOME yang diberi akhiran accelerate.
  • Jika tidak ada, isi variabel lingkungan Anda XDG_CACHE_HOME yang diberi akhiran huggingface/accelerate.
  • Jika ini juga tidak ada, folder ~/.cache/huggingface/accelerate.

Untuk memiliki beberapa konfigurasi, flag --config_file dapat diteruskan ke perintah accelerate launch yang dipasangkan dengan lokasi yaml kustom.

Contoh yaml mungkin terlihat seperti berikut untuk dua GPU pada satu mesin menggunakan fp16 untuk presisi campuran:

compute_environment: LOCAL_MACHINE
deepspeed_config: {}
distributed_type: MULTI_GPU
fsdp_config: {}
machine_rank: 0
main_process_ip: null
main_process_port: null
main_training_function: main
mixed_precision: fp16
num_machines: 1
num_processes: 2
use_cpu: false

Menjalankan skrip dari lokasi file yaml kustom tersebut terlihat seperti berikut:

accelerate launch --config_file {path/to/config/my_config_file.yaml} {script_name.py} {--arg1} {--arg2} ...

Pelatihan multi-node

Pelatihan multi-node dengan Accelerate mirip dengan pelatihan multi-node dengan torchrun. Cara paling sederhana untuk memulai eksekusi pelatihan multi-node adalah dengan melakukan hal berikut:

  • Salin codebase dan data Anda ke semua node. (atau letakkan di filesystem bersama)
  • Siapkan paket python Anda di semua node.
  • Jalankan accelerate config terlebih dahulu pada node tunggal utama. Setelah menentukan jumlah node, Anda akan diminta untuk menentukan rank dari setiap node (ini akan menjadi 0 untuk node utama/master), beserta alamat IP dan port untuk proses utama. Hal ini diperlukan agar node worker dapat berkomunikasi dengan proses utama. Setelah itu, Anda dapat menyalin atau mengirim file konfigurasi ini ke semua node Anda, dengan mengubah machine_rank menjadi 1, 2, 3, dst. untuk menghindari perlu menjalankan perintahnya (atau cukup ikuti instruksi mereka secara langsung untuk peluncuran dengan torchrun juga)

Setelah Anda melakukan ini, Anda dapat memulai pelatihan multi-node Anda dengan menjalankan accelerate launch (atau torchrun) di semua node.

It is required that the command be run on all nodes for everything to start, not just running it from the main node. You can use something like SLURM or a different process executor to wrap around this requirement and call everything from a single command.

Disarankan untuk menggunakan IP intranet dari node utama Anda alih-alih IP publik untuk latensi yang lebih baik. Ini adalah alamat 192.168.x.x atau 172.x.x.x yang Anda lihat saat menjalankan hostname -I pada node utama.

Untuk mendapatkan gambaran yang lebih baik tentang pelatihan multi-node, lihat contoh kami untuk pelatihan multi-node dengan FSDP.

Update on GitHub