Accelerate 文件
執行流程
並獲得增強的文件體驗
開始使用
執行流程
使用分散式訓練系統時,管理程序在不同 GPU 上的執行方式和時機非常重要。有些程序會比其他程序更快完成,而有些程序則不應在其他程序完成之前開始。Accelerate 提供了協調程序執行時機的工具,以確保所有裝置上的操作保持同步。
本教程將教你如何僅在一臺機器上執行一個程序,以及如何延遲執行直到所有程序都達到某個特定點。
在單個程序上執行
某些程式碼在特定機器上只需要執行一次,例如列印日誌語句或僅在本地主程序上顯示一個進度條。
您應該使用 accelerator.is_local_main_process
來指定只應執行一次的程式碼。
from tqdm.auto import tqdm
progress_bar = tqdm(range(args.max_train_steps), disable=not accelerator.is_local_main_process)
您也可以用 accelerator.is_local_main_process
包裝一個語句。
對於未被 accelerator.is_local_main_process
包裝的獨立 print
語句,請用 Accelerate 的 print() 方法替換 print
,以確保每個程序只打印一次。
if accelerator.is_local_main_process:
print("Accelerate is the best")
您也可以指示 Accelerate 在_所有程序_中只執行一次程式碼,無論機器數量如何。這在您需要將最終模型上傳到 Hub 時非常有用。
您應該使用 accelerator.is_main_process
來指定在所有程序中只應執行一次的程式碼。
if accelerator.is_main_process:
repo.push_to_hub()
在特定程序上執行
Accelerate 也可以幫助您執行那些只應在特定程序或本地程序索引上執行的函式。
使用 on_process() 方法並指定程序索引來執行一個函式。
@accelerator.on_process(process_index=0)
def do_my_thing():
"Something done on process index 0"
do_thing_on_index_zero()
延遲執行
當您在多個 GPU 上同時執行指令碼時,某些程式碼的執行速度可能比其他程式碼快。您可能需要等待所有程序都達到某個特定點,然後才能執行下一組指令。例如,在確保每個程序都完成訓練之前,您不應儲存模型。
要實現這一點,請在程式碼中新增 wait_for_everyone()。這將阻塞所有首先完成的程序,直到所有剩餘程序都達到同一點(如果您在單個 GPU 或 CPU 上執行,此操作沒有效果)。
accelerator.wait_for_everyone()