gpu對於機器學習是必不可少的。可以通過AWS或谷歌cloud輕鬆地啟動這些機器的集群。NVIDIA擁有業內領先的GPU,其張量核心為Volta V100和安培A100加速哪種方法最適合你的神經網絡?為了以最低的成本設計出最快的神經網絡,機器學習架構師必須解決許多問題。此外,僅僅使用帶有GPU和張量核心的機器並不能保證最高性能。那麼,作為一個機器學習架構師,應該如何處理這個問題呢?當然,您不能是硬體不可知論者。您需要了解硬體的功能,以便以最低的成本獲得最大的性能。
作為一個機器學習架構師,你應該如何設計神經網絡來最大化GPU的性能?
在本文中,我們將深入了解機器學習架構師實現性能最大化的手段。我們將特別關注矩陣-矩陣乘法,因為它是機器學習中最常見和最繁重的數學操作。
讓我們從一個簡單的全連接的一個隱藏層神經網絡開始:
圖1:在神經網絡的每一層進行矩陣乘法,每一步的矩陣乘法的形狀如括號所示。例如(B, L1)是B行L1列的矩陣的形狀。MM1, MM2,…MM5是各種矩陣-矩陣乘法。
從基本神經網絡可以看出,在第L2層,我們進行了3次矩陣-矩陣乘法(1向前,2向後)。在第L1層,我們執行2個矩陣-矩陣乘法(1向前,1向後)。事實上,除了第一層(L1)之外,我們在每一層都執行了3次矩陣乘法。如果神經網絡有n層,則需要進行3n-1個矩陣-矩陣乘法,即時,它隨神經網絡的大小線性增長。
一個快速觀察方法是將批大小設置成1,我們看下B=1時的情況,即一次只學習一個數據點。在這種情況下,矩陣-矩陣退化為矩陣-向量的乘法。然而,在實踐中,批大小從不為1。在梯度下降中,在每個學習步驟中考慮整個數據集,而在隨機梯度下降中,在每個學習步驟中考慮一批B > 1(但比整個數據集要少得多)。
在本文中,讓我們關注兩個維數(M, K)和(K, N)的矩陣a和B之間的單個矩陣-矩陣乘法,分別得到維數(M, N)的矩陣C。
維數M, N, K由每層神經網絡的結構決定。例如,在AlexNet中,批處理大小為128,有幾個密集的層(4096個節點)和一個輸出層(1000個節點)。這將導致(128,4096)和(409,1000)矩陣的乘法。這些是相當大的矩陣。
圖2。平鋪的矩陣乘法
「大」是什麼意思?這些矩陣是如何相乘的?所謂「大」,是指任何不能裝入內存的矩陣。讓我們更深入地研究大矩陣乘法。我們在教科書中學習的矩陣乘法假設矩陣與記憶相吻合。但在現實中,情況可能並非如此,尤其是在機器學習方面。此外,為了獲得最佳性能,精細調優的矩陣乘法算法必須考慮到計算機中的內存層次結構。對於無法裝入內存的矩陣乘法,最常用的方法是平鋪/阻塞矩陣乘法算法。塊矩陣乘法,矩陣分割成更小的塊,適合到內存中,然後計算部分的合成產品矩陣(參見圖2)。圖3展示了塊矩陣乘法如何遞歸地應用在每一個級別的內存層次結構。
圖3:在NVIDIA CPU-GPU系統的完整內存層次中遞歸應用平鋪/塊矩陣-矩陣乘法。GEMM表示一般矩陣乘法。
我們不會在這裡進入精確的平鋪矩陣乘法算法,感興趣的讀者參閱本文。BLAS中用於一般矩陣乘法的庫例程稱為GEMM。NVBLAS是GEMM的Nvidia實現,它利用了內部的GPU架構,實現了平鋪/塊矩陣乘法。PyTorch和TensorFlow連結到Nvidia GPU上的這個庫。類庫為你做所有繁重的工作。但是設計糟糕的神經網絡肯定會降低性能。
對於我們來說,最直接的目標是儘可能快地找出矩陣-矩陣乘法執行的條件。這是可能的,只有當GPU是100%忙,而不是為了等待數據而空閒。為此,我們需要查看內存層次結構,以及數據在內存層次結構中移動的速度有多快。
圖4:Roofline 模型
內存層次結構為提高性能提供了關鍵優勢:1)它們隱藏了CPU、GPU、內存組件之間的延遲差異,2)它們利用了程序局部性。此外,一個設計良好的內存層次結構以最低的成本/字節提供最高的性能。為了讓gpu持續地忙碌,數據塊必須快速地輸入gpu。這是由數據傳輸帶寬和GPU處理數據的速度決定的。這個性能度量由Roofline 模型中的ops:字節比率捕獲(圖4)。
圖5顯示了如何從供應商的規格中計算這個。我們看到,ops:字節比是139 V100,和416 A100。越大的ops:字節比率,會提供更大計算速度,如果計算是內存或算術限制。換句話說,一個具有較高ops: bytes ratio的系統比一個較小的系統更強大。這就是為什麼 A100比 V100更強大。
圖5:計算ops:字節比率規範。
ops:字節比對於機器學習和矩陣乘法意味著什麼?要了解這一點,我們現在必須看看矩陣乘法的計算和數據要求。算術強度定義為浮點運算/秒與字節的比率。圖6顯示了如何計算算術強度。
圖6:計算矩陣乘法的算術強度
如果算術強度> ops:bytes,那麼矩陣乘法就是算術界限,否則就是內存界限。
因此,第一個問題是,所涉及矩陣的維數應該被設計成算術強度大於ops:字節。這將確保GPU被充分利用。例如批處理大小= 512,N=1024, M=4096,算術強度為315,大於Volta V100 GPU的139。因此,該矩陣乘法是在Volta V100上的算術界,GPU將得到充分利用。圖7顯示了機器學習中一些常見操作的算法強度。第二行對應於批大小= 1。在這種情況下,線性層變成了內存界而不是算術界。這就是為什麼批量大小為1一般不用於生產機器學習算法的原因。
圖7。機器學習中一些常見操作的算術強度。來源:NVIDIA文檔
然而,通過選擇正確的矩陣維數來保證正確的算法強度並不足以實現算法性能的峰值,還需要保證所有張量核都處於繁忙狀態。為了有效地使用Nvidia的張量核心,對於FP16算法,M, N, K必須是8的倍數,對於FP32算法必須是16的倍數。Nvidia核庫檢查矩陣的維數,如果滿足條件,則將操作路由到張量核。這可以導致在Volta上使用張量磁心比使用沒有張量磁心6倍的加速。因此,第二個要點是,如果尺寸不是8或16的倍數,那麼建議適當填充尺寸。
作為一名機器學習架構師,在您尋求提高性能的過程中,您將不可避免地面臨是否要從Volta升級到Ampere並支付更高的成本的決定。為此,必須使用Roofline模型確定神經網絡是算術界限還是內存界限。如果兩者都不是,那麼升級到更強大的機器就沒有價值了。這是第三個要點。Nvidia提供了Nsight Compute等工具來執行應用程式分析。
總結
矩陣-矩陣乘法是神經網絡訓練和推理中最常用的運算。矩陣乘法的次數幾乎是神經網絡層數的3n。因此,儘可能快地計算這些是很重要的。在神經網絡中,矩陣是非常大的。因此,我們總是使用GPU來加速矩陣乘法。為了做到這一點,我們必須了解GPU的ops:字節比,並設計層的算法強度要大於ops:字節比,如果可能的話。為了達到使用所有張量核心的峰值算術性能,矩陣的維數也必須滿足NVIDIA架構對使用張量核心的要求。通常,它是8 (FP16算術)或16 (FP32算術)的倍數。最好查看文檔以確保滿足需求。您應該確定應用程式是內存綁定還是算術綁定。如果兩者都不是,那麼升級到更強大的GPU就沒有意義了。否則,我們可以通過升級進一步加速。了解硬體功能及其對最大化性能的要求將有助於明智地選擇矩陣維數和批大小。這將導致神經網絡的設計,使訓練可以在最短的時間內以最低的成本完成。引用
Nvidia docs: Deep Learning performance documentationNvidia: It’s all about Tensor Cores, AnandTech Blog 2018Fast Implementation of DGEMM on Fermi GPU, Proceeding of the 2011 International Conference on High Performance, Storage, and AnalysisRoofline: An Insightful Visual Performance Model for Floating-Point Programs and Multicore Architectures,Comm. of the ACM, April 2009Performance Analysis of GPU-Accelerated Applications using the Roofline Model, NVIDIA, 2019Intel Advisor Roofline AnalysisNvidia Nsight ComputeNvidia Ampere A100 DatasheetNvidia Volta V100 Datasheet這篇文章觸及了加速機器學習的一個方面。這個問題還有其他方面。希望這篇文章對您有用。
作者:Kiran Achyutuni
deephub翻譯組