Closed cjdjr closed 3 years ago
Hi,
Methods | gradient all_reduce | total batch size | learning rate | weight decay |
---|---|---|---|---|
torch.nn.dataparallel |
SUM | 1024 | 0.5 | 4e-5 |
torch.distributed.DDP |
MEAN | 1024 | 0.5 | 4e-5 |
megengine.DDP + all_reduce_MEAN |
MEAN | 1024 | 0.5 | 4e-5 |
megengine.DDP + all_reduce_SUM (after 1.0) |
SUM | 1024 | 0.0625 | 3.2e-4 |
- 在torch.nn.dataparallel实现的shufflenetv2中,初始学习率设置为0.5。而在这里的用MegEngine实现的shufflenet中,初始学习率设置为0.5/8=0.0625。请问这两种设置是等效的吗?
两种设置是等效的。前三种实现(torch的两种实现,以及采用all_reduce_mean的MegEngine DDP)都遵照linear scaling rule,在总batch size一样的情况下(8卡*128/卡=1024)学习率都是一样的(0.5)。最后一种实现,即我们目前的实现(采用all_reduce_sum的MegEngine DDP)比较特殊,学习率为单卡学习率,在卡数增加的情况下不需要手动scale学习率即可等效,但需要scale weight decay。
# SGD update formula in megengine
weight = weight - learning_rate * (all_reduce(grad) + weight_decay * weight)
2、如果我想用torch.distributed.dataparallel实现多卡训练,那么初始学习率应该如何等效地进行设置?
依据linear scaling rule,根据你的总batch size决定。比如总batch size为128/卡*4卡=512,那么learning rate需要设置为0.5/2 = 0.25
Hi,
Methods gradient all_reduce total batch size learning rate weight decay
torch.nn.dataparallel
SUM 1024 0.5 4e-5torch.distributed.DDP
MEAN 1024 0.5 4e-5megengine.DDP
+ all_reduce_MEAN MEAN 1024 0.5 4e-5megengine.DDP
+ all_reduce_SUM (after 1.0) SUM 1024 0.0625 3.2e-4
- 在torch.nn.dataparallel实现的shufflenetv2中,初始学习率设置为0.5。而在这里的用MegEngine实现的shufflenet中,初始学习率设置为0.5/8=0.0625。请问这两种设置是等效的吗?
两种设置是等效的。前三种实现(torch的两种实现,以及采用all_reduce_mean的MegEngine DDP)都遵照linear scaling rule,在总batch size一样的情况下(8卡*128/卡=1024)学习率都是一样的(0.5)。最后一种实现,即我们目前的实现(采用all_reduce_sum的MegEngine DDP)比较特殊,学习率为单卡学习率,在卡数增加的情况下不需要手动scale学习率即可等效,但需要scale weight decay。
# SGD update formula in megengine weight = weight - learning_rate * (all_reduce(grad) + weight_decay * weight)
2、如果我想用torch.distributed.dataparallel实现多卡训练,那么初始学习率应该如何等效地进行设置?
依据linear scaling rule,根据你的总batch size决定。比如总batch size为128/卡*4卡=512,那么learning rate需要设置为0.5/2 = 0.25
非常感谢!
因为你们用torch训练shufflenet的代码是用torch.nn.dataparallel实现多卡训练的,跑起来比较慢,于是我就自己改成了用torch.distributed.dataparallel实现多卡训练,但无法复现原来的结果。然后发现了MegEngine也有实现多卡的训练,对其中学习率的设置有点疑问。
我发现在README中提到:
1、在torch.nn.dataparallel实现的shufflenetv2中,初始学习率设置为0.5。而在这里的用MegEngine实现的shufflenet中,初始学习率设置为0.5/8=0.0625。请问这两种设置是等效的吗?
2、如果我想用torch.distributed.dataparallel实现多卡训练,那么初始学习率应该如何等效地进行设置?
谢谢o( ̄▽ ̄)ブ