0x00 Preface
本文着眼于分布式机器学习中的效率分析,在分布式机器学习中,efficiency 通常指的是效率,即在一定的时间内,算法能够达到的最优解的质量,或者是需要得到一定的质量时,算法所需要的时间,参考1。
0x01 Synchronous SGD
Gradient Computation and Communication Time
通常,我们会假设梯度计算和通信的时间服从一个关于随机变量 $X$ 的概率分布,即 $F_{X}(x)$,这个分布往往取决于计算机的性能、网络的带宽、所用的通信协议等等。常见的分布有:
- 指数分布:$F_{X}(x) = \text{Exp}(\lambda) = \lambda e^{-\lambda x}, x \geq 0, \lambda > 0$
- 高斯分布:$F_{X}(x) = \text{N}(\mu, \sigma^2) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}}, x \in \mathbb{R}, \mu \in \mathbb{R}, \sigma > 0$
- 帕累托(Pareto)分布:
其中,$x_{m}$ 和 $\alpha$ 分别是范围和形状参数,越大的 $\alpha$ 表示越快的衰减。帕累托随机变量的均值和方差分别为:
tip
帕累托分布是从真实世界现象中发现的幂次定律分布,除了用于 cloud server delay 之外,还常用于硬件的错误和失败率、在线文件大小、社会财富分布(意大利20%人口拥有80%的财产)等等。
在这些分布假设下,实际的梯度计算和通信时间是偏移的(shifted),即 $\Delta + \text{Exp}(\lambda)$,其中 $\Delta$ 是一个常数时间,如通信和本地计算的开销。
同时,通常我们会假设 $X$ 是独立同分布的(i.i.d.),即在每个 worker node 上的梯度计算和通信时间服从同一个分布。
有了上面的假设,我们就可以开始着手分析了。
Efficiency/Runtime Analysis
假设一轮的迭代时间为 $T_{\text{sync}}$,共有 $m$ 个 worker node。
那么
其中,$X_{m:m}$ 表示 $m$ 个随机变量中的最大值,因为根据木桶原理,我们应该关注最慢的那个 worker node。
当 $X$ 服从指数分布时,即 $X \sim \Delta + \text{Exp}(\lambda)$,我们有
其中,$H_{m} = \sum_{i=1}^{m} \frac{1}{i}$ 是第 $m$ 个调和数。
因此,我们可以认为,分布式机器学习中,使用同步 SGD 单位时间处理 minibatches 的期望是 $\frac{m}{\mathbb{E}[T_{\text{sync}}]}$。
为了防止和迭代次数 $t$ 混淆,我们用 $T_{\text{wall}}$ 表示 wall-clock time,即 $T$ 个单位时间。在 $T_{\text{wall}}$ 时间内,同步 SGD 进行的迭次数 $t$,随机变量 $X\sim \text{Exp}(\lambda)$,我们有
于是,有 $t \approx \frac{\lambda T_{\text{wall}}}{\ln m}$。
同样的,如果我们限制的是迭代次数 $t$,那么 wall-clock time 为 $T_{\text{wall}}\approx \frac{t\ln m}{\lambda}$。
从 分布式机器学习中的收敛性分析 中我们知道,这个误差,代入 $t$ 得到
从上式可以看出存在一个关于 $m$ 的实际运行时间和误差的 trade-off,$m$ 越大,每轮迭代的期望运行时间变大了,但是实现了更小的误差。实现误差 $\epsilon$ 所需要的 wallclock time 是 $O(\frac{\ln m}{\lambda \epsilon m})$,同时迭代次数 $t$ 是 $O(\frac{1}{\epsilon m})$,每轮运行时间是 $O(\frac{\ln m}{\lambda})$。
0x02 K-Sync SGD
在 K-Sync SGD 中,PS 会首先接收前 K 的 worker node 的梯度,然后进行平均,同时取消掉剩余的 worker node 的计算,保证每次迭代的初始参数是相同的。
此时一轮迭代的期望时间为
在经过 $t$ 次迭代后,误差被 bound 如下:
同样,这也存在一个 Trade-off,更小的 $K$ 能够让单轮迭代变快,但是误差会增加。
这里多说一个 K-batch-sync 的情况,这种情况下,一个 worker 上传完梯度后,并不是停止等待,而是继续计算,直到 PS 收到 K 个梯度为止。这种情况下,一轮迭代的期望时间为 $\mathbb{E}[T_{\text{k-batch-sync}}] = \frac{K}{m\lambda}$,随着 $m$ 增加而降低,随着 $K$ 增加而增加。
0x03 Asynchronous SGD
在异步的情况下,需要用到 Renewal Theorem2。
defination
Renewal Theorem:假设 $S_{1}, S_{2}, \cdots$ 是独立同分布的随机变量序列,并且期望是有界的 $0< \mathbb{E}[S_{i}] < \infty$。对于 $S_{i}$,我们指的是第 $i$ 个占用时间($i$-th holding time)。同时定义 $J_{n} = \sum_{i=1}^{n} S_{i}$,即第 $n$ 个跳跃时间($n$-th jump time),而 $[J_{n}, J_{n+1})$ 也叫做更新间隔(renewal interval)。那么,对于任意的 $t \geq 0$,我们有
$$ X_{t} = \sum_{n=1}^{\infty} \mathbb{I}_{{J_{n} \leq t}}=\text{sup} \{n: J_{n} \leq t\} $$
其中,$\mathbb{I}_{\{J_{n} \leq t\}}$ 表示 $J_{n} \leq t$ 的指示函数(成立时为1,其他情况为0)。$X_{t}$ 表示在 $t$ 时刻的跳跃次数,这个过程也叫做更新过程(renewal process)。
更新过程是泊松过程的推广。本质上,泊松过程是正整数(通常从零开始)的连续时间马尔可夫过程,每个整数具有独立的指数分布保持时间 $i$ 在前进到下一个整数之前,$i+1$。
每次迭代的期望运行时间 $\mathbb{E}[T_{\text{async}}] = \frac{\mathbb{E}[X]}{m}$,分析如下:
对于第 $i$ 个 worker,$A_{i}(t)$ 表示第 $i$ 个 worker 在 $t$ 时间内给 PS 发送的梯度个数,由更新理论的基本更新定理(Elementary renewal theorem)。
对于所有 worker 的梯度个数,我们有
因此每轮的运行时间为 $\mathbb{E}[T_{\text{async}}] = \frac{\mathbb{E}[X]}{m}$。
相较于同步的情况,两者的比值 $\frac{\mathbb{E}[T_{\text{sync}}]}{\mathbb{E}[T_{\text{async}}]} \approx m\ln m$,因此,异步的情况下,每轮迭代的时间是同步的 $O(m\ln m)$ 倍。
0x04 K-Async SGD
在 K-Async SGD 中,每次迭代,PS 会接收前 K 个 worker 的梯度,然后进行平均。
此时,每轮迭代的期望时间为
如果 $X$ 服从 new-longer-than-used 分布,上式是 upper bound。
0x05 Reference
《Optimization Algorithms for Distributed Machine Learning》,Gauri Joshi ↩︎
Wikipedia, https://en.wikipedia.org/wiki/Renewal_theory ↩︎