加速視覺-語言模型:Habana Gaudi2上的BridgeTower

釋出日期:2023年6月29日
在 GitHub 上更新

更新(2023年8月29日):此部落格文章已新增H100的基準測試。此外,所有效能資料均已更新為較新版本的軟體。

Optimum Habana v1.7 在 Habana Gaudi2 上,微調BridgeTower(一種最先進的視覺-語言模型)時,速度比A100快2.5倍,比H100快1.4倍。這種效能提升依賴於硬體加速的資料載入,以充分利用您的裝置。

這些技術適用於任何受資料載入限制的其他工作負載,這對於許多型別的視覺模型來說是常見情況。本文將向您介紹我們用於比較Habana Gaudi2、Nvidia H100和Nvidia A100 80GB上BridgeTower微調的過程和基準測試。它還展示了在基於transformers的模型中利用這些功能是多麼容易。

BridgeTower

最近,視覺-語言(VL)模型在各種VL任務中獲得了極大的重要性並展現出主導地位。最常見的方法是利用單模態編碼器從各自的模態中提取表示。然後,這些表示要麼融合在一起,要麼饋送到跨模態編碼器中。為了有效處理VL表示學習中的一些效能限制和制約,BridgeTower引入了多個橋接層,它們在單模態編碼器的頂層和跨模態編碼器的每一層之間建立連線。這使得在跨模態編碼器中,視覺和文字表示能夠在不同語義級別上進行有效的自下而上的跨模態對齊和融合。

BridgeTower僅使用4M張影像進行預訓練(詳見下文),在各種下游視覺-語言任務中實現了最先進的效能。特別是,BridgeTower在VQAv2測試-標準集上實現了78.73%的準確率,比之前的最先進模型(METER)高1.09%,並且使用相同的預訓練資料,額外引數和計算成本幾乎可以忽略不計。值得注意的是,當進一步擴充套件模型時,BridgeTower實現了81.15%的準確率,超越了在數量級更大的資料集上預訓練的模型。

硬體

NVIDIA H100 Tensor Core GPU 是Nvidia GPU的最新、最快一代。它包含一個專用的Transformer引擎,可實現fp8混合精度執行。一個裝置有80GB記憶體。

Nvidia A100 Tensor Core GPU 包含了第三代Tensor Core技術。它仍然是您在大多數雲提供商那裡能找到的最快的GPU。我們在這裡使用的是80GB記憶體版本,它也比40GB版本提供更快的記憶體頻寬。

Habana Gaudi2是Habana Labs設計的第二代AI硬體加速器。單個伺服器包含8個加速器裝置,稱為HPU,每個裝置擁有96GB記憶體。請檢視我們之前的部落格文章,瞭解更深入的介紹以及如何透過Intel Developer Cloud訪問它的指南。與市場上許多AI加速器不同,利用Optimum Habana,應用高階功能以充分利用Gaudi2非常簡單,Optimum Habana使使用者只需更改兩行程式碼即可將Transformers相容指令碼移植到Gaudi。

基準測試

為了對訓練進行基準測試,我們將微調一個包含8.66億引數的BridgeTower Large檢查點。該檢查點在Conceptual CaptionsSBU CaptionsMSCOCO CaptionsVisual Genome上使用掩碼語言建模、影像-文字匹配和影像-文字對比損失進行預訓練。

我們將在New Yorker Caption Contest資料集上進一步微調此檢查點,該資料集包含《紐約客》的卡通畫和投票最多的標題。

所有加速器的超引數均相同。我們為每個裝置使用了48個樣本的批次大小。您可以此處檢視Gaudi2的超引數,此處檢視A100的超引數。

處理涉及影像的資料集時,資料載入通常是瓶頸,因為許多耗時操作在CPU上計算(影像解碼、影像增強),然後將完整影像傳送到訓練裝置。理想情況下,我們希望只將原始位元組傳送到裝置,然後在裝置上執行解碼和各種影像轉換。但我們首先來看看如何輕鬆分配更多資源用於資料載入,從而加速您的執行。

利用 dataloader_num_workers

當影像載入在CPU上完成時,加快速度的一種快速方法是為資料載入分配更多的子程序。使用Transformers的TrainingArguments(或其Optimum Habana對應物GaudiTrainingArguments)可以非常容易地做到這一點:您可以使用dataloader_num_workers=N引數來設定分配給CPU用於資料載入的子程序數(N)。

預設值為0,這意味著資料在主程序中載入。這可能不是最佳的,因為主程序需要管理很多事情。我們可以將其設定為1,以便有一個完全專用的子程序用於資料載入。當分配多個子程序時,每個子程序將負責準備一個批次。這意味著RAM消耗將隨著工作程序數量的增加而增加。一個建議是將其設定為CPU核心數,但這些核心可能並非完全空閒,因此您需要嘗試才能找到最佳配置。

讓我們執行以下三個實驗:

  • 在8個裝置上分散式執行的混合精度(bfloat16/float32)執行,資料載入由與其他所有操作相同的程序執行(即dataloader_num_workers=0
  • 一個混合精度(bfloat16/float32)執行,分佈在8個裝置上,有一個專用子程序用於資料載入(即dataloader_num_workers=1
  • 使用 dataloader_num_workers=2 的相同執行

以下是我們從 Gaudi2、H100 和 A100 獲得的資料吞吐量

裝置 dataloader_num_workers=0 dataloader_num_workers=1 dataloader_num_workers=2
Gaudi2 HPU 601.5 樣本/秒 747.4 樣本/秒 768.7 樣本/秒
H100 GPU 336.5 樣本/秒 580.1 樣本/秒 602.1 樣本/秒
A100 GPU 227.5 樣本/秒 339.7 樣本/秒 345.4 樣本/秒

我們首先看到,在dataloader_num_workers=2的情況下,Gaudi2比H100快1.28倍;在dataloader_num_workers=1的情況下,快1.29倍;在dataloader_num_workers=0的情況下,快1.79倍。Gaudi2也比上一代快得多,在dataloader_num_workers=2的情況下,它比A100快2.23倍;在dataloader_num_workers=1的情況下,快2.20倍;在dataloader_num_workers=0的情況下,快2.64倍,這甚至比我們之前報告的速度提升還要好!

其次,我們看到為資料載入分配更多資源可以輕鬆帶來速度提升:Gaudi2上提高1.28倍,H100上提高1.79倍,A100上提高1.52倍。

我們還進行了多次資料載入專用子程序的實驗,但所有加速器的效能均未優於 dataloader_num_workers=2。因此,使用 dataloader_num_workers>0 通常是加速涉及影像的執行的良好第一步!

Gaudi2的Tensorboard日誌可在此處檢視,A100的Tensorboard日誌可在此處檢視

利用Optimum Habana進行硬體加速資料載入

為了獲得更大的速度提升,我們現在將盡可能多的資料載入操作從CPU轉移到加速器裝置(即Gaudi2上的HPU或A100/H100上的GPU)。這可以在Gaudi2上使用Habana的媒體管線來實現。

給定一個數據集,大多數資料載入器遵循以下步驟:

  1. 獲取資料(例如,您的JPEG影像儲存在磁碟上的位置)
  2. CPU 讀取編碼影像
  3. CPU解碼影像
  4. CPU應用影像轉換以增強影像
  5. 最後,影像被髮送到裝置(儘管這通常不是由資料載入器本身完成的)

與其在CPU上完成整個過程並將準備好的訓練資料傳送到裝置,更高效的工作流程是首先將編碼影像傳送到裝置,然後執行影像解碼和增強

  1. 與之前相同
  2. 與之前相同
  3. 編碼影像被髮送到裝置
  4. 裝置解碼影像
  5. 裝置應用影像變換以增強影像

這樣我們就可以利用裝置的計算能力來加速影像解碼和轉換。請注意,這樣做有兩個需要注意的注意事項:

  • 裝置記憶體消耗將增加,因此如果空閒記憶體不足,您可能需要減少批次大小。這可能會減緩此方法帶來的速度提升。
  • 如果裝置在CPU上進行資料載入時被大量使用(接近或達到100%),那麼在裝置上進行資料載入時就不要期望任何加速,因為它們已經滿負荷執行。

為了在Gaudi2上實現這一點,我們為您提供瞭解決方案:Optimum Habana中的對比影像-文字示例現在提供了一個即用型媒體管道,您可以將其與包含文字和影像的類COCO資料集一起使用!您只需在命令中新增--mediapipe_dataloader即可使用它。

對於感興趣的讀者,Gaudi文件中此處提供了更低級別的概述,此處提供了所有支援操作的列表。

現在我們將在之前的實驗中重新執行,新增mediapipe_dataloader引數,因為它與dataloader_num_workers相容。

裝置 dataloader_num_workers=0 dataloader_num_workers=2 dataloader_num_workers=2 + mediapipe_dataloader
Gaudi2 HPU 601.5 樣本/秒 768.7 樣本/秒 847.7 樣本/秒
H100 GPU 336.5 樣本/秒 602.1 樣本/秒 /
A100 GPU 227.5 樣本/秒 345.4 樣本/秒 /

與之前僅使用dataloader_num_workers=2的執行相比,我們額外獲得了x1.10的加速。因此,這次最終執行比我們在Gaudi2上的基本執行快了x1.41,僅僅添加了2個即用型訓練引數。它還比H100快x1.41,比A100(使用dataloader_num_workers=2)快x2.45

重現此基準測試

要重現此基準測試,您首先需要透過Intel Developer Cloud獲取Gaudi2的訪問許可權(更多資訊請參閱本指南)。

然後,您需要安裝最新版本的Optimum Habana並執行run_bridgetower.py,您可以在此處找到它。操作步驟如下:

pip install optimum[habana]
git clone https://github.com/huggingface/optimum-habana.git
cd optimum-habana/examples/contrastive-image-text
pip install -r requirements.txt

執行指令碼的基本命令列是

python ../gaudi_spawn.py --use_mpi --world_size 8 run_bridgetower.py \
--output_dir /tmp/bridgetower-test \
--model_name_or_path BridgeTower/bridgetower-large-itm-mlm-itc \
--dataset_name jmhessel/newyorker_caption_contest --dataset_config_name matching \
--dataset_revision 3c6c4f6c0ff7e902833d3afa5f8f3875c2b036e6 \
--image_column image --caption_column image_description \
--remove_unused_columns=False \
--do_train --do_eval --do_predict \
--per_device_train_batch_size="40" --per_device_eval_batch_size="16" \
--num_train_epochs 5 \
--learning_rate="1e-5" \
--push_to_hub --report_to tensorboard --hub_model_id bridgetower\
--overwrite_output_dir \
--use_habana --use_lazy_mode --use_hpu_graphs_for_inference --gaudi_config_name Habana/clip \
--throughput_warmup_steps 3 \
--logging_steps 10

這對應於 --dataloader_num_workers 0 的情況。然後您可以新增 --dataloader_num_workers N--mediapipe_dataloader 來測試其他配置。

要將您的模型和 Tensorboard 日誌推送到 Hugging Face Hub,您需要事先登入您的賬戶,命令如下:

huggingface-cli login

對於A100和H100,您可以使用相同的run_bridgetower.py指令碼,只需進行少量更改:

  • GaudiTrainerGaudiTrainingArguments 替換為來自 Transformers 的 TrainerTrainingArguments
  • 移除對 GaudiConfiggaudi_configHabanaDataloaderTrainer 的引用
  • 直接從 Transformers 匯入 set_seedfrom transformers import set_seed

此基準測試中顯示的結果是透過 Nvidia H100 Lambda 例項和 Nvidia A100 80GB GCP 例項(均配備8個裝置)使用 Nvidia 的 Docker 映象獲得的。

請注意,--mediapipe_dataloader僅與Gaudi2相容,不適用於A100/H100。

關於H100使用Transformer Engine的fp8結果,目前尚不可用,因為程式碼會崩潰,並且需要修改BridgeTower在Transformers中的建模。我們將在Gaudi2支援fp8時重新進行此比較。

總結

在處理影像時,我們提出了兩種加速訓練工作流程的解決方案:為資料載入器分配更多資源,以及直接在加速器裝置上而不是CPU上解碼和增強影像。我們展示了這在訓練像BridgeTower這樣的SOTA視覺-語言模型時會帶來顯著的加速:使用Optimum Habana的Habana Gaudi2比Nvidia H100快約1.4倍,比Nvidia A100 80GB(使用Transformers)快2.5倍!而且這非常容易使用,您只需提供幾個額外的訓練引數。

為了更進一步,我們期待使用HPU圖來更快地訓練模型,並展示如何在Gaudi2上使用DeepSpeed ZeRO-3來加速您的LLM訓練。敬請關注!

如果您對使用最新AI硬體加速器和軟體庫加速您的機器學習訓練和推理工作流感興趣,請檢視我們的專家加速計劃。要了解有關 Habana 解決方案的更多資訊,請閱讀我們與他們的合作並在此處聯絡他們。要了解 Hugging Face 在簡化AI硬體加速器使用方面的努力,請檢視我們的硬體合作伙伴計劃

相關主題

社群

註冊登入以評論

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