Accelerate 文档

执行流程

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

执行流程

使用分布式训练系统时,管理进程在不同 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()
< > 在 GitHub 上更新