MLHPC 2016 | Communication Quantization for Data-parallel Training of Deep Neural Networks


本文主要研究HPC上進行數據並行訓練的可行性。作者首先在HPC上實現了兩種通信量化算法(1 Bit SGD以及閾值量化),然后提出了自適應量化算法以解決它們的缺點。此外,發揮出量化算法的性能,作者還自己實現了一個Allreduce算法。

1 Bit SGD可以實現良好的重構和較低的誤差,但與閾值量化相比,它的計算開銷更大,並且壓縮率不能達到32倍以上。閾值量化速度很快,但是不同的模型需要設置不同的閾值,而且選擇好的閾值也很困難,並且使用閾值\(\tau\)作為重建值是次優的。如果閾值設置的比較小,那么由於誤差補償的存在,可能會導致傳輸大量的數據。

自適應量化使用固定比例\(\pi\)來表示每次迭代時要發送的梯度更新比例。第一步,自適應量化要確定滿足當前迭代所需比例的正閾值\(\tau^+\)和負閾值\(\tau^-\)。假設梯度向量中有\(k\)個非負值,我們只需要發送其中最大的\(\frac{k}{\pi}\)個值,因此,正閾值\(\tau^+\)就是梯度向量中第\(\frac{k}{\pi}\)個值。一般而言,我們可以通過快速選擇等高效算法,在\(O(N)\)時間內找到第\(\frac{k}{\pi}\)個元素。負閾值的確定與正閾值類似,只不過是選擇梯度向量中最小的\(\frac{k}{\pi}\)個值。注意,正閾值和負閾值都由同一個比例\(\pi\)確定的。同樣,自適應量化需要使用誤差補償技術來防止模型不收斂。在接收端的重建階段,自適應量化分別對大於正閾值\(\tau^+\)和小於負閾值\(\tau^-\)的元素求一個平均值,用這兩個均值分別作為重建向量中的元素。

作者發現原始的MPI_Allreduce接口在傳輸壓縮數據時表現不好,而且使用用戶自定義操作時MPI_Allreduce會退化成recursive-doubling實現,因此他使用原始的MPI_SendMPI_Recv方法實現了一個類似於Ring Allreduce的聚合通信算法。

下面是本文的一些實驗結果。第一幅圖展示了模型中第三個全連接層每次迭代時所發送的數據量。無量化和1 Bit量化的結果符合預期:要么發送完整的梯度矩陣,要么將數據量減少約32倍。自適應量化在\(\pi = 64\)的情況下,我們期望得到與1 Bit量化相似的數據壓縮比。但是由於它使用采樣來近似閾值以排除更新,因此它不能完全實現32倍的壓縮比。但是,只要采樣是一個足夠好的近似值,那么數據量就不會過多或過少。閾值量化即使在\(\tau = 0.001\)的情況下也發送很少的數據,並且發送的數量非常不穩定。這就導致其測試精度明顯低於其他方法,因為每個模型基本上僅從其本地的數據中進行學習。

下面這幅圖展示了不同梯度量化方法的通信時間(同樣是模型中第三個全連接層)。可以看到,閾值量化的通信時間是最短的,因為它只需要傳輸很少的數據。第二快的是傳統的MPI_Allreduce,這是因為量化引入了額外的計算開銷,當某一層本身的計算量較少時,這種額外的計算開銷就會被放大。自適應量化緊隨其后,而且相對於傳統的MPI_Allreduce更加平穩。最慢的是1 Bit量化,因為它有一個額外的AdaGrad操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM