执行流程
在使用分布式训练系统时,管理进程在各个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()