如何在GPU上設計高性能的神經網絡

2020-12-11 deephub

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翻譯組

相關焦點

  • 在 Ubuntu 16.04 中安裝支持 CPU 和 GPU 的 Google TensorFlow 神經網絡軟體
    TensorFlow 是一個非常強大的工具,專注於一種稱為深層神經網絡deep neural network(DNN)的神經網絡。深層神經網絡被用來執行複雜的機器學習任務,例如圖像識別、手寫識別、自然語言處理、聊天機器人等等。這些神經網絡被訓練學習其所要執行的任務。由於訓練所需的計算是非常巨大的,在大多數情況下需要 GPU 支持,這時 TensorFlow 就派上用場了。
  • 【CTO講堂】如何用Python一門語言通吃高性能並發、GPU計算和深度...
    為了幫助IT從業者職業之路擁有更多收穫,在諸多C粉的殷切期待下,由 CTO俱樂部打造的CTO線上講堂自登場以來獲得大家好評。本期邀請極驗驗證CTO黃勝藍帶來「如何用Python一門語言通吃高性能並發、GPU計算和深度學習 」的主題分享。歡迎加入CTO講堂微信群與業界大咖零距離溝通,1月7日本期講堂報名方式拖至文末查看。
  • 【經驗】深度學習如何挑選GPU?
    深度學習是一個對計算有著大量需求的領域,從一定程度上來說,GPU的選擇將從根本上決定深度學習的體驗。
  • 尋找最佳的神經網絡架構,韓松組兩篇論文解讀
    第二篇則是利用強化學習自動尋找在特定 latency 標準上精度最好的量化神經網絡結構,它分別為網絡的每一層搜索不同 bit 的權值和激活,得到一個經過優化的混合精度模型。神經結構搜索 (NAS) 是一種自動化設計人工神經網絡 (ANN) 的技術,被用於設計與手工設計的網絡性能相同甚至更優的網絡。目前 NAS 已經在圖像識別和語言模型等任務的自動化神經網絡結構設計中取得了顯著成功。
  • 2020年深度學習如何挑選 GPU?這篇 GPU 最全攻略請查收
    深度學習是一個對計算有著大量需求的領域,從一定程度上來說,GPU的選擇將從根本上決定深度學習的體驗。
  • 2020 年深度學習如何挑選 GPU?這篇 GPU 最全攻略請查收
    的選擇將從根本上決定深度學習的體驗。那麼2020年,如何選擇合適的GPU呢?這篇文章整合了網絡上現有的GPU選擇標準和評測信息,希望能作為你的購買決策的參考。1 是什麼使一個GPU比另一個GPU更快?有一些可靠的性能指標可以作為人們的經驗判斷。
  • 2020年深度學習如何挑選GPU?這篇 GPU 最全攻略請查收
    關注 極市平臺 公眾號 ,回復 加群,立刻申請入群~深度學習是一個對計算有著大量需求的領域,從一定程度上來說,GPU的選擇將從根本上決定深度學習的體驗。因此,選擇購買合適的GPU是一項非常重要的決策。那麼2020年,如何選擇合適的GPU呢?
  • 利用 PyTorch 構建神經網絡(詳細版)
    在本文章中,我們將使用 PyTorch 從頭開始實現一個簡單的神經網絡。註:閱讀本文之前,最好可以了解神經網絡的工作原理。雖然有很多庫可以用於深度學習,但我最喜歡 PyTorch。作為一名 python 程式設計師,我喜歡 PyTorch 的 python 行為是原因之一。它主要使用了 python 的風格和能力,這是很容易理解和使用。
  • 使用GPU.js改善JavaScript性能
    同時,web worker仍然運行在CPU上,但是運行在不同的線程上。在該初學者指南中,我們將演示如何使用GPU.js執行複雜的數學計算並提高JavaScript應用的性能。什麼是GPU.js?高性能計算是使用GPU.js的主要優勢之一。如果你想在瀏覽器中進行並行計算,而不了解WebGL,那麼GPU.js是一個適合你的庫。為什麼要使用GPU.js為什麼要使用GPU執行複雜的計算的原因不勝枚舉,有太多的原因無法在一篇文章中探討。以下是使用GPU的一些最值得注意的好處。GPU可用於執行大規模並行GPGPU計算。
  • 衝量網絡|神經網絡
    上一期我們介紹了機器學習的相關知識,但其可以說是一種比較寬泛的定義,在實際的實現過程中,人們發現面對分布式技術和輸出層較多的深度學習場景,缺少一種比較有效的算法解決方案,在這樣的需求背景下,神經網絡技術便應運而生,其模擬人腦的神經網絡以期能夠實現類人類智能的機器學習技術。
  • 深度卷積神經網絡CNNs的多GPU並行框架 及其在圖像識別的應用
    Deep CNNs的單機多GPU模型並行和數據並行框架是騰訊深度學習平臺的一部分,騰訊深度學習平臺技術團隊實現了模型並行和數據並行技術加速Deep CNNs訓練,證實模型拆分對減少單GPU上顯存佔用有效,並且在加速比指標上得到顯著收益,同時可以以較快速度訓練更大的深度卷積神經網絡,提升模型準確率。
  • 用Keras從零開始6步驟訓練神經網絡
    一,Keras簡介Keras 是一個用 Python 編寫的高級神經網絡 API,它能夠以 TensorFlow,Theano 或者 CNTK, MXNet 作為後端運行。Keras 具有以下優勢:簡單易用:Keras是為人類而不是為機器設計的 API。它把用戶體驗放在首要和中心位置。
  • 如何設計卷積神經網絡CNN?
    所以設計網絡結構還真是一件非常費事費力的事情。如何設計CNN網絡架構資料匯總在inception和resnet網絡提出並相對完善以後,網絡結構的設計就不再爆發式出現了,這兩大類網路涵蓋了大部分應用的卷積網絡結構。!很有用——基於CNN的圖形分類綜合設計指南對於大多數應用來說,應該使用遷移學習而不是從頭訓練網絡。
  • 使用神經網絡為圖像生成標題
    我們都知道,神經網絡可以在執行某些任務時複製人腦的功能。神經網絡在計算機視覺和自然語言生成方面的應用已經非常引人注目。本文將介紹神經網絡的一個這樣的應用,並讓讀者了解如何使用CNNs和RNNs (LSTM)的混合網絡實際為圖像生成標題(描述)。
  • 如何從Tensorflow中創建CNN,並在GPU上運行該模型(附代碼)
    最後,您將學習如何在GPU上運行該模型,以便您可以花時間創建更好的模型,而不是等待它們匯聚。>▍先決條件理解機器學習理解TensorflowAWS帳戶(用於gpu)▍卷積神經網絡卷積神經網絡是目前最先進的圖像分類架構。
  • 李理:詳解卷積神經網絡
    這種神經網絡在計算機視覺領域取得了重大的成功,而且在自然語言處理等其它領域也有很好的應用。深度學習受到大家的關注很大一個原因就是Alex等人實現的AlexNet(一種深度卷積神經網絡)在LSVRC-2010 ImageNet這個比賽中取得了非常好的成績。此後,卷積神經網絡及其變種被廣泛應用於各種圖像相關任務。
  • 【技術茶話會】如何在電腦上搭建 tensorflow 環境
    TensorFlow 是一個由谷歌開發和維護的基於數據流編程的符號數學系統,被廣泛應用於各類機器學習,完成版的支持 c 和 python 語言,但機器學習模塊大多使用 python 語言編寫,下面來介紹一下如何在自己的筆記本電腦上搭建 python 語言的 tensorflow 環境。
  • 從GPU、TPU到FPGA及其它:一文讀懂神經網絡硬體平臺戰局
    近日,多家公司的技術顧問 Matt Hurd 在其博客上發表了一篇全面評點各種神經網絡硬體平臺的長文,機器之心對本文進行了編譯介紹。這是我幾周前做的一個傳統的 90 年代風格的性別識別神經網絡的很好的隱藏節點。
  • 深度學習中GPU和顯存分析
    這裡推薦一個好用的小工具:gpustat,直接pip install gpustat即可安裝,gpustat基於nvidia-smi,可以提供更美觀簡潔的展示,結合watch命令,可以動態實時監控GPU的使用情況。watch --color -n1 gpustat -cpu
  • 初學AI神經網絡應該選擇Keras或是Pytorch框架?
    TensorFlow框架儘管意義非凡,引起極大關注和神經網絡學習風潮,但對一般開發者用戶太不友好。軟體開發者畢竟不是科學家,很多時候簡單易學易用是程式設計師選擇的第一要素。目前,兩個主要的深度學習庫Keras和Pytorch獲得了大量關注,主要是因為它們的使用比較簡單。