1.簡介
TensorFlow可以很容易地利用單個GPU加速深度學習模型的訓練過程,但要利用更多的GPU或者機器,需要了解如何並行化訓練深度學習模型。常用的並行化深度學習模型訓練方式有兩種,同步模式和異步模式。
2.兩種模式的區別
為幫助讀者理解這兩種訓練模式,首先簡單回顧一下如何訓練深度學習模型。下圖展示了深度學習模型的訓練流程圖。深度學習模型的訓練是一個迭代的過程。在每一輪迭代中,前向傳播算法會根據當前參數的取值計算出在一小部分訓練數據上的預測值,然后反向傳播算法再根據損失函數計算參數的梯度並更新參數。在並行化地訓練深度學習模型時,不同設備(GPU或CPU)可以在不同訓練數據上運行這個迭代的過程,而不同並行模式的區別在於不同的參數更新方式。
2.1 異步模式
下圖展示了異步模式的訓練流程圖。可以看到,在每一輪迭代時,不同設備會讀取參數最新的取值,但因為不同設備讀取參數取值的時間不一樣,所以得到的值也有可能不一樣。根據當前參數的取值和隨機獲取的一小部分訓練數據,不同設備各自運行反向傳播的過程並獨立地更新參數。可以簡單地認為異步模式就是單機模式復制了多份,每一份使用不同的訓練數據進行訓練。在異步模式下,不同設備之間是完全獨立的。
然而使用異步模式訓練的深度學習模型有可能無法達到較優的訓練效果。下圖中給出了一個具體的樣例來說明異步模式的問題。其中黑色曲線展示了模型的損失函數,黑色小球表示了在to時刻參數所對應的損失函數的大小。假設兩個設備do和d1在時間to同時讀取了參數的取值,那么設備do和d1計算出來的梯度都會將小黑球向左移動。假設在時間t1設備do已經完成了反向傳播的計算並更新了參數,修改后的參數處於圖中小灰球的位置。然而這時的設備d1並不知道參數已經被更新了,所以在時間t2時,設備d1會繼續將小球向左移動,使得小球的位置達到圖中小白球的地方。從圖中可以看到,當參數被調整到小白球的位置時,將無法達到最優點。
2.2 同步模式
為了避免更新不同步的問題,可以使用同步模式。在同步模式下,所有的設備同時讀取參數的取值,並且當反向傳播算法完成之后同步更新參數的取值。單個設備不會單獨對參數進行更新。而會等待所有設備都完成反向傳播之后再統一更新參數。下圖展示了同步模式的訓練過程。可以看出,在每一輪迭代時,不同設備首先統一讀取當前參數的取值,並隨機獲取一部分數據。然后在不同設備上運行反向傳播過程得到在各自訓練數據上參數的梯度。注意雖然所有設備使用的參數是一致的,但是因為訓練數據不同,所以得到參數的梯度就有可能不同。當所有設備完成反向傳播的計算之后,需要計算出不同設備上參數梯度的平均值,最后再根據平均值對參數進行更新。
同步模式解決了異步模式中存在的參數更新問題,然而同步模式的效率卻低於異步模式。在同步模式下,每一輪迭代都需要設備統一開始、統一結束。如果設備的運行速度不一致,那么每一輪訓練都需要等待最慢的設備結束才能開始更新參數,於是很多時間將被花在等待上。雖然理論上異步模式存在缺陷,但因為訓練深度學習模型時使用的隨機梯度下降本身就是梯度下降的一個近似解法,而且即使是梯度下降也無法保證達到全局最優值,所以在實際應用中,在相同時間內,使用異步模式訓練的模型不一定比同步模式差。所以這兩種訓練模式在實踐中都有非常廣泛的應用。