训练加速主要针对并行加速
1. 基于数据的并行
1.1 模型平均
假设我们有10000条数据,分为10块,一块1000条数据。
又假设我们有10个GPU并行训练10块数据,那么我们要想方设法让他们彼此交流。假设10个GPU的参数矩阵都初始为 w 0 w_{0} w0,每个GPU都采用batch=100.
在第一轮训练之后,10个GPU有了10个不同的 w 1 w_{1} w1, 分别传回到server。然后server做平均得到一个统一的 w 1 ˉ \bar{w_{1}} w1ˉ。然后统一返回平均好的 w 1 ˉ \bar{w_{1}} w1ˉ。
然后做第二个batch,算出10个 w 2 w_{2} w2, 然后上传,平均,返回。
【注意,这个方案中,必须要等每一个GPU都算完同一个batch,上传所有10个参数矩阵后,再做平均。这样就产生了同步的瓶颈,所以要10个GPU要尽量性能相近,几乎同时得到batch训练结果】
1.2 同步随机梯度下降
同步随机梯度下降其实也使用了类似的思路,只不过每个client上传的是GPU在当前batch算出的梯度 Δ w 1 \Delta w_{1} Δw1,10个梯度上传到server,然后做平均,返回平均的梯度 Δ w 1 ˉ \Delta \bar{w_{1}} Δw1ˉ,再做更新。
1.3 异步随机梯度下降
异步梯度下降有所不同
还是以上server和clients的情况。在server给了10个GPU初始参数 w 0 w_0 w0后,假设10个GPU从左到右依次计算性能下降。那么client1首先算出一个梯度,然后上传,server上的 w 0 w_0 w0首先根据第一个梯度算出新的参数 w 11 w_{11} w11,然后把新算出的参数返回client1,开始在client1上第二个batch的训练。然后第二个client算出了第一个batch的梯度,然后上传,server上已经更新的参数 w 11 w_{11} w11就根据这个梯度进行更新,得到新的参数 w 12 w_{12} w12,然后把这个 w 12 w_{12} w12返回到client2,进行第二个batch的训练。继续依次让其他client上传各自的梯度,server都根据上一个client的梯度算好的参数继续更新。
这样就大大提高了更新速度,突破了同步更新的瓶颈。
2.基于模型的并行
不同GPU负责不同神经网络隐藏层之间的参数矩阵的运算。比如第一二层之间的参数由GPU1算,第二三层之间的参数由GPU2算。
但是用得不多。