如何获得输出与输入相同的顺序,多个衍生进程运行在多个gpu上,每个处理的数据批次?



我使用Pytorch分布式数据并行方法并生成多个进程,每个进程在单独的GPU上运行。我正在使用Pytorch分布式数据采样器以及数据加载器将批量输入数据加载到每个进程。我的问题:

  1. 在引擎盖下,Pytorch分布式数据采样器,数据加载器如何使输入数据切片?为了简单起见,假设我们有4个gpu, 400个输入样本,批处理大小为50,然后Pytorch分布式数据采样器(连同数据加载器)将前50个样本送到GPU-0,下50个送到GPU-1。,下一个50到GPU-2,然后是GPU-3,再下一个50到GPU-0,即按照GPU设备号的顺序?或者GPU选择下一批输入的顺序是随机的,基于哪个GPU先完成了上一批? 还是像400个样本被分成4个部分,然后GPU-0将获得前100个输入数据样本(每次50个),GPU-1将获得下100个样本(每次50个)等等,在这种情况下,假设GPU-3的第二批开始时间比GPU-0早,但仍然相对于输入数据,GPU-0仍然有前100个样本,GPU-3将有后100个样本?

2)。第二个问题是如何以与输入数据相同的顺序检索输出数据因此,最终的合并输出(将所有过程的输出组合在一个数据结构中)与原始输入的顺序相同,并且每个输出对应于正确的输入

  1. 关于DistributedSampler的PyTorch文档不提供任何关于数据如何跨进程和设备分布的保证,除了它实际上是跨进程和设备分布的事实。你不应该把你的应用设计成依赖于外部包的实现细节;否则,您的应用程序可能会在更新PyTorch后的某一天突然失败,而您不知道为什么(或者可能它甚至无法开始)。如果出于某种原因,您绝对需要以非常特定的方式分发数据,那么您应该推出自己的解决方案。DistributedDataParallel的文档建议,如果您使用具有N个GPU的单个主机,则应该启动N个进程,每个进程指定一个GPU。一个简单的解决方案是设置进程的等级等于指定的GPU设备ID;这可以反过来在自定义采样器类中使用,以选择适当的采样索引。
  2. 您可以尝试来控制各种分布式进程返回输出的顺序,但这会引入不必要的同步,这将破坏并行化的大部分目的。更好的解决方案是简单地以任意顺序返回输出,然后在事后对它们进行排序。如果希望输出按照与输入相同的顺序排序,则只需将每个输入与整数索引相关联(输入0获得索引0,输入1获得索引1,依此类推)。当返回的输出,也返回的索引相关的输入(例如一个元组)。然后,您可以根据相应的索引对输出进行排序。

最新更新