Pytorch-分布式数据并行混淆

问题描述 投票:0回答:1

我只是在看DDP教程:

https://pytorch.org/tutorials/intermediate/ddp_tutorial.html

据此:

通常使用torch.save和torch.load来检查点模块在训练中并从检查站中恢复。请参阅保存和加载有关更多详细信息的模型。使用DDP时,一种优化方法是保存仅在一个过程中模型,然后将其加载到所有过程中,减少写开销。这是正确的,因为所有进程都已开始从相同的参数和梯度向后同步通过,因此优化程序应继续将参数设置为相同的值。如果使用此优化,请确保所有过程都执行保存完成之前无法开始加载。此外,加载时该模块,您需要提供适当的map_location参数以防止进入他人设备的过程。如果map_location为如果缺少,torch.load将首先将模块加载到CPU,然后复制每个参数保存到的位置,这将导致所有使用同一套设备在同一台机器上的多个进程。欲了解更多高级故障恢复和弹性支持,请参阅TorchElastic。

我不明白这是什么意思。难道不应该只有一个进程/第一个GPU保存模型吗?是否保存和加载如何在进程/ GPU之间共享权重?

pytorch distributed-computing
1个回答
0
投票

[使用DistributedDataParallel时,您在多个设备上具有相同的模型,这些设备正在同步以具有完全相同的参数。

[使用DDP时,一种优化是仅在一个过程中保存模型,然后将其加载到所有过程中,以减少写开销。

由于它们相同,因此不必保存所有进程中的模型,因为它只会多次写入相同的参数。例如,当您有4个进程/ GPU时,您将写入同一文件4次,而不是一次。可以通过仅将其从主进程中保存来避免。

这是保存模型的优化。如果在保存后立即加载模型,则需要格外小心。

如果使用此优化,请确保在保存完成之前不要启动所有进程。

如果仅以一个过程保存它,则该过程将花费一些时间来写入文件。同时,所有其他进程继续进行,它们可能会在文件完全写入磁盘之前加载该文件,这可能导致各种意外行为或失败,无论该文件尚不存在,您正在尝试读取不完整的文件还是您加载了旧版本的模型(如果您覆盖了相同的文件)。

此外,在加载模块时,您需要提供适当的map_location参数,以防止进程进入其他设备。如果缺少map_location,则torch.load首先将模块加载到CPU,然后将每个参数复制到保存位置,这将导致同一台机器上的所有进程使用同一套设备。 >

[保存参数(或与此相关的任何张量)时,PyTorch包括存储该参数的设备。假设您从使用GPU 0(device = "cuda:0")的进程中保存了该信息,然后保存了该信息,并在加载该信息时将参数自动放入该设备。但是,如果在使用GPU 1(device = "cuda:1")的进程中加载​​它,则会将它们错误地加载到"cuda:0"中。现在,您不再使用多个GPU,而是在一个GPU中多次使用相同的模型。您很有可能会用完内存,但是即使您不这样做,也不会再使用其他GPU。

为避免该问题,您应该为map_locationtorch.load设置适当的设备。

torch.load
© www.soinside.com 2019 - 2024. All rights reserved.