天天看點

Goya from Habana Labs --- 他山之石前言為什麼是Habana Labs?Goya硬體特性簡析SynapseAI特性簡析性能分析綜合思考後記

前言

筆者從GPU行業轉行,加入AI晶片軟體團隊正好一年時間。參與了Alibaba NPU(含光800)的架構,軟體模組化,晶片驅動,架構等多方面的工作。在一年到來之際,特别想針對自己過去一年的工作和學習寫一些“思想總結”。正好我們在準備雲栖大會的材料,學習了競争對手的相關文檔,萌生了利用一些夜深人靜的晚上,寫寫一些體會。因為相關工作學習時間短,寫的這些東西大都很淺顯,對内行來說不值一提。文章的價值在于從一個比較全面的角度來分析推理晶片的整個系統,因為筆者先後接觸硬體架構,軟體棧,以及深度學習架構等,習慣于系統化思考。借此希望能給軟體部門,硬體部門,或者研究部門的同僚,在某一個不熟悉的方面提供一點有用的資訊。

後續,筆者會繼續對Goya和含光800做些比較,讨論一些各自的優缺點,以及我們如何從軟硬體方面借鑒一些競争者的好的設計。這就是研究對手的目的:他山之石,可以攻玉!

在開始之前,推廣一下我們的含光800:

Goya from Habana Labs --- 他山之石前言為什麼是Habana Labs?Goya硬體特性簡析SynapseAI特性簡析性能分析綜合思考後記

為什麼是Habana Labs?

Habana Labs是一家以色列人工智能晶片新創公司。公司的相關産品在市場上競争力強,在業界地位上升迅速。去年宣布推出全球性能最高的人工智能推理處理器,并獲得了Intel投資領投的融資。今年釋出了性能為目前在訓練神經網絡任務中最為強大的英偉達Tesla V100近四倍的訓練晶片。

Habana Labs的産品(Goya),産品路線圖(先推理再訓練),以及性能表現和我們的定位比較接近。産品是一種采用 PCIe接口的計算卡,面向雲端高性能的AI晶片。(為了更高的執行效率,Habana特意為訓練和推理工作)

不像TPU是google自用,Habana是對外部客戶的,是以産品公開,容易看到更多的資料。在學習相關文檔的時候,我發現他們的設計裡有些思路比較值得我們學習,包括硬體架構的設計,以及軟體棧架構的設計。是以特做一些深度閱讀和總結,以助于我們未來的開發。

本文的主要從系統的角度來解讀Goya的一些我能看到的比較有價值的特性。這個系統既包括硬體也包括軟體系統。在後續文章中會一一解析為什麼關注這些特性。

引用于Goya白皮書:

“Habana’s Goya is a product line of AI processors dedicated to inference workloads. The HL-1000 processor is the first commercially available, deep learning inference processor, designed specifically to deliver superior performance, power efficiency and cost savings for cloud, data centers and other emerging applications.”

Goya硬體特性簡析

Goya from Habana Labs --- 他山之石前言為什麼是Habana Labs?Goya硬體特性簡析SynapseAI特性簡析性能分析綜合思考後記

Goya有兩種類型的計算引擎:GEMM(GEneral Matrix to Matrix Multiplication)核心和TPC(Tensor Processing Core)核心。前者以矩陣計算(convolution/matmul)為主要目标,執行密集線性代數計算;而後者執行更一般性向量(vector)計算,可以讓Goya支援不同神經網絡的結構,處理不同的資料類型。避免一些不能使用TPC加速的算子嚴重影響網絡的整體性能。從這點來說,這個架構和一些的架構比較類似。

  • VTA(Vanilla Tensor Accelerator): GEMM核心 + Tensor ALU
  • DaVinci: Cube核心 + Vector核心

另外,Goya有一個DMA引擎,用于片上共享存儲和外部存儲之間的DMA傳輸。三種引擎是獨立并行的。

GEMM加速器

GEMM加速器的主要目的是執行資料密集矩陣運算。加入這樣一個加速器的動機,揚清的

論文

裡面有張圖說得比較清楚。

Goya from Habana Labs --- 他山之石前言為什麼是Habana Labs?Goya硬體特性簡析SynapseAI特性簡析性能分析綜合思考後記

Nvidia的相關産品中,比如V100,是由Tensor Core提供4x4矩陣乘加。而NVDLA架構中,是有獨立的卷積的核心(Convolution Core)。

DaVinci核心裡,Cube的能做4096次FP16MACs和8192次INT8MACs.

一些比較重要的資訊,在公開的文檔中沒有提到,比如:

  • GEMM和TPC的聯系
    • 為何設計為一對多,而且GEMM顯得相對TPC來說小很多
    • 核心之間的同步等
  • GEMM怎麼和Local Memory連接配接?

TPC核心主要特性

TPC核心的微架構設計,是整個人工智能晶片的計算部分的一個難點。主要的難點在于“平衡”:功能的支援,性能的高低,功耗和面積的開銷,如何做到平衡。

Habana的設計,提到了下面幾個特點:

可擴縮TPC數目

Habana特别強調實際的TPC的數目是可以根據需求來調整的。可以了解為針對不同的應用場景,調整TPC數目來做一定程度的定制,提高晶片使用率,因為看起來GEMM核心是不可調整的。比如應用在圖像方面的晶片,卷積的比例很高,相對配TPC的數量可以少一些。而語音方面的專用晶片相反,可以配更多的TPC來提高整體效能。

仍然以NV Volta架構為對比,每個SM中的Sub-Core裡包含兩個4x4x4Tensor Core。應該是不可以調整的。這種設定是可以了解的,因為GPU是通用的架構,深度網絡隻是其中的一部分應用。

VLIW SIMD向量處理器

自然的選擇:向量體系結構+簡單的指令集設計+SIMD+VLIW

目前AI晶片的使用場景,是大量的向量計算,而在計算過程中,很少有跳轉控制操作。是以,比較适合采用VLIW設計多發射處理器。這種設計放棄了指令控制的靈活性,将很多的工作放到軟體,依賴于編譯器以及驅動程式完成,進而大大地降低了硬體實作的複雜度。

SIMD, 單指令多資料,也是AI專用晶片的一個自然選擇,達到資料并行的目的。具體的資料并行方式沒有相關材料。

類C可程式設計

類C可程式設計是一個比較模糊的說法。沒有看到具體的指令,很難說清楚可程式設計的程度怎麼樣。不過從後面的一些介紹看得出來,Goya的指令應該是中等級别的粒度。能做到比較好的可程式設計程度。

AI特殊功能子產品(Special Function)

幾乎所有的AI專用晶片都用或多或少的AI特殊功能子產品,用以支援高效地支援一些比較常用的,但又比較特殊的算法,比如,公開的文檔中,Goya提到了Sigmoid/GeLU, Tanh;而DaVinci提到了Activations, NMS, ROI, SORT。

具體選擇支援哪些特殊功能和哪些功能使用專用子產品支援,取決于比較多的因素,包括晶片的主打業務,主推通用性還是高性能。

混合精度資料類型

現有的DNN算法,不同的網絡模型對精度有不同的要求。另外,在不同的應用場景中,使用者也會對精度和性能做不同的要求。比如,有時對延遲的要求很高,使用者願意犧牲一點點精度來達到更低的延遲,比如一些實時的AI服務。而有些場景,使用者會更在乎精度。

為了滿足這種需求,不論是AI的Goya,DaVinci核心,還是主流GPU,都支援多種混合精度的計算。當然不論是在硬體實作上和軟體使用上,都是各有差別的。

Goya的TPC硬體原生支援的是混合精度的資料類型,包括FP32/INT32/INT16/INT8/UINT32/UINT16/UINT8。

大緻看得出,TPC雖然支援混合精度,但不是所有計算都支援上面所有的精度。也就是說,特定算子支援的資料類型的種數和精度是不定的,而是可以根據實際情況來決定的,特别是SPF子產品的算子。比如,有些算子可能支援精度比較低的8bit+16bit資料類型就可以了,有些需要16Bit+32bit的資料類型。精度的選擇,也是算法準确性,性能,功率,面積等多方面的平衡。

存儲系統

AI是資料密集型計算,除了計算本身,存儲系統的設計也是非常的重要。存儲系統需要設計與并行計算相比對的帶寬,同時,特别地針對推理應用,也需要考慮延遲。

Goya采用了三級存儲系統:包括TPC本地存儲,核間共享SRAM存儲,以及DDR4。如果再加上DMA通路系統記憶體,可以認為整個存儲系統有4級層次架構。Habana的訓練晶片使用了HBM代替了DDR4。整個存儲系統的分層設計,和目前GPU的存儲層次比較類似。多層次的存儲分層設計,是要在存儲的大小,面積,帶寬和延時等各方面能到達一個微妙的平衡。複雜的分層設計,不僅提高了硬體的複雜度,而且還非常依賴于軟體對存儲資料的管理和優化,包括資料在各個層次之間的傳輸和同步等,才能充分利用存儲,達到最好的帶寬和最低的延時。

從更專用的角度來說,用于推理的晶片存儲系統應該不需要太過于複雜的存儲分層。因為推理的整個資料流相對簡單。Habana應該是考慮設計一個通用的存儲系統給訓練和推理使用。

Habana在文檔中強調了Goya設計中的低延遲的特性。這是相對GPU一個比較明顯的優勢。這其實是AI專用晶片相對GPU的一個優勢,因為深度神經網絡算法中,資料的使用相對簡單,更有規律,重複少,是以專用晶片不用設計複雜的cache/coherence機制,不用分專用類型存儲(紋理,常量等)。

SynapseAI特性簡析

推理平台

Habana推理平台的設計,還是沒有擺脫Nvidia推理平台TensorRT的影響。整個設計有很多相似之處。其實可以了解,TensorRT在NV的CUDA等其他軟體系統的幫助下,成為一個比較常用的推理平台,也已經考慮到了大部分的推理需求。Habana強調了SynapseAI的一些特點:

  • 支援架構/模型格式多,
  • 訓練平台無關(Training-platform-agnostic),即其他任何平台訓練的網絡模型都可以使用
  • 首先把訓練好的模型轉成自己的中間表達(Internal Representation)
  • 然後使用AOT編譯,優化模型,生成模型的工作計劃 (Recipe)
Goya from Habana Labs --- 他山之石前言為什麼是Habana Labs?Goya硬體特性簡析SynapseAI特性簡析性能分析綜合思考後記

靈活的模型裝載方式

SynapseAI提供了兩種裝載模型的方式,和TensorRT類似,既可以使用Parser載入一個完整的模型檔案,也可以使用它提供的Layer API逐層添加生成模型。

SynapseAI的兩種API:

  • Python API:載入一個支援架構(Tensorflow, MxNet, etc.)模型格式的模型檔案,或者使用ONNX
  • C API:一層一層的描述一個深度學習網絡

後者存在的好處是,當你在一個它不支援的平台上訓練生成模型之後,你不用想辦法把模型轉成某一種支援的模型,而可以使用Layer API轉成SynapseAI的IR。這樣的優勢在于可以跳過一次轉換,以及和其他架構的依賴,得到比較靠近SynapseAI IR的模型表達。

另外一個特點,SynapseAI也允許使用者自定義的網絡層,插入到模型中,這樣為Goya不支援的算子提供在其他平台上的實作的解決方案。可以以Hybrid的方式,提高整個模型,以及整個系統的性能。

支援多領域網絡模型

Habana特别強調Goya的設計不是局限在Resnet等CNN網絡,而是一個支援多領域網絡模型的相對通用的AI推理晶片。

  • Vision - object detection, classfication, segmenation, etc
  • NLP - Neural Machine Translation, text classification,
  • Speech - recognition, synthesis

這既是硬體的特性,需要比較通用的計算核心,當然也更離不開軟體的支援。這麼多的架構模型和算子支援,需要好的軟體棧架構來支援。這一塊暫時不展開詳細讨論。

量化和編譯

推理和訓練在精度要求上不同,目前主流的網絡模型,大都不需要Float32的精度來做推理。比如,CNN類型的網絡,使用INT8能達到比較好的精度了。是以量化通常是做網絡推理的第一步。

其次,為了更高效的運作推理,不同于訓練架構的單算子排程執行,推理應用使用AOT(Ahead-of-Time)的方式,把整個模型輸入預先編譯好,生成working plan,序列化後給推理運作。

性能和精度可調節的自動量化

SynapseAI稱支援對浮點精度的模型提供接近0精度損失的自動量化。他提供自動量化的方式和NV TensorRT不大一樣。他不是由使用者直接指定莫一個資料類型或精度。

Habana通過SynapseAI提供的使用方式是:使用者可以指定需要的性能增長的等級,以及是否可以接受犧牲部分精度來提高性能,然後根據相關輸入,包括模型和模型輸入,SynapseAI應該能自動地進行

  • 量化算法的選擇,
  • 網絡中各級計算量化精度的選擇,
  • 評估精度和性能,

直到做出一個他認為最符合要求的量化結果。使用者覺得不滿意的話,當然可以繼續調整等級參數,尋找有沒有更合适的量化結果。

支援GLOW編譯器,開源Habana-Glow

編譯器技術是深度學習架構裡一個比較重要,也比較熱門的技術。各家架構都在嘗試引入一些新的技術,打造新的編譯器:Mxnet,陳天奇團隊推出了TVM+NNVM,作為“深度學習到各種硬體的完整優化工具鍊”,其中,NNVM編譯器是一個基于TVM工具鍊的編譯器。Tensorflow,先使用XLA技術優化架構編譯,接着嘗試通過MLIR來打造通用的中間語言,連接配接底層編譯器,雖然不是直接的開發編譯器,但主要目的也是優化編譯,加快深度學習網絡的運作。而Facebook的Pytorch,主推的基于LLVM的GLOW編譯器及執行引擎,等到了其他的一些公司的支援,其中包括Habana。

需要注意的是,同是編譯器,架構和晶片的角度其實是不一樣的。架構在上層,架構的角色是連接配接上層應用和底層各種硬體,它看重的是如何友善而高效地連接配接底層編譯器,選擇合适硬體達到最好的性能。而晶片在底層,作為一種硬體,它的角色是應用在多個不同的架構裡,提供友善的連接配接和優異地性能。

Habana積極地參與GLOW編譯器的支援,宣稱Goya(HL-100)是第一個整合到GLOW的AI處理器。同時,其Habana-Glow整合部分已經開源了。

在其内部底層,Habana編譯器使用的應該還是基于LLVM的後端編譯器。

看得出來,Habana希望透過這一系列支援把自己的AI生态做好做大,擴大自己的影響力。

工具

SynapseAI還包括一系列的軟體開發工具,看起來比較完善:

  • TPC tool
    • Compiler
    • Assembler
    • IDE: debugger / simulator
  • Performance profiling tool
    • Performance Analysis
    • Graphical views
    • Real time
  • Performance library: Deep learning operators
  • On-borad processor software: Debugger

性能分析

性能本身,是多個參數的互相制約和最終展現,而不僅僅是FPS,or QPS。還包括其他的一些參數:

  • 延遲
  • 能效 (桢/秒/瓦)
  • 面積能效(PPA) 

低延遲

推理的應用場景中,有越來越多的AI驅動的實時服務,比如NMT(Neural Machine Translation),虛拟助理等,是以,低延遲成了一個關鍵的因素。例如,在針對資料中心和邊緣推理工作的MLPerf基準測試中,延時成為了一個重要的名額。

延遲是一個綜合的系統名額,低延遲的實作,首先依賴晶片架構的支援,比如

  • 算力
  • 存儲吞吐,Goya架構中,應該有較大的本地存儲(Local Memory)和共享存儲(Shared Memory)。

其次,低延遲更依賴于軟體的配合和優化,後面的很多軟體特性其實都對低延遲做出了貢獻。比如,輕量級的推理平台,CPU和AI晶片的合作和同步,Host和AI晶片間的資料傳輸,等。

小批量時保持高吞吐

為了最小化網絡的端到端響應時間,推理相比于訓練通常需要更小的批量大小。

特别是一些推理應用特别是線上引用,對小批量的性能要求也比較高。低延時的另一個關鍵,也在于在小批量的時候也能有高的使用率,進而保持高吞吐,縮短運作時間。影響這一部分的因素,在于TPC核心的并行設計:并行需要在不同的次元上都能實作:

  • 每個核心處理不同的一個batch(簡單,不用核間協同,也容易核間到達負載平衡)
  • 所有核心處理同一個batch,每個核心處理其中的一部分 (小批量的時候能排程更多的核)
  • 鑒于兩者中間的多核心處理多batch

不同的并行模式有不同的優勢,是以靈活地支援多種模式,在不同模式上做到可以切換,這樣可以保證晶片在小批量的時候也能保持較高的吞吐,這可能是Habana特意強調的SynapseAI一個特點。

軟體管理片上存儲及DMA

不論是哪一種性能參數,存儲管理都是非常重要的因數。因為深度學習的網絡計算是大資料的計算,涉及到大量資料的傳輸和存儲。

比如上面提到的多層存儲系統,需要軟體保證整個資料流的通暢:Client-->Host-->Shared Memory-->Local Memory的裝載過程,以及相反的下載下傳過程,如何與計算做到盡可能多的并行。從這個角度來說,層次的越多,對軟體的要求越高。Habana特别提到了軟體管理片上存儲和DMA等存儲管理,也是強調

性能參數

ResNet 50:

  • ~15000 圖/秒,大概3倍于T4
  • 延遲大概在1毫秒
  • 149 圖/秒/瓦

BERT

  • Goya支援所有BERT算子
  • GEMM和TPC充分使用
  • 硬體加速非線性函數
  • 精度:INT16+FP32
  • 延遲大概是T4的一半

綜合來說,Goya以ResNet等CNN網絡的矢量加速為第一目的,同時考慮了向量加速,在BERT等應用下保證GEMM和TPC都能充分使用。

綜合思考

Goya整體看起來是一個不錯的推理晶片,性能良好,網絡模型覆寫廣,在同性能和通用方面做的比較“平衡”。

很多時候,系統設計都是在做“選擇”!我用了“選擇”這個詞,而不是“平衡”,是因為它們之間有細微的差别:我們的選擇一定是“平衡”嗎?這背後的隐藏了一些什麼“玄學”呢?

其實“平衡”本身也是相對的,與産品和系統的定位,這本身就是一種選擇。比如:

  • Nvidia的晶片,更多地定位成:适合深度學習計算的通用計算(GPGPU),同時兼顧訓練和推理。
  • Da Vinci架構,針對AI運算特征而設計,以高性能3D Cube計算引擎為基礎,內建張量,矢量,标量多種計算單元,同時覆寫訓練和推理需求。
  • Goya:作為其第一代純推理晶片,內建張量,矢量,還多一個AI固定功能pipe。主打覆寫目前主流深度網絡的推理運算下的專用高性能晶片。

是以可以看到,幾個産品的架構設計有不小的差別。

關于兩種計算引擎

除去标量計算,向量(2D)和張量(主要是3D)的計算是AI晶片的兩大主力計算引擎。AI專用晶片之是以在AI計算方面快于GPU,主要在于其專用的AI核心。畫一個簡單的示意圖:

Goya from Habana Labs --- 他山之石前言為什麼是Habana Labs?Goya硬體特性簡析SynapseAI特性簡析性能分析綜合思考後記

但AI網絡模型中,還是有一部分vector計算,為了照顧到這一部分,通常需要設計VPU(vector process unit)。但關鍵的問題來了,兩種引擎之間顯然不是一種固定的比例關系,那應該怎麼設計這種搭配呢?

Goya文檔裡提到,TPC數目是可調整的,但不知道GEMM會不會随着變化。DoVinci的配比看來在特定core version上是固定的,Davinci Max/Lite都是32:1,Davinci Tiny是16:1,但他也提到仔細地配置設定了Cube和Vector的MAC數目,以及它的資料依據。

一個我的想法是:可以把這種配比設計成動态可調整的嗎?讓軟體/編譯器來根據計算量做一些微調。

如果是固定的配比,是否需要分析大量目标算法,得到模型裡的Tensor/Vector計算量比,然後分别給這些算法一定的權重,得到一個比較優化的配比?

關于可程式設計和固定功能子產品

我們當然希望上面的兩種可程式設計引擎能覆寫所有的計算。但實際上有些計算很不适合上面兩種引擎,這時候,固定功能子產品用來做相關運算,保證這些計算不會成為瓶頸。是以現在看幾乎所有的AI晶片都有或多或少的固定子產品。

但哪些計算應該設計為固定功能子產品呢?這是應該大都是随着優化目标算法來決定的。提前做好調研,了解AI算法應用和研究各方面的趨勢,可以讓晶片做得更有的放矢,精準高效。

關于混合精度

算法的多樣性,讓混合精度成為必備。但混合精度增加了算法複雜度,功耗和面積。另外,純推理的晶片和同時支援推理/訓練的晶片也有不同的精度需求,後者要求更高。

如何尋找“剛剛好”的精度支援,也是一個需要仔細斟酌的地方。有些算法團隊在GPU上做過量化和混合精度的優化工作,這些結論應該可以幫助我們,還有一些資料可能通過公開的一些工作,論文獲得,可能還需要我們自己也做一些嘗試。最後根據相關資料,需要在功耗面積和計算精度方面做一些選擇。

關于存儲系統

存儲系統的設計是吞吐和延時的關鍵。它本身就是一個非常複雜的系統,光從最大的設計考慮,就涉及到但不限于一些系列的考量:

  • 存儲級數選擇 (memory hierarchy)
  • 各級大小
  • 細分各種用途cache,buffer的個數和大小,連接配接關系
  • 是否需要tiling,如何tiling
  • 是否需要考慮一緻性(coherence)
  • 對軟體編譯器的影響,以及如何協同工作
  • 對軟體驅動的影響,以及如何保證資料流化(data streaming)
  • ...

專用(Domain Specific)晶片可能需要擺脫傳統的束縛。因為應用場景畢竟相對比較少,可以更優化。

關于吞吐和延時

大多數的設計因素裡,吞吐和延時是一緻的,沒有沖突:高吞吐意味着低延時。少數時候兩者之間需要選擇一下。這方面,Goya是推理專用,是以做得比較多一點。而Dovinci似乎考慮延時相對少些,因為吞吐顯得更重要。

關于架構和API

回到軟體,Habana并沒有推出自己的深度學習架構,甚至沒有自己的推理引擎。而是隻是通過一系列API,支援其它的主流架構,包括GLOW推理執行引擎等來使用自己的晶片。這和它對獨立晶片公司的定位(IHV)相對應的。它的目的是支援主流生态,而不是改變上層生态。

但不得不說,Habana的軟體系統做的不錯。API接口設計比較合适,工具夠用,算法庫支援相對少,雖然總體相比NV遠遠不足,但相對國内企業來說,還是不錯的。有一些值得借鑒之處。具體會在後續的一些地方繼續讨論。

關于編譯器

AI編譯器群雄逐鹿時代,現在看來,還很難在出現一個新的"LLVM"一統江湖。各家編譯軟體棧的差異,給我們晶片軟體棧提供了難度和工作量。可以看到Habana和華為都在嘗試一些新的先進的編譯器技術。

AI編譯是一個多層次的過程,一個重要的考慮是如何把軟體棧做得相容和可持續:

  • 前端,如何支援多架構/多模型IR,
  • 獨立圖層,與前端無關,同時更是與硬體架構無關
  • 計算層(Low level Intrinsic Op/C)
  • ISA level 

層間的功能分工,接口設計需要清晰,這樣,我們在擴張支援更多的前端,或者更多的硬體架構/ISA指令集的時候,對現有架構的沖擊會比較小。

關于軟體和硬體

最後,回到起點,“軟硬協同”是晶片系統的一個非常重要的設計因素。幾乎每一個功能都涉及到:

  • 軟硬體如何共同完成一個功能?這裡的軟體主要是編譯器和驅動。
  • 部分功能是放在硬體做還是軟體做好?
  • 軟體怎麼確定硬體的性能得到充分的發揮,或者工作在高能效狀态?
  • 軟體如何擷取硬體的狀态資訊,已經進行調試硬體(profiling and debuging)?
  • 應用程式,架構,應用場景對硬體有什麼影響?
  • ......

是以,一個好的晶片一定是架構,軟體,硬體部門共同合作的結晶!

後記

上面散亂地記錄了筆者這一年的一些學習和思考。後續,将引入我們的含光800NPU,做一些更深入地探讨,尋找一些晶片設計的方法學和實踐。

繼續閱讀