1.DP DDP的不同

1.使用场景不同:DP支持单机多 GPU和多线程是一个单进程的框架;而DDP支持多机多 GPU,同时也是多进程的,此外,DDP还与模型并行化(model parallelism)兼容


2.模型复制给不同 GPU的时间节点不同:对于DDP,在开始的时候主GPU(GPU0)就将模型复制给各个GPU,这个复制只发生一次;而对于DP,在处理每一个batch的时候,GPU0都需要把当前最新的模型复制给各个GPU

因为DDP在对local梯度做all reduce后(相当于单节点reduce+brodcast),每个节点用当前的全局平均梯度更新模型参数,所以在下一个batch时,所有节点都是更新好的模型

DP在主节点做reduce梯度求平均后,用这个梯度更新主节点的模型参数,然后在下一轮batch的时候,把主节点更新好的模型broadcast到每一个节点(模型复制)


3.数据加载方式不同:DDP中,当前所需要的数据子集直接传给各个GPU;而DP中,由GPU0读取整个 batch的数据,然后给各个GPU分配和传输相应的mini-batch

4.通信次数不同:DDP在处理每个batch的时候只需要和 GPU0之间进行一次通信,也就是最后的一步给各个 GPU local gradients求平均的环节; DP在处理每个batch时需要多次通信,从传输数据、复制模型、传送各个GPU的模型输出、传送loss到gradients求平均,几乎每一步都需要进行GPU0和各个GPU之间的通信

2 输出汇总顺序问题

DP训练时,第一个batch分为四个minnbatch,分别为m1,m2,m3,m4,如果gpu2先计算完m2,最终返回给gpu 0 的batch顺序是m2,m3,m4,m1,这种情况存在吗

答:一旦每个 GPU 完成计算,DataParallel 会自动将所有 GPU 上的结果汇总到主 GPU(通常是 GPU 0)。汇总操作会按照 输入数据的顺序

DDP训练时,outputs是每个进程独立的,并没有汇总;所以如果想用数据并行去做模型推理,并保存输出,用DP好一点?

答:在训练过程中每个进程的输出需要在某个后续步骤进行汇总(例如保存模型的最终推理结果),需要额外的通信操作来合并各个 GPU 的输出,或者在每个进程上保存输出并稍后处理

比如在batch=99 student_output出现nan,然后模型中断训练,为啥重新加载checkpoint后继续训练,在第99次却没有nan了?

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐