Optimum 文件
加速訓練
並獲得增強的文件體驗
開始使用
加速訓練
Gaudi 提供了多種加速訓練的可能性。它們相互相容,並且可以與 分散式訓練結合使用。
執行模式
支援以下執行模式
- 惰性模式:操作在圖中累積,其執行以惰性方式觸發。這允許圖編譯器最佳化這些操作的裝置執行。
- 即時模式:一次執行一個操作。
- 即時模式結合 torch.compile:模型(或模型的一部分)被封裝在一個圖中。
並非所有模型都支援即時模式和結合 torch.compile 的即時模式(仍在開發中)。惰性模式是預設模式。
在惰性模式下,圖編譯器會生成最佳化的二進位制程式碼,用於在 Gaudi 上實現給定的模型拓撲。它執行運算子融合、資料佈局管理、並行化、流水線和記憶體管理,以及圖級最佳化。
要在惰性模式下執行訓練,您必須提供以下訓練引數
args = GaudiTrainingArguments(
# same arguments as in Transformers,
use_habana=True,
use_lazy_mode=True,
gaudi_config_name=path_to_my_gaudi_config
)
在惰性模式下,預設情況下,最後一個批次會填充額外樣本,使其與之前的批次具有相同的維度。這可以避免訓練期間額外的圖編譯。您也可以使用 dataloader_drop_last=True
丟棄最後一個批次。
在惰性模式下,前兩到三次訓練迭代可能會因為圖編譯而變慢。為了在訓練結束時計算吞吐量時不考慮它們,您可以新增以下訓練引數:throughput_warmup_steps=3
。
混合精度訓練
混合精度訓練允許使用較輕的資料型別計算某些操作以加速訓練。適用於 Intel Gaudi 的 Optimum 以類似於 🤗 Transformers 的方式實現混合精度訓練
- 引數
--bf16
啟用 PyTorch 自動型別轉換 - 引數
--half_precision_backend [hpu_amp, cpu_amp]
用於指定應執行混合精度操作的裝置
有關 Gaudi 上高階自動型別轉換用法的更多資訊,請參閱此連結
- 預設自動型別轉換操作
- 預設自動型別轉換操作重寫
HPU 圖
PyTorch 的靈活性是有代價的——通常相同的 Python 邏輯在每個訓練步驟中一遍又一遍地處理。這可能導致 CPU 排程 Gaudi 上的工作比實際由 Gaudi 計算的時間更長。為了應對這種主機繫結工作負載,您可能希望嘗試啟用 *HPU 圖*功能,該功能一次記錄計算圖,然後只觸發它多次執行以實現更快的速度。
為此,請指定 --use_hpu_graphs_for_training True
。此選項會將模型包裝在 habana_frameworks.torch.hpu.ModuleCacher
中,該模型會自動記錄模型的 *HPU 圖*。
對於多工作器分散式訓練,您還需要指定 --distribution_strategy fast_ddp
。此選項將 torch.nn.parallel.DistributedDataParallel
的使用替換為更簡單且通常更快的 optimum.habana.distributed.all_reduce_gradients
。
謹慎使用:目前用於訓練的 HPU 圖可能不支援所有可能的情況。然而,潛在的效能提升可能非常顯著!
快速 DDP
對於在多個裝置上進行的分散式訓練,您還可以指定 --distribution_strategy fast_ddp
。此選項將 torch.nn.parallel.DistributedDataParallel
的使用替換為更簡單且通常更快的 optimum.habana.distributed.all_reduce_gradients
。
前向和後向傳播流水線
在 Intel Gaudi HPU 上執行模型有兩個階段:CPU 上的 Python 程式碼解釋和 HPU 方案計算。HPU 計算階段可以手動觸發,或者在請求複製到 CPU 時觸發,通常 HPU 計算在 loss.backward()
之後觸發,以使 CPU 程式碼解釋和 HPU 方案計算重疊,如下圖所示
CPU:...forward + backward ...optimizer ...forward + backward ...optimizer ...
HPU:........................forward + backward...optimizer......forward + backward...optimizer
然而,當 CPU 程式碼解釋花費的時間長於 HPU 計算時,它就成為瓶頸,HPU 計算無法在 CPU 程式碼解釋完成之前觸發。因此,對於這種情況,一個潛在的最佳化是在 CPU 前向解釋之後和 CPU 後向解釋之前立即觸發 HPU 前向計算。您可以在下面的示例中看到,CPU 後向解釋與 HPU 前向計算重疊
CPU:...forward ...backward ...optimizer ...forward ...backward ...optimizer ...
HPU:.............forward.......backward......optimizer......forward.....backward.......optimizer
要啟用此最佳化,您可以設定以下訓練引數 --pipelining_fwd_bwd True
。
我們**建議在 Gaudi2 上使用它**,因為主機通常是瓶頸。您也應該能在第一代 Gaudi 上看到加速,但它會比 Gaudi2 上的不那麼顯著,因為您的執行更可能受到 HPU 限制。
此外,*當訓練需要大量裝置記憶體的模型時*,我們建議停用此最佳化,因為它*會增加 HPU 記憶體使用*。
使用更多 Worker 進行資料載入
如果資料載入器的工作負載很重,您可以增加 worker 數量以加快執行速度。您可以透過訓練引數 --dataloader_num_workers N
啟用此功能,其中 N
是要使用的 worker 數量。
我們**建議將其與包含影像的資料集一起使用。**此外,在大多數情況下,使用 --dataloader_num_workers 1
會有所幫助,因為它可以在與主執行緒不同的執行緒中載入資料。
非阻塞資料複製
此最佳化非常適合將資料從主機複製到裝置成本較高的模型(例如,ViT 或 Swin 等視覺模型)。您可以透過訓練引數 --non_blocking_data_copy True
啟用此功能。
我們**建議在 Gaudi2 上使用此功能**,因為主機可以繼續執行其他任務(例如,圖構建),以更好地實現主機和裝置之間的流水線。在第一代 Gaudi 上,裝置執行時間較長,因此不應期望獲得任何加速。
自定義運算子
Intel Gaudi 提供了一些自定義運算子,它們在 Gaudi 上比 PyTorch 對應的運算子具有更好的效能。您還可以按照此處的描述為 Gaudi 定義自己的自定義運算子。
融合 ADAM
Intel Gaudi 提供了一個自定義融合 ADAM 實現。可以透過在 Gaudi 配置檔案中指定 "use_fused_adam": true
來使用它。
Intel Gaudi 融合 ADAM 最佳化器的預設 epsilon 值為 1e-6
,而 torch.optim.AdamW
的預設 epsilon 值為 1e-8
。
融合梯度範數剪裁
Intel Gaudi 提供了一個自定義梯度範數剪裁實現。可以透過在 Gaudi 配置檔案中指定 "use_fused_clip_norm": true
來使用它。
Gaudi 最佳化的 Flash Attention
支援用於惰性模式和即時模式的帶有額外 Intel® Gaudi® AI 加速器最佳化的 Flash Attention 演算法。請參閱使用融合縮放點積注意力 (FusedSDPA)。
跟蹤記憶體使用情況
每 logging_steps
(預設為 500)步顯示即時記憶體統計資訊
memory_allocated (GB)
指的是*當前*記憶體消耗(以 GB 為單位),max_memory_allocated (GB)
指的是執行期間達到的*最大*記憶體消耗(以 GB 為單位),total_memory_available (GB)
指的是裝置上可用的*總*記憶體(以 GB 為單位)。
這些指標可以幫助您調整執行的批次大小。
在分散式模式下,記憶體統計資訊僅由主程序通訊。
您可以檢視 Intel Gaudi AI 加速器官方文件,瞭解有關記憶體統計資訊 API 的更多資訊。
< > 在 GitHub 上更新