天天看點

NV Ampere GPU架構學習與思考

前言

這幾天,GTC2020上,Nvidia釋出了最新的Ampere架構。Ampere架構的改進重心,大部分放在AI上的改動,包括第三代的Tensor Core,以及相關的排程性能,以及互聯等。它展示了在加強算力,特别是TC (TC == Tensor Core,下同)算力的情況下,整個系統的改進。

整體上,可以看到NV的GPU向向AI方向快速發展,看起來跟随市場的必然選擇。轉去吃AI晶片的蛋糕。原CUDA Core并行度增加放緩,A100所有大的改動,看起來都是以AI計算為主要目的,是以Tensor Core以及SM裡AI加速的子產品和功能大大加強。在資料中心AI晶片這塊,彎道超車時間快結束了。基本上大家都回到了vector+tensor混合架構上的直線競争。

這樣,GPGPU逐漸成為了通用和專用混合的架構形态

•Core 架構:CUDA vector core + Tensor core

•Memory system:傳統的cache system + AI memory system

•Scale and connection:scale up + scale out in one GPU

•Program Model:original CUDA + WMMA

異構的難題在于使用率上:NV的一些提高效率的改變,包括

•資源動态配置設定,L1C, L2C, MIG

•軟硬體結合

這樣,軟體棧任務更重了。

因為我一直在GPU/AI軟體架構方面工作,我會比較多的從軟硬體結合,程式設計模型,軟體上層應用的角度出發來考慮問題。希望給大家不同的視野。

下面從幾個方面來學習和思考:

  • 核心算力
    • A100如何大幅度提升算力?
  • 資料帶寬
    • 如何解決算力高漲下的帶寬問題?
  • 計算效率
    • 如何提高計算效率?

A100的算力提升主要集中在AI應用需要的FP16精度以下的類型。

  • 傳統FP32和FP64隻有1.25x的增長。
  • FP16有了2.5x的增長 (both CUDA core and Tensor core)
  • 通過TF32的引入,讓FP32(應用層)的資料處理大幅提升
  • 再通過Sparsity的優化,對TC的幾個資料類型又double了算力

Tensor core精度

  • TF32 TC
    • FP16/FP32的混合精度訓練問題比較多,使用很麻煩,給軟體棧和架構都帶來不小的難題。(大家可以看一下混合精度訓練的實作和問題一些材料)
    • FP32 in/out的計算複雜,算力小
    • TF32 TC能很好的解決FP16/FP32的混合精度的問題,又能以較小的代價,獲得比較好的精度。

Fine-grained structured sparsity

非常棒的一個“快速”解決方案。之前我們關于AI晶片加速sparsity的優化想法,都是局限在"被動"sparsity的方面,也就是上層應用和架構主動做剪枝以後,針對稀疏矩陣做被動的優化。難度很大。原因是各種剪枝出來的資料沒有共同特性,是以硬體上很難實作通用的加速。

A100的方法,是主動(由軟體)提供固定結構化的剪枝,對訓練好後的Dense權重剪枝後,再稍做Fine-tuning,這樣得到的稀疏矩陣可以直接使用針對這一特定結構的壓縮,硬體加速推理。獲得近乎兩倍的性能提升。精度方面,50%的剪枝,應該能保證足夠的精度。他們應該是論證過的。

NV Ampere GPU架構學習與思考

整個方法是比較典型的軟硬體結合的思路:

  • 軟體提供包裝好的4選2的剪枝方案,(軟體實作,可更新算法,結合硬體)
  • 簡單的Fine-tuning訓練
  • 壓縮剪枝後的weight,得到非零資料和Index,用于推理
  • 提升
    • 減少一半MMA計算
    • weight資料,從host->device就開始節省帶寬
    • activation
      • 根據不同的實作,可以節省L1開始,或者L2開始的帶寬

A100算力的暴漲,應該是讓原來的存儲系統,特别是SM内的存儲設計跟不上了。

特别的是TF32 TC的引入,帶寬需求和FP32一樣,但是算力上大了好多。以Tensor Core FP16作為對比,同樣使用Tensor Core,同樣的操作(Ops/byte ratio),要保證相同的計算吞吐,需要的存儲帶寬大大地增長了。

  • V100,FP16,FLOPS=125T,input data type FP16
  • A100,TF32 TC,FLOPS=312T,input data type FP32,

是以,同樣使用率的情況下,大概就需要5倍(312/125*2)的帶寬了,在打開Sparsity的功能後,還需要更多的帶寬,因為Sparse Matrix隻壓縮weight matrix。

作為對比基礎,先給出Volta的存儲體系:

NV Ampere GPU架構學習與思考

數字上的增長

  • HBM2
    • 16GB to 40GB, achive 1.6TB/sec, 73% increase.
  • L2 cache
    • 6M L2 to 40MB, about 7x size, 2.3x read bandwidth with a new partitioned crossbar structure(沒有細節,還不了解,後續繼續學習)
  • L1 data cache and Shared memory
    • 128 KB to 196 KB,1.5x larger

從數字上看,整個系統的吞吐/容量的純增長,基本是在2倍左右,偏下。這些改進,相對CUDA core算力1.25x-2.5x的改進,其實是差不多足夠了。但是,對于Tensor Core 5倍以上的需求增長,遠遠不夠,是以需要其他架構的改進和新的特性來進一步支援算力。另外,為什麼L2 cache急劇地增加到了40MB?

架構和特性的改進

思考

在了解這些改動之前,一定要充分地思考一下,AI特别是DNN的資料流特點,以及計算的特點。然後可以發現,主要的這些改進,都是充分考慮Tensor core的資料和計算特點,給Tensor Core做一些快速,簡潔,或者并行性更高的通道。而且,有些改進能在其他晶片中看到類似的理念,但A100的選擇和實作總是更通用,更“軟”,更巧妙。

我了解的資料特點:

  • activation隻讀,不會更改。流量大。
  • 權重複用度高,推理時const隻讀,訓練時需要讀和寫。
  • AI資料裡備援資料多,本質上是稀疏的,特别是Relu之後activation,壓縮權重,Embedding輸入資料,broadcast資料等。

我了解的AI計算特點(暫時還沒有統計資料來支援):

  • 一個網絡模型由很多的小Kernel組成。
  • 單個Kernel寬而不深,也就是thread多,但kernel不長,指令數不多。
  • Tensor Core (MMA)和Compute core的并行優化可能比較難做(庫與編譯器)

看看A100的存儲系統改進,我關注了以下這些:

  • 新的異步Copy指令,從global memory直接load到shared memory。
  • 超大L2C,partitioned,use it smarter。
  • 新的指令做L2 cache residency control。
  • Compute Data Compression: 4x DRAM and L2 bandwidth, 2x L2 capacity. (不同于Structured Sparsity)
  • Combined L1 data cache and shared memory (其實是Volta架構開始就有的)
NV Ampere GPU架構學習與思考

Asynchronous copy

我了解為這是專為DNN Kernel裡的Input/Activation資料類似的資料流優化。

  • 因為這類資料,讀自Global Memory,大都一次使用,不需要到RF,用完不需寫回。是以沒必要走複雜的L1/RF。而把RF/L1的帶寬留給weigh和temp變量。
  • 另外,這是異步操作,和SM裡其他操作可并發,進而可以隐藏較長的copy cycles。使用新的shared-memory-based barrier來做同步。
  • 同時,需要新的程式設計模型(CUDA)支援和編譯器支援。
NV Ampere GPU架構學習與思考

L2 cache residency control

首先,L2的設計很複雜,整理一下思路,根據新的特性出發來思考:

  • 大幅度增長的L2 size (40MB),
    • 首先,主要是為了大量的權重資料重用。
    • 其次,MIG architecture的引入,需要将L2分成最多7份,也需要更大的size
  • 大的L2,開始分區使用,類似于我們的LLC+L2的設計。
    • 分區以後,每個GPC直連L2了,帶寬增加(細節不懂。。。)
    • 每個區應該也繼續像以前一樣分類,這樣就是看,L2像是被做了兩維的拆分,不知道這個是不是就是NV提到的new partitioned crossbar structure。
    • 但整個L2Cache仍然保持“Shared”屬性,HW cache-coherence,以及CUDA程式設計模型。

AI應用中,L2C應該主要優化了權重的複用,根據模型的大小,可以有不同級别的重用粒度,這個思路和之前在V1.5裡提到的根據權重大小不同而産生的不同工作模式

  • 權重全部在L2C,就像V1一樣,整個模型權重隻用裝載一次到L2C。
  • 權重需要分段輪流裝載L2C,
    • 裝載一部分權重後,把相關的計算一個一個batch做完。然後換下一段權重,繼續做。
    • 這個時候,多batch的工作模式比較有優勢。能公用更多的權重。
    • 使用double buffer (ping-pong buffer)的模式,可以讓計算和權重裝載并行。

說到這裡,大概就知道為什麼需要L2 cache residency control。就是用來分段裝載,實作ping-pong buffer的。

同樣,也需要指令和CUDA程式設計模型的支援。

NV Ampere GPU架構學習與思考

Compute Data Compression

注意這不是Structured Sparsity,而是針對unstructured sparsity and other compressible data patterns.

我知道我們也在看相關的技術。隻是現在還不知道A100是怎麼做的,但至少證明了這條路是可行的。需要大家一起持續關注。

NV Ampere GPU架構學習與思考

Combined L1 cache and shared memory

從Volta架構開始,這個改變就發生了。理由看起來也比較充分:越來越多的計算場景,對Shared Memory和Cache的需求有很大不同。很難有一個固定比例能滿足大部分的場景。是以可以配置的Shared Memory和L1C應該能比較友善而顯著地提高性能。不需要為了固定的Shared Memory/L1C而絞盡腦汁地調整程式和調試性能。

之前的讨論中鄒老師提到,做過一些實驗發現差别不大。我有一些猜測,可能是實驗面不夠廣,我們可以做進一步的實驗:

  • 這個改變是在Volta架構裡,随着Tensor core一起引入。TC計算裡這種差别可能特别明顯,比如
    • 做Matmul/Conv等使用TC的Kernel,通常是Shared Memory要的比較多(絕大部分),而cache用的很少
    • 如果是LSTM的複雜Kernel,則會對Cache要求比較多。
  • 越來越多的通用/AI計算場景,

整體而言,這個靈活性是有價值的。非常有利用調整和控制Kernel訪存的性能和最終性能。

cache系統總結

首先是提供能力:BW/Capacity/使用率

  • 直接提高帶寬
  • Capacity

不止單純的大小,還包括動态配置設定等方式

  • DRAM BW

1.7x BW不足,通過6.7x L2 + Residency Control彌補

其次是減少需求:

  • Sparsity
  • Compression
NV Ampere GPU架構學習與思考

Task Graph Acceleration

這應該是對整體性能(整個模型甚至多個模型)非常意義的一個特性。針對的是“一個網絡模型由很多的小Kernel組成”這個特征。

這個思路---把多個Tasks,memory copies(uploading/downloading)做成一個圖(Graph,Directed Acyclic Graph),加上Dependency關系,以前都是在軟體端實作的。比如:

  • GPU應用領域,多個draw batches,互相間或有複雜的dependency,為做到高效地并行,避免不必要的bubble,最好能做到out-of-order的執行。我知道的軟體棧,做過相關的優化處理:UMD建立有dependency關系的DAG,KMD根據DAG,dependency資訊,以及硬體的執行狀态,動态的排程draw batches。
  • AI領域,DNN本身就是一個DAG。
    • 在NPU V1架構上,這個問題不明顯但也存在。不明顯的原因是大部分連續的可支援的算子被合并成了一個執行Engine。但遇到大的Engine需要拆分的時候,還是需要會有這個問題的,是以我們還是在軟體棧實作了基于DAG的推理引擎。
    • 在GPGPU架構,加上訓練功能,将會有很多很多小的Kernel了。是以特别需要這個優化。

是以存在CPU和GPU之間的來回排程。A100的創新是把這個移到了硬體上。去除了這個CPU-GPU排程代價。

CUDA Graph

CUDA 10開始支援的一個特性,是Task Graph Acceleration的基礎。首先把多個Kernel一起送出(submit)到GPU。減少kernel送出和同步的時間。不過submit之後的kernel隻能按照順序執行。并行度比較差。

NV Ampere GPU架構學習與思考

Ampere架構支援以圖的方式送出,并帶有互相的依賴關系。是以GPU硬體可能更高效的排程kernel并行。

繼續閱讀