加速文档

执行流程

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 语句,请将 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()
< > 在 GitHub 上更新