機器學習工程與系統
分散式訓練(distributed training)
/ dis-TRIB-yoo-ted TRAY-ning /
分散式訓練,就是把一次訓練任務攤到許多晶片、乃至許多台機器上,好讓它在合理時間內跑完。設想一本巨大的帳簿,一位會計要算上一整年才能合計完。雇上一百名會計,每人發一疊頁面,讓他們時不時核對一下各自的累計數——同樣的活,如今幾天就完了。把會計換成 GPU 或 TPU,把帳簿換成神經網路的參數,這就是分散式訓練。
難點在於協調。每塊晶片各自在自己那一份上計算,然後它們必須就一個共享的結果達成一致,這意味著要在彼此之間、不停地透過網路來回搬運數字。這種通訊純屬額外開銷:時間花在「交流」而非「計算」上。所以晶片翻倍,速度從來到不了翻倍;過了某個點,再加晶片甚至會拖慢進度,因為晶片花在同步上的時間,比花在做活上的還多。工程師拼命想讓通訊與計算彼此重疊,並盡量壓縮需要交換的資料量。
為什麼這很重要:最大的那些模型根本沒有別的訓練辦法——它們大得塞不進單塊晶片的記憶體,在單台設備上更要算上幾輩子。分散式訓練正是讓今天前沿模型成為可能的東西。但要把它做好,是真的很難:一台慢吞吞或當掉的機器,就能讓整個叢集停擺;成本隨著每一個「晶片小時」一路累加;而在鋪開到數百個節點上的任務裡排查問題,遠比在一台電腦上修程式要棘手得多。
用 256 塊 GPU 訓練,理想情況下應比用一塊快 256 倍。可現實裡你也許只看到 200 倍:缺掉的那 56 倍,都消失在每一步之後晶片間同步參數所耗的時間裡了。
接近線性,卻永遠不會完全線性——通訊開銷,是你總得繳的那筆稅。
機器越多,並不總意味著訓練越快。存在一個邊際收益遞減的臨界點:在那裡,讓所有機器保持同步的代價,會蓋過多出來那雙手帶來的好處。手藝在於找到那個甜點,而不是一味往問題上砸硬體。
又稱
另見