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
语句,请将 print
替换为 Accelerate 的 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()