Accelerate 文档

执行过程

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

执行过程

当使用分布式训练系统时,重要的是管理进程如何在 GPU 之间执行以及何时执行。有些进程完成得比其他进程快,有些进程在其他进程尚未完成时不应开始。Accelerate 提供了用于编排进程执行时间的工具,以确保所有设备之间的一切保持同步。

本教程将教你如何在仅一台机器上执行进程,以及如何延迟执行直到所有进程都达到某个点。

在单个进程上执行

某些代码只需要在给定的机器上运行一次,例如打印日志语句或仅在本地主进程上显示一个进度条。

statements
function

你应该使用 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,这将非常有用。

statement
function

你应该使用 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 上更新