大規模訓練

激活重算(activation recomputation)

反向傳播需要每一層前向時的激活才能算出其梯度,所以最樸素的做法是把它們全部存下來——而對序列又長、又深的 transformer 來說,這份激活記憶體遠大於權重。激活重算打破了「必須保留它們」這個前提。你不再儲存每個中間張量,而只存少數幾個檢查點(通常是每個 transformer 區塊的輸入),並在反向時,從最近的檢查點重跑前向數學,即時重算出被丟棄的激活。

這筆交易很明白:你多付一次對重算區段的前向過程——對 transformer 約多三分之一的計算——換來把激活記憶體從「隨深度線性成長」降到「每個檢查點近乎常數」。選擇性重算進一步精算這筆帳:把「易存、難重算」的張量(如注意力 softmax 輸出)存下來、只重算「易重算」的那些,以一小部分開銷收回大半記憶體。它能與每種平行策略組合,並且對管線平行不可或缺——否則其在飛行中的微批次會同時釘住太多組激活。

激活重算是大型訓練中以記憶體換計算的標準旋鈕。誠實的提醒是,多出的前向工作會直接拉低硬體利用率,因此實務上只重算記憶體預算逼你重算的份量——走投無路時全重算,有空間時就選擇性重算。

重算必須完全重現原本的前向,因此任何隨機性(dropout 遮罩、RNG 狀態)都要存下並重放——否則重算的激活會與前向不一致,梯度就會悄悄出錯。

又称
activation checkpointinggradient checkpointing激活重算激活檢查點