Paddle fleet run 单机四卡运行问题

7d7tgy0s  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(228)

请提出你的问题 Please ask your question

想请教下

  1. 使用fleet run单机四卡分布式训练的时候,dataloader 使用num_workers=8 。这样做是相当于每张卡两个num_workers ,还是每张卡都是8个进程读?
  2. fleet run 单机四卡 ,四张GPU 其实是重复加载了四次完整全量数据。怎么才能让每张GPU加载其中四分之一呢?
  3. 使用Dataloader 加载数据,nameGPU 0 算batch_1 和GPU 1、GPU 2 、GPU3 用的batch 1 是同一个batch 1 吗?那岂不是相当于同一个batch 的梯度乘了四?
  4. 使用async 模式,按理说 每个batch都会同步其他gpu的梯度,所以每块卡训到第1000步,相当于单卡训练了4000步。可是我看损失和准确率,和单卡训练到1000步相差不多。这是为什么呢?
wpx232ag

wpx232ag1#

您好,我们已经收到了您的问题,会安排技术人员尽快解答您的问题,请耐心等待。请您再次检查是否提供了清晰的问题描述、复现代码、环境&版本、报错信息等。同时,您也可以通过查看 官网API文档常见问题历史IssueAI社区 来寻求解答。祝您生活愉快~

Hi! We've received your issue and please be patient to get responded. We will arrange technicians to answer your questions as soon as possible. Please make sure that you have posted enough message to demo your request. You may also check out the APIFAQGithub Issue and AI community to get the answer.Have a nice day!

v7pvogib

v7pvogib2#

@r0103

  1. fleet run 起任务是,每张卡一个主进程,对于 dataloader 使用num_workers=8 时,每个主进程创建 8 个子进程处理数据。
  2. 每张卡在 Dataset 中会读全量的 (样本,标签) 对的索引,如果你用的是 DistributedBatchSampler,则会只产生四分之一的下标 idx,传递给 Dataset 类的 __getitem__
  3. 在分布式的情况下, 如2所述,这时候每张卡出来的 batch 是不一样的,所以不是
  4. 这个 async 是指什么?通常情况下同步的 DataParallel,四卡会比单卡多同一个 step 会多处理 4 倍数据,每张卡算梯度的时通常会加上 loss = paddle.mean(loss),目的是每张卡上归一化到一个样本上的 loss,所以当4卡处理的时候,在梯度求完后,会有一个梯度同步的操作,这个梯度同步调用的是 allreduce_mean 操作,因此同步过后,在每张卡上的梯度是所有样本的平均值。但是需要注意的是,多卡训练,相比单卡训练,一个step处理的样本是原来的卡数倍,所以学习率也要出相应的缩放,通常情况下,是线性缩放,例如:单机单卡训练时 lr=0.001,那么4卡训练,lr=0.004

相关问题