欢迎来到Coolfensi推广平台,平台经营Instagram、Facebook、YouTube、TIKTOK、Twitter粉丝、点赞、播放量服务、客服微信:coolfensi 24小时在线欢迎咨询购买!
Facebook加播放量网站--facebook加播放量平台
Facebook加播放量网站--facebook加播放量平台公告:
欢迎来到Coolfensi推广平台,平台经营Instagram、Facebook、YouTube、TIKTOK、Twitter粉丝、点赞、播放量服务、客服微信:coolfensi 24小时在线欢迎咨询购买!

Facebook加播放量网站--facebook加播放量平台

首页 Facebook   作者:coolfensi  2023年01月08日  热度:42  评论:0     
时间:2023-1-8 11:12   热度:42° 
Facebook加播放量网站--facebook加播放量平台

首先, Facebook 这篇文章不错. 因为它简单易懂直截了当地告诉了大家在 neural network 优化中的一些技巧, 而且也大规模地实验出来给大家信心. (补充。。这篇 paper 有争议原因是因为 paper 里的技巧都是之前已知的。能做到这个 scale 告诉大家最大 batch size 能到多少以及把结论总结出来是不错,实验做的也很专业,然而之前工作得 cite。。话说 google 起标题都起到 one model to learn them all 了。。

然后是私货时间 :) 看了这篇 paper 我觉得我有一种不能再继续小号潜水的使命感 XD 一些读者可能会觉得有些惊讶, 这些 trick 实际上在之前的理论已经给出, 而且有很好的解释 (所以说不仅要看这些好的实验 paper, 关注理论发展也是有用的, 而且会提供 insight XD)

下面开始 not only tell you how but also tell you why (笑)

先说步长. 在我们的[1506.08272] Asynchronous Parallel Stochastic Gradient for Nonconvex Optimization,In NIPS 2015.一文中, 指出SGD 的步长 (learning rate) 选择应该为γ=1/MKσ2\gamma = 1/\sqrt{MK\sigma^2}量级才能保证1/MK1/\sqrt{MK}量级的收敛速度 (也就是有并行加速), 其中 M 为 batch size, K 为 iteration 数,σ2\sigma^2为 stochastic gradient 的方差上界. 因为 MK 就是一共使用的 sample 个数, 故在 training 同样多epoch的情况下, MK 为定值, 所以步长应该不变.(咦不是说线性增长么? 马上解释!)

之所以不变, 是因为在我们 paper 里使用的 update rule 是

xk+1xkγMi=1i-th stochastic gradient,x_{k+1} \leftarrow xk - \gamma \sum{i=1}^M \text{i-th stochastic gradient},

而 Facebook paper 中是

x_{k+1}\leftarrow xk - \gamma \frac{1}{M}\sum{i=1}^M \text{i-th stochastic gradient},

也就是他们的 stochastic gradient 是被 average 过得,如果要保证新的步长跟原来等价 就要\gamma/M = \gamma所以\gamma就要随 batch size M 线性增长了.实际上这种步长取法早在我们 paper 之前就已经知道了 (在同步更新 SGD 里, 比如Efficient mini-batch training for stochastic optimization, InProceedings of the 20th ACM SIGKDD international conference on Knowledge discovery and data mining(pp. 661-670). ACM.),我们这篇 paper 是证明了即使 stochastic gradient 异步更新, 在 nonconvex objective (比如神经网络) 上也可以有线性加速.

下面要讲 facebook 这篇文章没有的 insight. 从

x_{k+1}\leftarrow xk - \gamma \frac{1}{M}\sum{i=1}^M \text{i-th stochastic gradient},

的步长线性增长我们实际上可以看出这种做法是让每个 stochastic gradient 系数不变, 也就是跟 batch size 小的时候发挥一样大小的作用, 那为什么 batch size 加太大会失败呢. 因为把这些 stochastic gradient 的平均当成一个 gradient, 那对于这个平均过后的 gradient 的步长为M\gamma. 在 batch size 很大时候, 这个平均是相当接近 true gradient 的, 总所周知如果用 gradient descent, 步长应该为1/L其中 L 为 objective 的 gradient Lipshitz constant, 也就是 gradient descent 步长是常数, 既然 batch size 很大的时候 stochastic gradient descent 趋近于 gradient descent, 那么步长怎么能任意线性增大呢? 答案是当然不能. 之前我们说的\gamma = M/\sqrt{MK\sigma^2}实际上是在 K 远大于 M 时候的结论. 在一般情况下步长应该取为1/(L+\sqrt{K\sigma^2/M})在 M 很大时这个步长变成1/L, 退化为 gradient descent 步长.所以说步长随 batch size 线性增长也是不准确的, 确切地说是逐渐增长到定值(继续私货, 这个在我们的[1606.00498] A Comprehensive Linear Speedup Analysis for Asynchronous Stochastic Parallel Optimization from Zeroth-Order to First-Order,In NIPS 2016.有, 当然我们这个还是在搞 Async 算法, sync 的只是 async 的一种特殊情况).

然后是 warmup, 这个其实 dependent on dataset. 前面我们都是把 stochastic gradient 的 variance\sigma^2当作常数, 但是实际中一开始离解的距离比较远的时候, stochastic gradient 的大小和方差可能很大 (取决于 model 和 dataset), 而逐渐接近解的时候 方差逐渐减小 (again, 取决于 model 和dataset). 于是就会出现一开始取小一些步长的做法.

有人看的话我再慢慢填坑.. 其实这里面还有很多东西可以讨论 包括如何解决 bandwidth 和 latency 问题

吐槽 GPU 多的, 以及说什么几千 GPU 就更快啥的, 我想说这个事情不是那么简单有 10 倍 GPU 速度就能快 10 倍的..

最后的最后, 知乎编辑器能不能测试好了再上线

================================================================

继续填坑. 之前

说了 bandwidth 和 latency 的问题. 首先我们来看这些问题怎么来的. 在用 parameter server 并行的时候, 系统的topology如图

每个 iteration 所有黑色节点从 parameter server 拿到模型 weights, 然后计算 gradient, 再把 gradient push 回 parameter server. parameter server 将 这些 gradient 加起来 update 到 parameter server 保存的 weights 上去. 这样就完成了一个 iteration. 这样相当于把一个大 batch 分成很多份让很多黑色节点一起算. 但是问题是如果有很多节点的时候, 每个节点都要和 parameter server 通讯, 对 parameter server 带宽压力很大.

异步并行的 SGD 缓解了这个问题 (比如我之前说的两个 paper), 因为异步 SGD 每个节点可以无脑从 parameter server 取weights以及 无脑 push gradient, 不需要同步, 这样各个节点跟 parameter server 的通讯可以错开. 在异步的情况下, 可以证明在 节点数 bound 住的情况下, 可以有跟同步 SGD 一样的收敛速度. (还是见我前面说的俩 paper).

但如果节点数继续增多, parameter server 还是会有很大压力. 这时候我们可以用 AllReduce 方法去掉中心的 parameter server 做同步并行 SGD. AllReduce 具体过程描述起来比较麻烦, 但大体意思是每个节点只跟它相邻的节点通讯 (比如把所有节点连成一个环). 这样通讯就不再集中于某个 parameter server, 而是被所有节点分担了. 但 AllReduce 有一个问题, 如果网络有 n 个节点, 则 AllReduce 要将每份 gradient 切成 n 份再一份一份传, 这样会导致网络 latency 比较大的时候, 延迟对整体收敛速度的影响会非常大.

下面来谈怎么解决

我们最新的 paper:[1705.09056] Can Decentralized Algorithms Outperform Centralized Algorithms? A Case Study for Decentralized Parallel Stochastic Gradient Descent讲了在分布式 SGD 中, 比如 topology 可以是

没有中心的 parameter server. 每个节点 local keep 一份 weights 的复制. 每个节点只需要从它的相邻节点把他们 local 的 weights 拿来, 跟自己的 average, 然后将自己local 算出的gradient update 到average 过的新 weights 上. 这篇文章证明了在这种情况下整个网络的 local weights 的平均依然收敛, 而且收敛速度与同步并行 SGD 一样. 也就是说有加速. 而且在这种情况下, 每个 iteration 每个节点只需要跟近邻通讯一次, 而不是 AllReduce 中的 n 次. 这样大幅减少了 communication 上的问题, 可以最大幅度地 scale.

目前实验做到了 112 GPU, 接下来准备做更大的并进一步改进算法. 我个人认为这个工作是我至今最好的一个, 因为它提供了很有可能大幅增加 scale 的方式, 而且很经济, 而且有很好的理论保证 wwww 欢迎交流 (感觉回答越跑越远了

Facebook加播放量网站--facebook加播放量平台