Accelerate documentation
Quy trình thực thi
Quy trình thực thi
Khi làm việc với các hệ thống huấn luyện phân tán, việc quản lý cách và thời điểm các tiến trình được thực thi trên các GPU là rất quan trọng. Một số tiến trình hoàn thành nhanh hơn những tiến trình khác, và một số tiến trình không nên bắt đầu nếu các tiến trình khác chưa hoàn tất. Accelerate cung cấp các công cụ để điều phối thời điểm thực thi các tiến trình nhằm đảm bảo mọi thứ vẫn được đồng bộ hóa trên tất cả các thiết bị.
Tutorial này sẽ hướng dẫn bạn cách thực thi một tiến trình trên chỉ một máy và cách trì hoãn việc thực thi cho đến khi tất cả các tiến trình đã đạt đến một điểm nhất định.
Chạy trên một tiến trình
Một số đoạn mã chỉ cần được thực thi một lần trên một máy cụ thể, chẳng hạn như in một câu lệnh nhật ký hoặc chỉ hiển thị một thanh tiến trình trên tiến trình chính cục bộ.
Bạn nên sử dụng accelerator.is_local_main_process để chỉ định các đoạn mã chỉ cần được thực thi một lần.
from tqdm.auto import tqdm
progress_bar = tqdm(range(args.max_train_steps), disable=not accelerator.is_local_main_process)Bạn cũng có thể bọc một câu lệnh bằng accelerator.is_local_main_process.
Đối với các câu lệnh
accelerator.is_local_main_process, hãy thay thế
if accelerator.is_local_main_process:
print("Accelerate is the best")Đối với một hàm chỉ nên được thực thi một lần, hãy sử dụng on_local_main_process().
@accelerator.on_local_main_process
def do_my_thing():
"Something done once per server"
do_thing_once_per_server()Bạn cũng có thể chỉ định cho Accelerate thực thi mã một lần trên tất cả các tiến trình bất kể số lượng máy. Điều này hữu ích nếu bạn đang tải lên Hub một mô hình cuối cùng.
Bạn nên sử dụng accelerator.is_main_process để chỉ định các đoạn mã chỉ nên được thực thi một lần trên tất cả các tiến trình.
if accelerator.is_main_process:
repo.push_to_hub()Đối với một hàm chỉ nên được thực thi một lần trên tất cả các tiến trình, hãy sử dụng on_main_process().
@accelerator.on_main_process
def do_my_thing():
"Something done once per server"
do_thing_once()Thực thi trên một tiến trình cụ thể
Accelerate cũng có thể giúp bạn thực thi các hàm chỉ nên được thực thi trên một tiến trình cụ thể hoặc một chỉ mục tiến trình cục bộ.
Sử dụng phương thức on_process() và chỉ định chỉ số tiến trình để thực thi một hàm trên đó.
@accelerator.on_process(process_index=0)
def do_my_thing():
"Something done on process index 0"
do_thing_on_index_zero()Sử dụng phương thức on_local_process() và chỉ định chỉ số tiến trình cục bộ để thực thi một hàm.
@accelerator.on_local_process(local_process_idx=0)
def do_my_thing():
"Something done on process index 0 on each server"
do_thing_on_index_zero_on_each_server()Hoãn thực thi
Khi bạn chạy script trên nhiều GPU cùng lúc, một số đoạn mã có thể được thực thi nhanh hơn những đoạn khác. Bạn có thể cần chờ tất cả các tiến trình đạt đến một điểm nhất định trước khi thực thi bộ lệnh tiếp theo. Ví dụ, bạn không nên lưu mô hình trước khi đảm bảo rằng mọi tiến trình đã hoàn tất việc huấn luyện.
Để thực hiện điều này, hãy thêm wait_for_everyone() vào mã của bạn. Điều này sẽ chặn tất cả các tiến trình đã hoàn thành trước đó tiếp tục cho đến khi tất cả các tiến trình còn lại đạt đến cùng một điểm (điều này không có tác dụng nếu bạn đang chạy trên một GPU hoặc CPU duy nhất).
accelerator.wait_for_everyone()