AI加速器與機器學習演算法:協同設計與進化

語言: CN / TW / HK

本站內容均來自興趣收集,如不慎侵害的您的相關權益,請留言告知,我們將盡快刪除.謝謝.

作者|Shashank Prasanna

翻譯|胡燕君

此刻,你應該是在電腦或手機上看這篇文章。不管怎樣,這些機器都屬於現代計算機,它們都有中央處理器(CPU)和其他為特定功能服務的專用晶片,例如顯示卡、音效卡、網絡卡、感測器融合等。處理特定任務時,專用處理器往往比通用CPU更快更高效。

計算機發展早期,CPU都會和專用處理器配合使用。1970年代的8位和16位CPU需要依賴軟體來模擬浮點指令,因此執行浮點運算非常慢。而由於計算機輔助設計(CAD)和工程模擬等應用對浮點運算的速度要求較高,於是人們開始用數學協處理器(math coprocessor)輔助CPU,讓數學協處理器分擔所有浮點運算任務,它的浮點運算速度和效率都比CPU更高。這就是專用處理器的一個例子。

關注AI和半導體行業的朋友近來可能聽說過“機器學習(ML)專用處理器”(即AI加速器)。最常見的AI加速器莫過於NVIDIA GPU,此外還有Intel的Habana Gaudi處理器、Graphcore的Bow IPU、Google的TPU、AWS的Trainium和Inferentia晶片等。

為什么如今有這么多AI加速器可供選擇?它們和CPU有什么不同?演算法如何改變才能適應這些 硬體? 硬體又該如何發展才能支援最新的演算法? 本文將一一解答。本文主要內容包括:

為什么需要專用AI加速器?

ML硬體的分類:CPU、GPU、AI加速器、FPGA和ASIC

“硬體感知(Hardware-aware)”的演算法和“演算法感知(Algorithms-aware)”的硬體

AI加速器與高效ML演算法的協同進化

針對推理的AI加速器與高效演算法

針對訓練的AI加速器與高效演算法

AI加速器的未來

1

為什么需要專用AI加速器?

構建ML專用處理器有三個方面的原因:能效、效能、模型大小及複雜度。近來,要提高模型準確率,通常做法是擴大模型引數量,並用更大型的資料集訓練模型。計算機視覺、自然語言處理和推薦系統都採用這種做法。

語言模型方面,前幾年誕生的GPT-3有1750億引數,當時被視為大模型的“天花板”,但後來又出現了GLaM和NVIDIA MT-NLG,引數量分別達到1.2萬億和5300億。按照歷史規律,模型將越來越大,而現有處理器的算力將無法滿足大模型在訓練時間和推理延遲方面的要求。

不過,構建AI專用加速器的最重要原因還是能效,開發AI專用晶片可節省巨大的能源,可覆蓋研發投入有餘。

為什么需要高能效的處理器?

ML模型越大,需要執行的記憶體訪問操作就越多。與記憶體訪問相比,矩陣-矩陣運算和矩陣-向量運算的能效高很多。根據斯坦福大學韓鬆博士的論文( http://arxiv.org/pdf/1506.02626v3.pdf ),讀取記憶體的能耗比加/乘運算操作的能耗高出好幾個數量級。大型神經網路由於無法片上儲存,需要執行更多DRAM讀取操作,因此能耗還要更高。

圖源:http://arxiv.org/pdf/1506.02626v3.pdf

用通用處理器執行深度神經網路時,擴大處理器規模可以帶來效能提升,但即便只是小幅提升也須以大量能耗和鉅額裝置成本為代價。

CPU等通用處理器犧牲低能耗換取通用性,AI加速器等專用處理器則犧牲通用性換取低能耗。

使用AI加速器則不一樣。AI加速器通過改進設計,可以減少記憶體訪問,提供更大的片上快取,還可以具備特定的硬體功能(如加速矩陣-矩陣計算)。由於AI加速器是基於特定而構建的裝置,可根據演算法進行適配改進,因此其執行效率會比通用處理器更高。

2

ML硬體的分類——CPU、GPU、AI加速器、FPGA和ASIC

接下來我們談談加速器的不同種類,以及它們的通用和專用程度。

如上圖所示,最具通用性的是CPU,可以執行任意程式碼。專用晶片可執行的任務,CPU也能執行,如影象處理、語音處理、機器學習等。然而,CPU的效能和能效都比較低。

專用性最強的是專用積體電路(ASIC),又稱固定功能晶片,因為它只能執行一種或幾種任務,而且通常不可程式設計,也沒有面向開發者的API。耳機中的降噪處理器就是一種ASIC晶片,它需要同時具備低能耗和高效能,這樣才能既延長耳機電池使用時間,又能實現低延遲,以免使用者看節目時遇到聲畫不同步的糟糕體驗。

上圖中,越靠左代表通用性和可程式設計性越強;越靠右代表專用性和效率越高。那么GPU、FPGA和AI加速器分別處於圖中什么位置呢?

答案是:它們都處在這兩個極端之間。

靠近ASIC一端的是現場可程式設計邏輯閘陣列(FPGA)。顧名思義,FPGA是可程式設計的,但程式設計人員需要具備硬體設計知識,還須對Verilog、VHDL等硬體描述語言(HDL)有一定了解。換言之,FPGA程式設計與硬體關聯度太高,而軟體開發人員缺乏這方面的程式設計技能和工具,因此難以對它進行程式設計。

靠近CPU一端的是GPU。GPU是面向特定目的處理器,擅長處理並行任務,例如圖形著色器計算和矩陣乘法。CPU更適合延遲敏感型應用,GPU則更適合要求高吞吐量的應用。GPU與CPU的相似之處在於它們都可程式設計。而作為並行處理器,GPU使用NVIDIA CUDA和OpenCL等語言,雖然能處理的任務種類比CPU少,但在執行包含並行任務的程式碼時極高效。

Intel的Habana Gaudi處理器、AWS的Trainium和Inferentia晶片等AI加速器則處在GPU的右側。Habana Gaudi處理器具備可程式設計性,但通用性比GPU更低,所以應處GPU右側。AWS的Inferentia晶片不可程式設計,但可以加速多種操作,如果你的ML模型不支援這些操作,Inferentia就會執行CPU回退(fallback)模式。綜上,Inferentia應處Habana Gaudi的右側。

3

“硬體感知(Hardware-aware)”的演算法

和“演算法感知(Algorithms-aware)”的硬體

通過以上分類,我們對各種處理器有了大致認識。 下面我們來談談這些處理器如何與軟體互相配合。

通用計算模型有兩個組成部分:(1)軟體與演算法;(2)執行軟體的硬體處理器。一般而言,這兩部分互相獨立——編寫軟體時很少會考慮軟體會在什么硬體上執行;而硬體設計的出發點則是讓硬體儘可能支援更多種類的軟體。

通用計算模型逐漸演進,需要應用於深度學習等要求高效能和高能效的領域,因此需要加強演算法設計和硬體設計之間的聯絡。現代ML計算模型同樣包含兩個組成部分:(1)ML演算法與軟體框架;(2)與AI加速器配合使用的通用處理器。

不同於通用計算模型的開發,ML研發人員會針對特定硬體設計ML演算法。比如,編寫程式碼時可以充分利用硬體的特定功能(如支援多種精度:INT8、FP16、BF16、FP32)實現特定的晶片功能(混合精度、結構化稀疏)。然後,使用者就可以通過常見的ML軟體框架使用這些功能。同理,硬體設計師會針對特定演算法構建AI加速器。比如,為加速ML矩陣計算而設計專門的晶片功能(如NVIDIA在Volta GPU架構中引入Tensor Core)。

這就是AI加速器和ML演算法的協同進化。硬體設計師為AI加速器增加ML演算法可以使用的功能,而ML研發人員則利用AI加速器的硬體功能量身設計新的演算法。

硬體和軟體的協同可以帶來更好的效能和更高的能效。

4

AI加速器與高效ML演算法的協同進化

AI加速器分為兩類: (1)用於訓練的AI加速器; (2)用於推理的AI加速器。 由於訓練和推理的目標不同,而AI加速器是針對特定工作負載的專用處理器,因此有必要為不同型別的工作負載分別設計處理器。

用於訓練的AI加速器的目標是減少訓練時間,而且應具備能配合訓練演算法的硬體特點。 因此,AI訓練加速器的功率通常較大,記憶體空間也較大,以滿足較高的吞吐量(每秒處理的資料)要求。 由於AI訓練加速器注重吞吐量,因此提高吞吐量和利用率有助於降低能耗成本(即通過擴大吞吐量降低“能耗/吞吐量”之間的比率)。 AI訓練加速器還支援混合精度訓練,使用較低精度以加快計算速度,使用高精度累積計算結果,從而實現比通用處理器更高的能效。 (後文還將詳談AI加速器的混合精度訓練。 )

AI推理加速器的目標是,在執行大量獨立資料批次時降低預測延遲,因此需要具備高能效特點,需要降低“能耗/預測”之間的比率。雖然也可將訓練加速器用於推理加速(畢竟訓練中的前向傳播過程本質上即是一種推理任務),但使用訓練加速器時,“能耗/推理”之比會大很多,因為訓練加速器處理小型資料批次的推理請求時利用率較低。

訓練加速器就像公交車,只有保持乘客滿員才能實現高能效(油耗/乘客數之比低)。如果偌大的公交車每次只載一個人,其油耗/乘客數之比將變得極高。而推理加速器就像跑車,其速度比公交車快,只載一人時能效比公交車高(跑車的單名乘客油耗比公交車低)。但如果想用跑車一次載50個人,它就會跑得極慢(何況超載違法)。

下文將分別談論訓練和推理的工作流,以及AI加速器和軟體應具備什么特點才能在訓練和推理中實現高效能和高能效。

5

針對推理的AI加速器與高效演算法

ML推理即是根據新的資料使用訓練好的模型以輸出預測結果。 本節將討論AI加速器上執行的可提升推理效能和效率的演算法。

提升機器學習效率最重要的方法是量化。要充分理解量化,首先須瞭解計算機硬體中的數字表示方法。浮點數是數字計算機中用以表示連續實值的離散表示形式。ML演算法通常基於IEEE 754標準用單精度(FP32)儲存和處理數字。IEEE 754還規定了AI加速器支援的其他常見浮點型別,如半精度(FP16)和雙精度(FP64)。

現代AI加速器也支援IEEE 754以外的數字格式,例如BF16(由Google Brain引進;NVIDIA Ampere GPU、AWS Inferential、AWS Tranium、Intel Habana Gaudi和Google TPU均支援此格式)和TF32(NVIDIA Ampere架構和AWS Tranium晶片支援此格式)。推理加速器還支援整數精度,如INT8和INT4。

量化在推理中的優勢

在推理任務中,模型權重和啟用函式輸出均可被量化,例如可將FP32(訓練常用精度)轉化為更低精度的表示形式(FP16、BF16和INT8)。使用較低精度可以獲得更高的效能和能效。當把FP32轉化為FP16操作時,資料大小可減半,能耗可減少約75%(資料來源: http://arxiv.org/pdf/1506.02626v3.pdf ) ,使用的矽面積(silicon area)也可減少約75%。

如果僅從推理的角度考慮硬體設計,可以構建僅供推理使用、僅支援較低精度的加速器,這樣就可以縮小加速器的尺寸,並提高能效。將運算結果從FP32轉化為INT8資料還可進一步減少能耗,因為資料大小減少到原來的1/4。

然而,通過量化方法提升計算效率會損失一定的預測準確性。因為將高精度表示形式轉化為低精度本質上是一種壓縮,壓縮意味著會損失部分資料。FP32的動態範圍比FP16和INT8更大,因此,推理中,量化的目的是保留資料中的“訊號”,去除資料中的“噪聲”,為實現這個目的可以有多種方法。

使用NVIDIA GPU進行量化

NVIDIA的Ampere和Turing等較新GPU架構均支援多種精度型別。2016年,NVIDIA在Pascal架構中首次引進了FP16精度型別,而最新的Ampere和Turing架構GPU均體現了“硬體與演算法的協同進化”。我之前寫過一篇文章介紹GPU的完整發展史和不同架構的GPU及其特點:Choosing the right GPU for deep learning on AWS( http://towardsdatascience.com/choosing-the-right-gpu-for-deep-learning-on-aws-d69c157d8c86 )。

本節將聚焦硬體和軟體層面如何支援GPU進行量化。

以NVIDIA 的Ampere架構為例。你可以在AWS雲伺服器上通過啟動Amazon EC2 p4d例項或G5例項體驗Ampere架構的效能。p4d和G5例項分別使用NVIDIA的A100和A10G GPU,兩款GPU都基於Ampere架構,都支援FP64、FP32、FP16、 INT8、BF16和TF32精度型別,也都包含一種被NVIDIA稱為“Tensor Core”的運算單元,用於混合精度計算。推理時用到的重點精度型別只有FP16和INT8兩種(其他精度型別將在下一節中提到訓練時詳談)。

大多數深度學習框架都使用NVIDIA GPU和FP32格式訓練模型,因此NVIDIA 推出TensorRT編譯器,用以加快推理速度。TensorRT可將FP32格式的模型權重和啟用函式量化為FP16和INT8格式。量化時,TensorRT先確定一個比例因子(scaling factor),然後根據該係數將FP32的動態範圍對映到FP16或INT8的動態範圍。對映到INT8的難度尤其高,因為INT8的動態範圍比FP32小太多。INT8僅能表示256個數值,而FP32足足能表示4.2×109個數值。

如何在通過量化提高推理速度的同時減少精度損失?一般有兩種方法:

訓練後量化(PTQ) :使用一個訓練好的、以FP32格式計算的模型,確定比例因子,然後將FP32對映為INT8。確定比例因子的方法是:TensorRT衡量每個神經網路層中啟用函式輸出的分佈,然後找到一個使參考分佈(reference distribution)和量化分佈(quantized distribution)之間資訊損失(KL散度)最小的比例因子。

量化感知訓練(QAT) :在訓練中計算比例因子,使模型可以適應資訊損失並將資訊損失降到最低。

可見,硬體不斷髮展,具備更多可提升效率的功能(如降低精度)。 同時,演算法也不斷進化,可以更好地利用硬體的功能。

我的另一篇文章提供了NVIDIA TensorRT在GPU上實行量化的程式碼示例 ( http://towardsdatascience.com/a-complete-guide-to-ai-accelerators-for-deep-learning-inference-gpus-aws-inferentia-and-amazon-7a5d6804ef1c )。

使用AWS Inferentia晶片進行量化

NVIDIA GPU設計之初用於影象處理加速,後來才演變成強大的AI加速器,而AWS Inferentia晶片一開始即是為機器學習推理而生。

每塊AWS Inferentia晶片含4個NeuronCore。NeuronCore是基於脈動陣列的矩陣相乘引擎,有兩級儲存層次結構和極大的片上快取空間。AWS Inferentia晶片支援FP16、BF16和INT8資料型別,不支援更高精度的格式——畢竟AWS Inferentia是一種推理專用處理器,推理時無須用到更高的精度。正如NVIDIA為GPU推出了TensorRT編譯器,AWS也推出了AWS Neuron SDK和AWS Neuron編譯器,該編譯器支援量化和優化,可提高推理效率。

儘管AWS Inferentia晶片支援INT8格式,但截至本文撰寫時,AWS Neuron編譯器只支援量化到FP16和BF16格式。 用FP32格式訓練的模型會在編譯過程中自動被轉化為BF16格式。 如果在使用AWS Neuron編譯器之前人工將FP32格式的權重量化為FP16,那么編譯器就會保留FP16精度用於推理。

與GPU相比,AWS Inferentia晶片不可程式設計,專用性比GPU更強,更接近ASIC。 如果模型中包含的操作均為AWS Inferentia所支援,那么對於特定的模型和批次規模(batch size)而言,使用Inferentia就比使用GPU更能提高模型的能效。 然而,如果模型含有Inferentia不支援的操作,AWS Neuron編譯器會自動將相應操作置於主機CPU上,這就導致CPU和加速器之間需要進行資料搬運,進而降低效能和效率。

6

針對訓練的AI加速器與高效演算法

ML訓練即利用訓練資料優化模型引數,以提高模型的預測準確度。本節將討論AI加速器上執行的演算法如何提升推理效能和能效。

接下來我們依舊會討論精度,不過這次是從訓練工作流的角度。 如前所述,訓練時,模型權重和啟用函式都以FP32格式儲存,FP32遵循早在深度學習之前就誕生的IEEE 754浮點數標準。 FP32之所以被選為機器學習預設的浮點數表示形式,是因為訓練時FP16可表示的資訊量不夠大,而FP64可表示的資訊量則太大,而且也不必用到這么高的精度。 機器學習需要一種精度處在FP16 和FP64之間的表示格式,但當時的硬體並不支援。

換言之,當時的硬體並不能滿足ML演算法的需求,並未成為“演算法感知”的硬體。

如果當時的ML研究人員有更好的選擇,他們應該會選一種不同於FP32的格式,或者使用混合精度來提升效能和效率。 混合精度也正是目前AI加速器的發展方向。 實現混合精度,需要硬體和演算法的協同設計。

混合精度訓練提升效能與效率

矩陣乘法運算是神經網路訓練和推理的基本操作。 AI加速器的主要工作即為在神經網路的不同層中將輸入資料和權重的大型矩陣相乘。 混合精度訓練背後的思想是,訓練時的矩陣乘法發生在較低精度表示(FP16、BF16、TF32),因此它們更快和能效更高,然後用FP32格式累積運算結果,以降低資訊損失,從而提升訓練速度和能效。

使用NVIDIA GPU進行混合精度訓練

2017年,NVIDIA宣佈推出Volta GPU架構,其中包含專門用於機器學習的Tensor Core運算單元。Tensor Core通過FP16運算和FP32累積結果實現混合精度訓練( http://arxiv.org/abs/1710.03740 )。NVIDIA的新一代新架構還支援更多低精度格式(BF16、TF32)。在晶片層次,Tensor Core執行低精度(reduced-precision)融合乘加(FMA)運算,用FP32累積結果。

每一代NVIDIA架構的進步都體現了硬體和演算法之間的協同設計和協同發展。

NVIDIA Volta架構(2017)引入第一代Tensor Core,當時僅支援FP16運算和FP32累積結果。

NVIDIA Turing架構(2018)的Tensor Core支援更低精度的INT8和INT4(主要可以加速推理,而非加速訓練)。

NVIDIA Ampere架構(2020)的Tensor Core還支援BF16和TF32,也就是說,它可以執行FP16、BF16和TF32運算,並且用FP32累積結果,以實現混合精度

混合精度訓練的一大難點是軟體層面的實現。 使用者必須在訓練時執行額外的操作,比如將權重轉化為FP16格式,但同時會保留權重的FP32副本和損失縮放(loss scaling)。 儘管NVIDIA可以讓深度學習框架在只需修改少量程式碼的情況下執行這些操作,它對使用者的要求依然很高,不像使用FP32訓練那么簡單。

NVIDIA的Ampere架構支援TF32,可以有效解決這一使用者體驗難題。TF32格式的好處在於,它結合了FP32的動態範圍和FP16的精度,因此深度學習框架無需轉換格式和保留副本等額外操作即可直接支援TF32格式。然而,在為開發者減少麻煩的情況下,使用TF32可實現比FP32更好的效能,但NVIDIA依然推薦使用FP16或BF16格式進行混合精度訓練,以便獲得最快的訓練效能。

使用其他AI加速器進行混合精度訓練

Intel Habana Gaudi處理器

Habana Gaudi加速器支援混合精度訓練的方式與NVIDIA GPU類似——通過一個附加工具配合深度學習框架,使用格式轉換和副本儲存功能。若想體驗Intel Habana Gaudi AI加速器的功能,可以通過AWS雲伺服器啟動Amazon EC2 DL1例項,該例項配備8個Gaudi加速器。

AWS Tranium晶片

AWS在2021年re:Invent大會上宣佈推出Tranium晶片,該晶片由AWS的Annapurna實驗室研發,用於AI加速。目前,Tranium 晶片尚未得到大規模應用。AWS在大會上介紹稱,Tranium將支援FP16、TF32、BF16、INT8,以及一種稱為cFP8(定製8位浮點數)的全新格式。

7

AI加速器的未來

如今,ML演算法研究和硬體設計都在蓬勃發展。AI加速器也將在效能和能效方面持續進步,逐漸可以像通用處理器一樣無縫使用。

現代的AI加速器已具備理想中的硬體功能,例如支援INT1和INT4,這兩種精度型別尚未被用於訓練和推理,但或許它們的存在可以催生新的ML演算法。AI加速器之間的互聯也漸見革新。

隨著模型規模越來越大,我們需要更大的計算叢集,將更多AI加速器連線起來,從而支援更大的工作負載。為此,NVIDIA推出了高頻寬的NVLink和NVSwitch,用於GPU之間的互聯;Intel的Habana Gaudi處理器則在片上集成了基於乙太網的RoCE RDMA。未來AI應用將更加廣泛, AI加速器也將成為現代計算環境的中流砥柱。

希望未來的AI加速器帶來更好的使用者和開發者體驗。如今的異構計算模型需要協調多個CPU和AI加速器,對大部分資料科學家和開發人員而言,掌握它們的聯網和儲存設定難度頗高。使用Amazon SageMaker等雲託管服務可省去管理基礎設施的麻煩,可以方便地擴大機器學習規模,然而,開源框架仍希望使用者對底層硬體、精度型別、編譯器選擇和聯網原語等有較深的瞭解。

未來,開發人員可以登入遠端IDE,然後使用開源ML框架執行程式碼,而不必考慮程式碼在何種裝置上以何種方式執行。 他們唯一需要思考的只是成本和速度之間的權衡——想獲得高速度就多花錢,想省錢就在速度上妥協。我是個樂觀的人,我認為距離這樣的未來已經不遠了。

(本文經授權後編譯釋出。原文: http://towardsdatascience.com/ai-accelerators-machine-learning-algorithms-and-their-co-design-and-evolution-2676efd47179)

頭圖源自brookhaven, Pixabay