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的文章,然後再回頭看這一部分,期待我們同事能先講解。