Accelerate 文件
比較不同分散式設定下的效能
並獲得增強的文件體驗
開始使用
比較不同分散式設定下的效能
如果你不知道要關注什麼,評估和比較不同設定下的效能可能會非常棘手。例如,你不能在 TPU、多 GPU 和單 GPU 上使用 Accelerate 執行具有相同批次大小的相同指令碼,並期望結果一致。
但為什麼會這樣呢?
本教程將涵蓋三個原因:
- 設定正確的種子
- 觀察到的批次大小
- 學習率
設定種子
雖然這個問題不常出現,但請確保使用 utils.set_seed() 在所有分散式情況下完全設定種子,以確保訓練是可復現的。
from accelerate.utils import set_seed
set_seed(42)
為什麼這很重要?在底層,這會設定 5 個不同的種子設定:
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed) # or torch.xpu.manual_seed_all, etc
# ^^ safe to call this function even if cuda is not available
if is_torch_xla_available():
xm.set_rng_state(seed)
`random` 狀態、numpy 狀態、torch、torch 的裝置狀態,以及如果 TPU 可用,則還有 torch_xla 的 cuda 狀態。
觀察到的批次大小
當使用 Accelerate 進行訓練時,傳遞給資料載入器(dataloader)的批次大小是 每個 GPU 的批次大小。這意味著在兩個 GPU 上,批次大小為 64,實際上等同於總批次大小為 128。因此,在單 GPU 上測試時需要考慮到這一點,TPU 的情況也類似。
下表可作為快速參考,用於嘗試不同的批次大小。
在本例中,“多 GPU” 指的是兩個 GPU,而 TPU pod 有 8 個工作程序。
單 GPU 批次大小 | 等效的多 GPU 批次大小 | 等效的 TPU 批次大小 |
---|---|---|
256 | 128 | 32 |
128 | 64 | 16 |
64 | 32 | 8 |
32 | 16 | 4 |
學習率
正如多個資料[1][2]所指出的,學習率應根據裝置數量進行線性縮放。以下程式碼片段展示瞭如何使用 Accelerate 實現這一點。
由於使用者可以定義自己的學習率排程器,我們把是否縮放學習率的決定權留給使用者。
learning_rate = 1e-3
accelerator = Accelerator()
learning_rate *= accelerator.num_processes
optimizer = AdamW(params=model.parameters(), lr=learning_rate)
你還會發現,`accelerate` 會根據訓練的程序數量來調整學習率的步進。這是因為前面提到的觀察到的批次大小。因此,在 2 個 GPU 的情況下,學習率的步進頻率將是單個 GPU 的兩倍,以適應大兩倍的批次大小(如果單 GPU 例項的批次大小沒有改變)。
梯度累積和混合精度
在使用梯度累積和混合精度時,由於梯度平均的工作方式(累積)和精度損失(混合精度),預計效能會有所下降。在比較不同計算設定之間的逐批次損失時,這一點會很明顯。然而,在訓練結束時,總損失、評估指標和整體效能應該是大致相同的。
< > 在 GitHub 上更新