Optimum 文件

加速訓練

您正在檢視的是需要從原始碼安裝。如果您想進行常規的 pip 安裝,請檢視最新的穩定版本 (v1.27.0)。
Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

加速訓練

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 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.