分布式訓練基本原理

2022-02-03 04:10:12 字數 3125 閱讀 3431

分布式訓練基本原理

分布式訓練的並行方式

在分布式訓練過程中,並不是所有的訓練任務都可以拆分,當前常用的拆分方式有如下幾種:

分布式訓練中的模型引數傳遞

雖然訓練任務可以拆分,但是在乙個batch的資料訓練完成後,下乙個batch的資料訓練開始之前,必須先更新worker上的模型引數,因此模型引數的更新傳遞是分布式訓練中非常重要的一環,模型引數資訊的傳遞方式和更新頻率都會直接影響模型的最終效果:

下面先來看下分布式訓練的架構。

分布式訓練架構

在分布式訓練的兩種常用架構中, collective架構多被用於視覺、自然語言處理等需要複雜網路計算的模型訓練任務場景,而引數伺服器架構多被用於搜尋推薦場景中大規模稀疏特徵模型的訓練任務。下面會分別具體介紹下這兩種架構。

引數伺服器架構

引數伺服器架構是一種中心化架構,該架構採用將模型引數進行中心化管理的方式實現模型引數的更新和分發。引數伺服器架構有兩個角色server與worker,值得注意的是,server與worker不一定對應實際的硬體,可以理解為是程序。server負責引數的分片儲存與更新,worker則會儲存有完整的模型網路結構,用於執行模型的前向與反向計算。常規的引數伺服器的worker節點,需要使用統一型號的cpu或gpu機器完成模型訓練。

每個worker在執行每一步訓練時,都可以向引數伺服器發出請求,獲取全域性最新的模型引數,並基於最新的模型引數計算當前資料的模型梯度。當worker基於最新的模型引數完成模型梯度的計算後,會將模型梯度發回給server。引數伺服器架構通常可以對模型引數的儲存進行分布式儲存,因此對於儲存超大規模模型引數的訓練場景十分友好,這也是該架構在個性化推薦場景中,應該任務中需要儲存的海量稀疏特徵對應的模型引數,通常就只能採用引數伺服器架構才能實現。

collective架構

collective架構是一種去中心化的架構,也是近年來非常流行的分布式訓練架構。該架構沒有所謂管理模型引數的中心節點,每個裝置都是worker,這個worker同樣是程序的概念。每個worker負責模型的訓練同時還需要掌握當前最新的全域性資訊。

在collective架構中,多節點間的引數資訊的傳輸通常是各個worker之間多次點對點通訊完成的,比較經典的通訊演算法,例如baidu ring

all reduce,可以採用較少的點對點通訊輪數完成全域性節點的模型引數傳輸。collective架構通常在現代高效能ai晶元中使用較多,這種架構對計算晶元的算力和晶元之間的網路互聯要求較高。高效能計算的ai晶元例如gpu,晶元之間的高速網路互聯例如nvlink, infiniband,都加快的collective架構的發展。collective訓練架構對於計算密集的任務非常友好,熟知的經典模型,例如機器翻譯中的transformer,影象分類中的resnet50,語音識別中的deepspeech2通常都是採用這種訓練架構完成。

引數更新頻率

如前所述,引數同步的方式與訓練架構的選取有關,即是統一由server更新和分發,還是worker間相互同步,這是關係到訓練效果的重要因素之一,而另乙個因素就是引數同步的頻率,即什麼時候同步引數,使用者同樣可以選擇兩種方式的一種,即同步和非同步,下面將會分布進行介紹。

同步訓練

同步訓練通常是指每個worker在模型訓練的每一步都進行一次模型引數的全域性更新,引數伺服器架構和collective架構都可以採用這種方式。這種方式在本質上與單機訓練一致,只是單步訓練的總資料量會更大。值得一提的是,在引數伺服器架構下的同步訓練,優化演算法的執行是發生在引數伺服器一端,而在collective架構下,通過對每一步所有樣本產生的模型引數梯度進行全域性同步後,由每個worker執行優化演算法,相當於優化了全域性的模型引數。下圖展示了單機sgd演算法,基於collective架構的同步sgd演算法,基於引數伺服器的非同步sgd演算法在計算步驟上的區別。可以看到collective架構發生通訊的位置比較集中,並行是通過與正在訓練的其他節點進行collective通訊完成,每個節點只需要關注自己即可。引數伺服器架構在獲取引數,推送引數梯度等操作上都需要與引數伺服器進行通訊,引數伺服器架構下的引數伺服器端,要等待每個計算節點傳送的梯度資訊進行彙總後再進行模型引數的更新。

非同步並行訓練演算法

非同步訓練在引數伺服器架構下採用較多,其本質就是讓每個worker不用關心其他節點的計算步調,獨自與引數伺服器完成模型引數的更新。非同步訓練情況下,引數伺服器端的模型引數更新也是非同步進行,即不需要等待其他正在計算的節點的進度。非同步訓練下,各個計算節點的計算頻率不同,引數伺服器更新模型引數的頻率也會不同,這種特性使得模型的收斂可能存在一定的問題,能夠保證高效率收斂的非同步並行演算法是乙個研究比較多的領域。下圖是乙個單機sgd與引數伺服器架構下的非同步sgd的計算步驟對比,可以看到引數伺服器一端與同步sgd的區別在於,不需要對各個節點的梯度進行匯聚而直接進行模型引數的更新。

飛槳paddle分布式api

儘管分布式訓練能夠大大提公升使用者在大規模資料下的模型訓練速度,如前面背景知識的描述可知普通使用者想快速掌握並行訓練的方法並不容易,將飛槳paddle的單機訓練程式轉換成多機訓練程式會給使用者帶來一定的使用成本。為了降低使用者使用分布式訓練的門檻,飛槳paddle官方支援分布式訓練高層api fleet,作為分布式訓練的統一入口api,使用者可以在單機程式的基礎上進行簡單的幾行**修改,可實現多種型別的並行訓練方式。後面結合fleet api介紹飛槳paddle資料並行方法,在引數伺服器架構和collective架構下,使用方法以及具體模型上的使用示例。

mysql的基本原理 Mysql 基本原理

mysql 基本原理 mysql是一種關聯式資料庫管理系統,關聯式資料庫將資料儲存在不同的表中,而不是將所有資料放在乙個大倉庫內,這樣就增加了速度並提高了靈活性 ysql是資料庫登入命令 uroot預設超級使用者登入 p 預設沒密碼 中寫密碼 mysqladmin uroot password 12...

8 2 1 基本原理

乙個舞台動畫物件在包含許多舞台資訊 出現在何處,佔多大面積,處在什麼角度,是否可見 這些資訊分別儲存在動畫物件的屬性中。在 中讀取這些屬性可以了解物件的位置 大小 角度等狀態資訊 修改這些屬性可以改變物件的位置 大小 角度等狀態。如果從資料的角度去理解,動畫就是在固定時間間隔點不斷修改動畫物件某項屬...

Csocket基本原理

我通過幾個採用 csocket 類編寫並基於 client server 客戶端 服務端 的網路聊天和傳輸檔案的程式 在除錯這些程式的過程中,追蹤深入至 csocket 類核心原始碼 sockcore.cpp 對於csocket 類的執行機制可謂是一覽無遺,並且對於阻塞和非阻塞方式下的 socket...