全部產品
Search
文件中心

Elastic GPU Service:什麼是AI分布式訓練通訊最佳化庫AIACC-ACSpeed

更新時間:Jun 30, 2024

AIACC-ACSpeed(AIACC 2.0-AIACC Communication Speeding)是阿里雲推出的AI分布式訓練通訊最佳化庫AIACC-Training 2.0版本。相比較於分布式訓練AIACC-Training 1.5版本,AIACC-ACSpeed基於模組化的解耦最佳化設計方案,實現了分布式訓練在相容性、適用性和效能加速等方面的升級。

AIACC-ACSpeed介紹

AIACC-ACSpeed(本文簡稱ACSpeed)作為阿里雲自研的AI訓練加速器,具有其顯著的效能優勢,在提高訓練效率的同時能夠降低使用成本,可以實現無感的分布式通訊效能最佳化。

ACSpeed在AI架構層、集合演算法層和網路層上分別實現了與開源主流分布式架構的充分相容,並實現了軟硬體結合的全面最佳化。ACSpeed的組件架構圖如下所示:ACSpeed

架構層

說明

AI架構層

在AI架構層,ACSpeed通過aiacc-c10d-plugin實現了PyTorch架構的充分相容和無感分布式訓練效能最佳化。

集合演算法層

在集合演算法層,ACSpeed通過集合通訊編譯技術,針對不同的機型構建自適應拓撲演算法,實現NCCL Runtime充分相容的無感集合通訊拓撲最佳化。

網路層

在網路層,ACSpeed通過對阿里雲的VPC、RDMA或者eRDMA網路基礎設施進行適配最佳化,實現網路層無感的通訊最佳化。

AIACC-ACSpeed使用說明

當使用ACSpeed啟動訓練出現AIACC-2.0 ACSpeed c10d-plugin init欄位Log時,表示已成功初始化ACSpeed的aiacc-c10d-plugin組件。如下圖所示:

說明

NCCL組件的AIACC-2.0-Socket的欄位需要開啟NCCL_DEBUG=INFO才會顯示AIACC-2.0欄位。

初始化

ACSpeed在訓練模式、啟動方式、提升空間方面的說明如下所示:

功能

說明

訓練模式

ACSpeed的c10d組件僅針對PyTorch特定最佳化,需要您的訓練模式選擇原生DDP(torch.nn.parallel.DistributedDataParallel)。

啟動方式

預設情況下,ACSpeed對啟動方式沒有要求,支援包括Torch的launch/run/spawn以及其他指令碼等任意自訂啟動方式。

在使用CPU-Affinity特性的時候存在限制,即目前僅支援torch 1.8~1.12版本的官方torch.distributed.run/launch的啟動方式。

提升空間

ACSpeed主要針對通訊進行最佳化,通訊瓶頸越大,效能提升越大。

如果機器本身是多卡或多機的加速比接近高線性度(即線性度接近於1),說明通訊不是瓶頸,則ACSpeed的效能提升空間就會比較小。

使用ACSpeed訓練時,您需要瞭解以下特性含義。

  • autotuner:ACSpeed預設開啟autotuner功能,可以對通訊演算法進行自適應調優,大約在200~400個iteration(ACSpeed v1.1.0版本預設開啟bucket-tuning大約會在950左右)時列印如下提示,表示關閉bucket-tuning時AIACC tuning結束後的顯示資訊。tuning

    ACSpeed v1.1.0版本預設開啟bucket-tuning時最終autotuning結束後的顯示資訊如下所示:預設開啟

    說明

    因為訓練過程中涉及到額外的context消耗,為了確保效能測試的準確性,建議模型訓練的warmup_iteration設定為400,具體參考上圖中的Cost xxx steps

  • perf_mode:ACSpeed在autotune過程中會對每個iteration進行效能分析,支援不同的效能統計方式(預設為time),您可以通過環境變數來進行切換。取值範圍:

    • AIACC_AUTOTUNE_PERF_MODE=time,為預設配置,適合帶有端到端資料預先處理、資料載入、梯度累計等額外操作的情境。

    • AIACC_AUTOTUNE_PERF_MODE=filter,能夠相對穩定地輸出perf_time,適合帶有checkpoint、logging等額外處理操作的情境。

    • AIACC_AUTOTUNE_PERF_MODE=profile,相比前面兩種方式,可以額外輸出當前模型的一次iteration的通訊佔比。

  • 單機最佳化:目前單機最佳化僅支援torch 1.6~1.9版本。

  • CPU-Affinity:預設為關閉狀態,如果需要開啟CPU-Affinity最佳化可以設定如下環境變數,在某些機型上提升空間較大。

    AIACC_CPU_BINDING_ENABLE=1

    如果程式本身存在問題,例如負載不均衡導致效能波動,開啟CPU-Affinity功能後可能會出現效能損失,所以該特性作為最佳化選項進行使用。

  • Bucket-Tuning:ACSpeed預設開啟Bucket-Tuning,可以對梯度的融合進行自適應調優,提高計算和通訊的overlapping效能的最佳化上限,但需要更長的warmup_steps(大約950 steps左右)。目前支援torch 1.8~1.13版本。

    說明

    如果需要關閉Bucket-Tuning最佳化可以設定如下環境變數:

    AIACC_BUCKET_TUNE_DISABLE=1
  • Cache機制:為了減少Tuning的warmup時間,避免相同環境下同一模型的重複autotune,Cache機制以機型、模型名字、模型大小、叢集規模為索引值進行區分。

    使用AIACC_CONFIG_CACHE_DISABLE=0可以開啟Cache,本輪訓練的最優config將儲存在rank=0機器上。

    說明

    後續在相同索引值的訓練情境下開啟cache後,會自動讀取cache並載入,從而跳過autotune步驟。

    • 首次開啟cache會顯示如下資訊:首次開啟

    • cache儲存後會顯示如下資訊:報存後

    • 第二次運行會顯示如下資訊:運行

    在已儲存最優config且具有相同索引值的訓練情境下,可以使用AIACC_CONFIG_CACHE_UPDATE_DISABLE=0開啟config更新,啟動cache更新會顯示如下資訊。更新

AIACC-ACSpeed最佳化原理

情境說明

使用單機多卡或多機多卡進行AI分布式訓練時,分布式通訊的線性度可作為單卡訓練擴充到多卡的效能指標,線性度的計算方式如下:

  • 單機內部擴充性:線性度=多卡效能/單卡效能/單機卡數

  • 多機之間擴充性:線性度=多機效能/單機效能/叢集數

線性度的取值範圍為0~1,數值越接近於1,其效能指標越好。當線性度不高(例如小於0.8)並且排除了資料IO和CPU的本身因素影響後,可以判斷此時分布式通訊存在瓶頸。在該情境下使用ACSpeed進行分布式訓練,可以加速分布式訓練的整體效能,並且原始基準的線性度越差,ACSpeed的提升空間越大。

單機內最佳化

以PCIe-topo和NVLink-topo機型為例,展示通過ACSpeed最佳化原理和最佳化效能效果。具體說明如下:

  • PCIe-topo機型

    • 問題分析

      以沒有P2P互聯的8卡機型的GPU拓撲結構為例,GPU0~GPU7的各卡串連如下圖所示。由於卡與卡之間沒有P2P互聯,且多卡共用PCIe頻寬,在涉及多卡通訊的分布式訓練中,特別是通訊資料量較大的情境,容易出現因物理頻寬節流設定而造成的通訊佔比過高的現象。p2p

      上圖中,GPU0~GPU3或者GPU4~GPU7的各卡之間相互連過PCIe Bridge串連(PIX),而GPU0到GPU4~GPU7、GPU1到GPU4~GPU7、GPU2到GPU4~GPU7、GPU3到GPU4~GPU7之間需要通過socket之間的QPI/UPI介面串連(SYS)。

    • 最佳化方法

      在原生NCCL通訊庫中,預設使用ncclAllReduce函數來進行集合通訊。在PCIe-topo機型的頻寬節流設定下,效能指標存在待提升的空間。ACSpeed通過降低集合通訊過程的相對次數來達到效能提升的目的,實現CPU與GPU之間的非同步流水線通訊,從而提升通訊效能,其主要特點是在CPU上完成資料的AllReduce操作,該最佳化也稱為CPU-Reduce。

    • 最佳化效果

      在PCIe-topo類型的單機下,遇到因通訊佔比較高而引起的低線性度加速時,可選擇啟用CPU-Reduce最佳化方法。該方法在4 MB及以上通訊量上相對於原生NCCL具有20%左右的效能提升,進而將訓練過程中的梯度同步時間整體降低,以擷取端到端的效能提升。例如,在典型Resnet50和Transformer-based的模型訓練情境中,通過該方法可實現10%以上的效能提升。

  • NVLink-topo機型

    • 問題分析

      以V100 8卡機型的GPU拓撲結構為例,不同的GPU之間串連的nvlink通道數是有區別的(例如NV1或NV2),如下圖所示。NCCL經常使用的一種演算法是binary-tree(即2-tree),在不同機型拓撲下並不能達到最優。

      說明

      NCCL是NVIDIA GPU的集合通訊庫,能實現集合通訊和點對點通訊,基本上所有AI開源架構通訊底層都是NCCL。

      NV1&NV2

    • 最佳化方法

      基於上述問題,ACSpeed充分利用高頻寬的nvilnk互聯來實現AllReduce演算法(例如GPU0與GPU3等),可以在單機通訊出現瓶頸時,額外帶來效能增益。針對上述V100執行個體的nvlink組合,ACSpeed實現一套n-trees演算法,擴充單機內部不同tree的拓撲結構組合以及分布式多機多卡支援,從而實現拓撲調優。

    • 最佳化效果

      通過針對性設計的n-trees組合,能夠充分利用多個nvlink通道的收發能力,在資料通訊量128 MB以上具有20%效能提升。

多機間最佳化

通過ACSpeed最佳化,可以實現多機之間通訊的效能提升,主要體現在高效的AllReduce演算法和多流通訊最佳化方面。

  • 高效AllReduce演算法

    • 問題分析

      以V100執行個體為例,單機內部利用nvlink做P2P通訊,頻寬高達300 GB/s,而多機網路效能在100 Gbps以下,吞吐效能較差,採用傳統的ring-allreduce演算法因跨機問題效能受限制,從而導致整體效能下降。

    • 最佳化方法

      相比較傳統的ring-allreduce演算法,ACSpeed設計的hybrid-allreduce演算法實現了單機和多機的分層訓練,充分利用單機內部高速頻寬同時降低多機之間低速網路的通訊量,並且針對阿里雲不同機型的網卡和GPU距離的拓撲特點,實現多種不同演算法組合(例如ps/tree/butterfly),充分發揮特定機型下的網路結構優勢。

    • 最佳化效果

      在V100 16 G或者32 G執行個體的多機上,效能提升明顯。例如典型的VGG16兩機具有20%以上的效能提升。

  • 多流通訊最佳化

    • 問題分析

      通常情況下,單流通訊無法打滿TCP網路頻寬(使用iperf工具可以快速驗證這一現象),導致上層allreduce集合通訊演算法的跨機效能無法達到最優。

    • 最佳化方法

      ACSpeed設計實現了基於tcp/ip的多流功能,提升分布式訓練中並發通訊能力,充分利用網路頻寬。

    • 最佳化效果

      使用多流通訊最佳化,對整體多機的效能大幅提升5%到20%不等。

  • 多機CPU-Reduce最佳化

    • 問題分析

      針對PCIe-topo機型,在機器內部通訊頻寬受限的情境下,相比較原生NCCL,單機內CPU-Reduce的最佳化效果較明顯。因此,基於PCIe-topo機型搭建的多機訓練環境下,您可以將單機CPU-Reduce擴充到多機,充分釋放單機的效能,同時解決以Socket串連為主的跨機通訊的擴充性問題。

    • 最佳化方法

      多機CPU-Reduce的實現繼承了單機CPU-Reduce高效的非同步流水線,將跨機通訊過程也設計為流水線形態,同時避免儲存在CPU側的中間資料在CPU和GPU之間往返拷貝。為進一步提升跨機通訊的效能,可使用閑置資源增加相應跨機流水線的個數。

    • 最佳化效果

      在通訊量較大的VGG16或Transformer-based模型的PCIe-topo多機訓練情境下,可將端到端效能進一步提升20%以上。

整體架構層最佳化

通過ACSpeed最佳化,可以實現整體架構層通訊的效能提升,主要體現在通訊演算法autotuner、自適應cpu-affinity和全鏈路最佳化方面。

  • 通訊演算法autotuner

    • 問題分析

      一次模型的訓練在不同的執行個體、網路環境下具有不同的最優通訊演算法,採用先驗的方式無法做到即時網路環境下的最優效能。

    • 最佳化方法

      針對上述通訊演算法實現autotuner,包括warmup、多維度perf_time統計以及top_k_algo的retuning等機制,從而實現在即時訓練過程中,針對特定網路選擇最優通訊演算法,保證端到端的效能最優。

    • 最佳化效果

      該演算法在多機型的不同模型上,均能得到最優演算法,並且99%的情況下沒有效能損失的問題。

  • 自適應cpu-affinity

    • 問題分析

      受到不同numa-node架構、不同Linux調度策略的影響,單機內部的多個進程可能會發生資源爭搶,一方面導致額外調度的context等消耗,另一方面導致單機內部多個進程之間效能不一致的發生。而分布式訓練大多是同步訓練,會導致整體效能的下降。

    • 最佳化方法

      ACSpeed引入CPU親和性機制,將訓練進程與CPU核心進行綁定,控制進程與CPU核心的親和性,消除NUMA效應和調度消耗。

    • 最佳化效果

      該方法對某單機8卡機型VGG16模型的效能提升3%。

  • 全鏈路最佳化

    • 問題分析

      模型訓練包括計算、通訊、參數更新的完整過程,不同模型還會有不同的梯度(即通訊量),會導致不同通訊演算法的效能差異。不同粒度的overlapping會導致整體效能表現的差異,計算和通訊的耦合會導致全域非最優的情況發生,需要一個系統化的全方面最佳化。

    • 最佳化方法

      使用ACSpeed針對PyTorch架構的深度最佳化,覆蓋forward、backward、overlap等操作的整體調優。例如,通過Bucket-Tuning可將端到端效能進一步提升2%~10%左右。

    • 最佳化效果

      不局限於純通訊的最佳化上限,實現效能的全面超越,並通過無感外掛程式化的實現,您可以無縫使用,快速上手。

聯絡我們

如果您有分布式訓練相關的問題或需求,歡迎使用DingTalk搜尋群號33617640加入阿里雲神龍AI加速AIACC外部支援群。(DingTalk通訊用戶端下載地址