本视频来源于Shusen Wang讲解的《分布式机器学习》,总共有三讲,内容和连接如下:
这一节讲解《并行计算与机器学习(上)》,这节课的主要内容:
- Motivation:并行计算有什么用?为什么机器学习的人需要懂并行计算。
- 最小二乘回归。
- 用并行计算来解最小二乘回归。
- 并行计算中的通信问题。
- MapReduce,已经如何用MapReduce实现并行梯度下降,以及通信、同步的问题
![](https://i-blog.csdnimg.cn/blog_migrate/22a1c8ae5449ac211aef3d99f4cc1426.png)
首先,我们为什么需要对机器学习进行并行计算呢?这点其实很好理解,因为:
- 机器学习模型通常很大:如ResNet-50有2500万个参数
- 大模型是基于大数据训练的,比如ImageNet有1400万张图片
- 大模型和大数据共同构成了大的计算开销
- 利用并行计算可以使得运算更快(此处指的是钟表时间而不是总的计算量)
我们先以最小二乘法为例开始讲解:
![](https://i-blog.csdnimg.cn/blog_migrate/32c1a2a39d37417b05666ca5d18c3e04.png)
最小二乘法的目标如上图所示,我们希望找到 w w w 使得 L ( w ) L(w) L(w) 最小。那么我们就是要求这么一个梯度:
![](https://i-blog.csdnimg.cn/blog_migrate/0d5f145d57914de4c2eb3fe2d007dbed.png)
假如我们有两块处理器,我们就可以将数据分为两份,由两个处理器分别执行,然后执行完再对数据进行合并(通信),如下:
![](https://i-blog.csdnimg.cn/blog_migrate/48b34f718663005e0cc602085a24639f.png)
通信的目的是做Aggregation,一般有两种通信方法,分别是 Share memory 和 Message passing。
![](https://i-blog.csdnimg.cn/blog_migrate/d56da0d2feb76842b1a5a7ec796f880f.png)
Share memory 的架构图如上,简单来说就是不同的处理器共享一块内存,然后他们可以共同访问这一块内存,这样就很容易实现通信。这种方法有着一定的限制,因为处理器要连着同一个内存,这样就没办法同时用很多处理器进行工作,规模是上不去的。
![](https://i-blog.csdnimg.cn/blog_migrate/5d1e8f3e540d07bdbcd10f5480bdafbf.png)
另一种方法叫做 Message passing,有多个节点,节点的处理器之间是可以采用共享内存,节点之间不能共享内存。节点之间可以网线相连接也可以使用 TCP/IP 进行消息传递。这种方式可以适用于大规模的计算。做并行计算的时候,一个很重要的点是如何协调这些节点,于是我们有了 Client-Server 架构:
![](https://i-blog.csdnimg.cn/blog_migrate/0c371faa4dc59a5ebbb41c2083b80f89.png)
我们把一个节点作为server,用来协调其他节点,其他节点作为worker,用于计算。
![](https://i-blog.csdnimg.cn/blog_migrate/b186d5f251e7f15804655f37e38a2768.png)
另一种架构叫做P2P架构,每个节点有邻居,邻居之间可以通信。
然后我们讲一下如何用MapReduce做并行梯度下降。这个是MapReduce的简单介绍。
![](https://i-blog.csdnimg.cn/blog_migrate/fe31bf7ee31ba3169c293eccaa8b9cb3.png)
MapReduce是Client-Server架构,Server可以把信息广播到worker节点。Server先定义一个 Map 操作,这个 Map 操作是由worker节点完成,然后worker把结果传回client并处理,这个叫做reduce。
![](https://i-blog.csdnimg.cn/blog_migrate/d1f649df46115075a61426c4dd0d4d0d.png)
利用 MapReduce 做并行梯度计算的过程如上,过程也比较通俗易懂就不在加以解释了
![](https://i-blog.csdnimg.cn/blog_migrate/3a6f837e65e967d5b5c8e057d3837422.png)
那么假如有 m m m 个节点的话,我们可以吧数据均匀分给他们,那么差不多每个worker的运行时间变成了 1 / m 1/m 1/m,当然实际上是不会降到那么低,因为还有同步的时间。这个加速比实际上如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/86f5a0b567949a8dde7ff8b4b247b79b.png)
真实情况加速比实际上是到不了 m m m 的,如果算法或者模型不好,通信时间可能比计算时间要长很多。通信时间由两部分构成,一个是通信复杂度,一个是网络延迟。
![](https://i-blog.csdnimg.cn/blog_migrate/84b58939ed457ae4d5791a5a0d831a9f.png)
还有一部分开销是由同步造成的,因为worker是有快有慢造成的。假如一个节点挂掉了那大家都得等它。
![](https://i-blog.csdnimg.cn/blog_migrate/4fdbb5029fa4009389387dc1ebda0a0b.png)
这种情况下,这个节点就叫做straggler,其会导致钟表时间增大,因为要等这个节点。概括一下,这节课程讲了一下几点:
- 梯度下降可以用 MapReduce 进行并行化。
- 并行化的过程中,数据被分给 worker 进行计算。
- 每一个梯度下降过程包含一个广播、map和一个 reduce 操作。
- 主要有计算代价、通信代价和同步代价。
- 如果有 m m m 个 worker,那么加速比是低于 m m m 的。
欢迎关注公众号《差分隐私》
![](https://i-blog.csdnimg.cn/blog_migrate/6ef288faf7b6ad0cfc4ca76385ac6399.png)