資料、模型與管線並行(data, model, and pipeline parallelism)
/ DAY-tuh, MOD-ul, and PIPE-line PAR-uh-lel-iz-um /
這是把訓練任務拆到許多晶片上的三種主要辦法,每一種回答的是不同的問題。想像一張巨大的餐廳訂單。資料並行最簡單:給每位廚師同一份完整食譜,卻發給不同批次的食材,到頭來大家再對一對帳。每塊晶片都拿著模型的一份完整副本,各自處理訓練樣本中不同的一塊,然後把學到的東西平均起來。
模型並行(常叫張量並行)則用於食譜本身大得一個廚師腦子都裝不下時。你把一道菜拆給好幾位廚師——一個切配、一個煎炒、一個擺盤——也就是把模型的層、甚至單獨一層切開攤到晶片上,每塊晶片只拿著網路的一小片。管線並行則是那條裝配線:廚師甲永遠做頭道,遞給廚師乙做第二道,依此類推;模型被切成一段段先後相連的階段,每段住在不同晶片上,資料像生產線上的汽車那樣一路流過去。
為什麼這很重要:今天最大的模型,對任何單塊晶片都太大了,所以這三種通常一齊上陣——這才是「在一千塊 GPU 上訓練一個模型」背後真正的含義。誠實的權衡在於:每一種策略都會添上通訊與複雜度。管線並行尤其會在每批的開頭和結尾讓晶片閒著(所謂「氣泡」),等管線灌滿又排空。選對它們的搭配,是一樁精細的平衡活,取決於模型的形狀、硬體,以及把這一切串起來的網路。
一個單塊 GPU 裝不下的模型,被切成 4 份(模型並行),又排成 4 個階段(管線)。然後把這整套 4 晶片的配置複製 64 遍,每一份餵以不同的樣本(資料並行)——256 塊晶片,三種策略一齊上。
真實的前沿訓練把三種一齊糅在一起——這種布局是常態,而非例外。
資料並行很省事,可一旦模型本身已經塞不進單塊晶片的記憶體,它就毫無用處了——到處複製根本不可能。正是那堵「記憶體牆」,讓模型並行與管線並行有了存在的理由,哪怕它們搭起來更費事。