Pytorch-分布式数据并行混淆
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pytorch-分布式数据并行混淆相关的知识,希望对你有一定的参考价值。
我只是在看DDP教程:
https://pytorch.org/tutorials/intermediate/ddp_tutorial.html
据此:
通常使用torch.save和torch.load来检查点模块在训练中并从检查站中恢复。请参阅保存和加载有关更多详细信息的模型。使用DDP时,一种优化方法是保存仅在一个过程中模型,然后将其加载到所有过程中,减少写开销。这是正确的,因为所有进程都已开始从相同的参数和梯度向后同步通过,因此优化程序应继续将参数设置为相同的值。如果使用此优化,请确保所有过程都执行保存完成之前无法开始加载。此外,加载时该模块,您需要提供适当的map_location参数以防止进入他人设备的过程。如果map_location为如果缺少,torch.load将首先将模块加载到CPU,然后复制每个参数保存到的位置,这将导致所有使用同一套设备在同一台机器上的多个进程。欲了解更多高级故障恢复和弹性支持,请参阅TorchElastic。
我不明白这是什么意思。难道不应该只有一个进程/第一个GPU保存模型吗?是否保存和加载如何在进程/ GPU之间共享权重?
[使用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_location
的torch.load
设置适当的设备。
torch.load
以上是关于Pytorch-分布式数据并行混淆的主要内容,如果未能解决你的问题,请参考以下文章
pytorch分布式训练(DataParallel/DistributedDataParallel)
pytorch分布式训练(DataParallel/DistributedDataParallel)
pytorch分布式训练(DataParallel/DistributedDataParallel)