One weird trick for parallelizing convolutional neural networks,alex的一篇新作品。
首先:文中正式提到,卷积层参数占了5%,但是计算时间占据了90%-95%;而全连接层,参数占据了95%,计算时间却只有5%-10%,这个其实是和我在跑别的模型时的时间是一致的,组里同事一直说是全连接层计算时间长,后来看到caffe里有人提到要把fft代替卷积加速计算实现了,就觉得肯定是卷积层计算时间长,只是一直没找到时间去打log测试具体数据。
如题,主要是并行CNN,多个GPU之间的并行处理。
并行分为两种,数据并行和模型并行。
模型并行,处理同样的数据,将模型分为几个部分。imagenet2012 alex的双GPU算是模型并行吧。
数据并行,是指同样规模的模型,训练不同的数据。
从并行角度来看,卷积适合数据并行,而全连接适合模型并行。
这个也就是我们最近看了很多文章的一个中心,就是卷积层将图像的空间特性保留的比较好,而全连接层就不具有这个特征。正是因为这个特点,卷积层将数据并行处理,才会对整体效果影响较小吧。而全连接层,其实就是分类器,出来的是相对较高层抽象的特征,并不具备了空间特性。因此,这一层如果是模型并行会效果更好。
文章中,正是使用的这种特性,在卷积层上利用了数据并行,而全连接层是模型并行。
具体在并行过程中,怎么进行呢?
作者分为两部分进行介绍,首先是forward propagation,这一过程的并行,尤其是到了卷积层的并行可以有多种方式:
1. 所有层的参数共享后,进行计算forward 再计算backward。
2. 只有一层将参数发给别的所有workers,然后计算forward,计算相应batch(128)的backward;同样,另外一个batch的worker,将数据分发为其它所有workers,计算forward,然后再是backward,更新了另外一个batch的workers。
3. 每次只将128/K个的参数传给别的所有workers,然后和2中一样计算forward和backward,分别更新每一个worker。
分析一下,第一种方式,需要等待所有的workers,这样将很占存储。。。。
第二种方式,第二种相对有效。
第三种,在不同worker之间均有通信。
而在backward阶段,类似分析(待续)
权重同步
基本上的思路就是,每一个worker更新了1/k的梯度矩阵。
batch size
128K,卷积层相当于batch=128K,而全连接层是128。
实现阶段(待续):
重点介绍了权重更新的过程,赶快找时间看看原始的2012的文章,然后再回头看这一部分,期待我们同事能先讲解。