Closed jasperzhong closed 3 years ago
只听了oral,没仔细看paper.
关于为什么large batch会掉accuracy. 其实很容易理解: SGD本质上是sequential的. 而distributed SGD是牺牲了一定的sequential来换取parallelism. 如下图所示, 如果是sequential的,那么应该是 w0 -> w1 -> w2. 但是如果有两个worker, 那就变成了 w0 -> w1, w0 -> w3. w2 != w3. #4 这篇就是假设 w2 \sim w3, 但是他们认为在训练早期不成立,所以提出了warmup.
经过一通分析后,得出了有两个worker下的情况:
数学上很对称啊! 可以看到,如果g1和g2正交,那么退化成g1 + g2. 他们假设,
后面他们补了实验说明, 训练早期梯度一般不是正交的, 而到后期基本是正交的.
这非常有意思. 这说明 #4 的假设和这里不谋而合! 这就是为什么#4 早期需要做warmup. 所以Adasum到了后期退化为直接average. 早期选择用上面那个式子. 减少计算上的overhead.
如果多于两个worker,采用分治
哈... interesting. 这个思路和做optimizer的不一样. optimzer是拿到了aggregated后的gradients然后做文章. 这是直接在aggregration上做文章. 和optimizer工作是orthogonal的.
实验看上去还行. 一方面能用更少的iterations来达到同batch下LAMB的精度,另一方面可以scale到LAMB无法scale的128k batch size.
但是似乎还是有点缺陷,因为128k batch size应该是 phase1 3516 steps 但是只做到了4574,多了30%的steps. 而phase2仍保持32k batch size. 看来还是有问题. 这个问题不算完全解决.
Horovod对此的解释非常好,而且给了实现.
https://horovod.readthedocs.io/en/stable/adasum_user_guide_include.html
https://proceedings.mlsys.org/paper/2021/file/757b505cfd34c64c85ca5b5690ee5293-Paper.pdf
感觉应该发ICLR.