Accelerate documentation

Chạy các script 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

Chạy các script Accelerate

Trong hướng dẫn trước, bạn đã được giới thiệu cách sửa đổi script huấn luyện hiện tại của mình để sử dụng Accelerate. Phiên bản cuối cùng của mã đó được hiển thị bên dưới:

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()

Nhưng làm thế nào để chạy mã này và khiến nó sử dụng phần cứng đặc biệt có sẵn?

Đầu tiên, bạn nên viết lại đoạn mã ở trên thành một hàm, và cho phép gọi nó như một script. Ví dụ:

  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()

Tiếp theo, bạn cần khởi chạy nó bằng accelerate launch.

Bạn nên chạy accelerate config trước khi sử dụng accelerate launch để cấu hình môi trường theo ý muốn. Nếu không, Accelerate sẽ sử dụng các giá trị mặc định rất cơ bản tùy thuộc vào cấu hình hệ thống của bạn.

Sử dụng accelerate launch

Accelerate có một lệnh CLI đặc biệt giúp bạn khởi chạy mã của mình trên hệ thống thông qua accelerate launch. Lệnh này bao bọc tất cả các lệnh khác nhau cần thiết để khởi chạy script của bạn trên các nền tảng khác nhau, mà bạn không cần phải nhớ từng lệnh là gì.

Nếu bạn quen thuộc với việc tự khởi chạy các script trong PyTorch, chẳng hạn bằng torchrun, bạn vẫn có thể làm điều đó. Không bắt buộc phải sử dụng accelerate launch.

Bạn có thể khởi chạy nhanh script của mình bằng cách sử dụng:

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

Chỉ cần đặt accelerate launch ở đầu lệnh của bạn, sau đó truyền các đối số và tham số bổ sung cho script của bạn như bình thường!

Vì lệnh này thực hiện các phương thức spawn khác nhau của torch, tất cả các biến môi trường dự kiến cũng có thể được thay đổi tại đây. Ví dụ, đây là cách sử dụng accelerate launch với một GPU duy nhất:

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

Bạn cũng có thể sử dụng accelerate launch mà không cần thực hiện accelerate config trước, nhưng bạn có thể cần truyền thủ công các tham số cấu hình phù hợp. Trong trường hợp này, Accelerate sẽ tự đưa ra một số quyết định về siêu tham số cho bạn, ví dụ: nếu có GPU khả dụng, nó sẽ sử dụng tất cả các GPU đó theo mặc định mà không bật mixed precision. Dưới đây là cách sử dụng tất cả các GPU và huấn luyện với mixed precision bị tắt:

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

Hoặc bằng cách chỉ định số lượng GPU cần sử dụng:

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

Để cụ thể hơn, bạn nên tự truyền các tham số cần thiết. Ví dụ, đây là cách bạn sẽ khởi chạy cùng một script đó trên hai GPU bằng độ chính xác hỗn hợp, đồng thời tránh tất cả các cảnh báo:

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

Để xem danh sách đầy đủ các tham số bạn có thể truyền vào, hãy chạy:

accelerate launch -h

Ngay cả khi bạn không sử dụng Accelerate trong mã của mình, bạn vẫn có thể dùng trình khởi chạy để bắt đầu các script của mình!

Để hình dung sự khác biệt này, lệnh accelerate launch trước đó trên nhiều GPU sẽ trông giống như sau khi dùng torchrun:

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

Bạn cũng có thể khởi chạy script của mình bằng cách sử dụng CLI launch như một module python, cho phép truyền vào các hành vi khởi chạy cụ thể của python. Để làm điều này, hãy sử dụng accelerate.commands.launch thay vì accelerate launch:

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

Nếu bạn muốn thực thi script với bất kỳ cờ python nào khác, bạn cũng có thể truyền chúng vào tương tự như -m, chẳng hạn như ví dụ bên dưới cho phép stdout và stderr không đệm:

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

Bạn cũng có thể chạy mã của mình trên CPU! Điều này hữu ích cho mục đích gỡ lỗi và kiểm tra trên các mô hình và bộ dữ liệu nhỏ.

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

Lý do bạn nên luôn sử dụng accelerate config

Tại sao việc chạy accelerate config lại hữu ích đến mức bạn nên luôn luôn thực hiện?

Hãy nhớ lại lệnh gọi accelerate launch cũng như torchrun trước đó? Sau khi cấu hình, để chạy script đó với các phần cần thiết, bạn chỉ cần dùng accelerate launch trực tiếp, không cần truyền thêm bất kỳ tham số nào:

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

Cấu hình tùy chỉnh

Như đã đề cập ngắn gọn ở trên, accelerate launch chủ yếu nên được sử dụng bằng cách kết hợp các cấu hình được tạo bằng lệnh accelerate config. Các cấu hình này được lưu vào tệp default_config.yaml trong thư mục cache của Accelerate. Thư mục cache này nằm tại (theo thứ tự ưu tiên giảm dần):

  • Nội dung của biến môi trường HF_HOME của bạn, được thêm hậu tố accelerate.
  • Nếu không tồn tại, nội dung của biến môi trường XDG_CACHE_HOME của bạn được nối thêm huggingface/accelerate.
  • Nếu thư mục này cũng không tồn tại, hãy tạo thư mục ~/.cache/huggingface/accelerate.

Để có nhiều cấu hình, cờ --config_file có thể được truyền vào lệnh accelerate launch kết hợp với vị trí của tệp yaml tùy chỉnh.

Một tệp yaml ví dụ có thể trông như sau cho hai GPU trên một máy duy nhất sử dụng fp16 cho độ chính xác hỗn hợp:

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

Việc khởi chạy một script từ vị trí của tệp yaml tùy chỉnh đó trông như sau:

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

Đào tạo đa nút

Huấn luyện đa nút với Accelerate tương tự như huấn luyện đa nút với torchrun. Cách đơn giản nhất để khởi chạy một phiên huấn luyện đa nút là thực hiện các bước sau:

  • Sao chép codebase và dữ liệu của bạn sang tất cả các node. (hoặc đặt chúng trên một hệ thống tệp dùng chung)
  • Cài đặt các gói python của bạn trên tất cả các nút.
  • Chạy accelerate config trên nút chính đơn đầu tiên. Sau khi chỉ định số lượng nút, bạn sẽ được yêu cầu chỉ định rank của từng nút (giá trị này sẽ là 0 cho nút chính/master), cùng với địa chỉ IP và cổng cho tiến trình chính. Điều này là bắt buộc để các nút worker có thể liên lạc với tiến trình chính. Sau đó, bạn có thể sao chép hoặc gửi tệp cấu hình này đến tất cả các nút của mình, thay đổi machine_rank thành 1, 2, 3, v.v. để tránh phải chạy lệnh (hoặc chỉ cần làm theo hướng dẫn của họ để khởi chạy bằng torchrun cũng được).

Sau khi hoàn tất các bước này, bạn có thể bắt đầu phiên chạy huấn luyện đa nút bằng cách chạy accelerate launch (hoặc torchrun) trên tất cả các nút.

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.

Khuyến nghị sử dụng IP nội bộ (intranet) của nút chính thay vì IP công khai để có độ trễ tốt hơn. Đây là địa chỉ 192.168.x.x hoặc 172.x.x.x mà bạn thấy khi chạy hostname -I trên nút chính.

Để hiểu rõ hơn về huấn luyện đa nút, hãy xem ví dụ của chúng ta về huấn luyện đa nút với FSDP.

Update on GitHub