今天,百度研究院開源了新一代 DeepBench,一款深度學習基準測試工具,這次升級加入了推理測量等功能。
1. 介紹
2016 年 9 月,百度推出了第一版 DeepBench,它是一個開源基準測試工具,用於測試訓練深度學習神經網路的基本效能指標,可相容不同硬體平臺上的神經網路庫。
DeepBench GitHub 地址:https://github.com/baidu-research/DeepBench
DeepBench 的主要目的是測試深度學習系統在不同硬體平臺上的執行效果,它使用神經網路庫來測試硬體系統的表現,而非深度學習框架或模型訓練時間。下圖展示了百度 DeepBench 如何應用於不同深度學習系統。
百度表示,構建 DeepBench 的最大目標是測試:「哪一種硬體在訓練深度神經網路時具有最佳效能?」透過測試深度學習任務的執行速度,DeepBench 可以幫助開發人員選擇最優的硬體配置。此外,DeepBench 也是向硬體供應商提供交流機會的平臺。
DeepBench 包含五個深度學習訓練基礎模組:矩陣乘法、卷積、迴圈運算(vanilla 和「LSTM」)以及它們的簡化版。在實驗中,百度研究人員測試了所有方法的正向和反向運算,並專注於單精度浮點運算的訓練效能。你可以在 DeepBench 的部落格中獲得更多資訊:https://svail.github.io/DeepBench/。
自上次釋出以來,百度已經接到了來自業界和學界的大量反饋資訊。這次,DeepBench 的測試結果中加入了三種新的英偉達 GPU:TitanXp、1080Ti 和 P100。由於廣受歡迎,DeepBench 正在成為深度學習和新硬體開發的標準之一。
深度學習是一個發展很快的領域,大量新的應用正在不斷出現。在測試內容中,新的 DeepBench 加入了推理的測試功能。
2. 推理
對於在 DeepBench 中加入核推理測試的呼聲一直很高,這是一個非常具有挑戰性的問題,因為大多數深度學習應用都具有其特殊性。為了收集用於基準測試的核,百度研究人員調查了公司內部使用的多種不同應用,選擇了其中最熱門的幾種。此外,新版本中也包含了業內常用的深度學習模型性核如深度殘差網路(Resnet)[5]。
深度學習推理也為深度學習模型帶來了一些約束。例如,在實際應用場景下,語音識別必須是實時的,它對延遲的要求很高。正如在 Deep Speech2[2] 中所提到的,雙向迴圈模型不適用於實時互動的語音識別應用。因此,百度研究人員使用了前向迴圈模型。DeepBench 中的推理核均來自已經部署,並在延遲和吞吐量上滿足應用要求的模型。
這些推理核在測試中會進行與訓練集相同的一系列操作,如矩陣乘法、卷積和迴圈操作。此外還有一些不同之處,下文將對此進行討論。
2.1 部署平臺
深度學習的大規模應用,如影像搜尋、機器翻譯和語音識別通常都會部署在資料中心裡。使用者從客戶端嚮應用發出請求,深度學習模型在伺服器中負責處理。遠端伺服器通常是含有多個處理器的強大計算機,足以執行非常複雜的深度神經網路模型。這種方法的缺點也顯而易見:由於網路頻寬等問題的限制,資料傳輸過程中的延遲難以避免——使用者在使用服務時必須連線網路。為了解決這些問題,近年來出現了一些可以部署在移動裝置中的模型 [1,11,12]。然而這些模型需要適應移動和可穿戴裝置的計算能力、能耗和記憶體。
在 DeepBench 上,從伺服器到終端裝置平臺的基準都已包含在內。除了上述新顯示卡的支援外,DeepBench 還支援三種 ARM 系統:Raspberry Pi3、iPhone6 和 iPhone7,所有人都可以使用這些基準測試並將結果新增到儲存庫中。
2.2 縮小批次
為了縮小延遲,大多數聯網應用的請求在傳遞到資料中心後並不會被分割成多執行緒。這樣做有兩個缺點:單獨的處理請求使得操作頻寬隨處理器需要載入網路的權重受到限制,這使得處理器難以有效地利用自身快取記憶體;另外,可用來分類一個請求的並行度是有限的,這使得我們難以利用 SIMD 或多核並行運算。在這種情況下,RNN 難以部署,因為 RNN 依賴於矩陣向量乘法,而它難以平行計算。
為了解決這些問題,百度構建了批處理排程程式 Batch Dispatch[2],它在執行前向傳播之前會將使用者請求封裝為不同批次。這樣,我們就可以透過調整批尺寸來最佳化效率,改善延遲問題。批尺寸越大,使用者等待的時間就越多。這對批數量造成了限制。
在實踐中,批尺寸 4 或 5 對於資料中心部署的效率較高,而在移動裝置部署中,批尺寸被限制為 1。
2.3 推理精度
深度神經網路使用單精度 32 位元浮點數進行訓練。在 3.2 節中將有對訓練精度的詳細討論。推理精度要求明顯低於訓練要求。與浮點模型相比,有幾種不同的模型可以部署 8 位表示用於推理,而它們幾乎沒有精度損失 [4,9,15]。因此,對於推理核,我們分別指定 8 位和 32 位乘法和累加的最小精度。並非所有硬體平臺都支援這些最低精度要求。我們將接受任何具有精度支援大於最小指定精度的平臺的結果。所有結果將包括用於基準測試的精度。
為了使用 ARM 處理器的 8 位輸入進行基準矩陣乘法,DeepBench 使用 Gemmlowp 庫,來自 ARM Compute Library 的卷積核用於卷積基準測試。ARM Compute 庫僅支援單精度卷積,低精度卷積支援會隨後提供。ARM Compute 庫對 RNN 沒有任何支援。因此,DeepBench 不包括 ARM 裝置的 RNN 結果。
對於伺服器部署,DeepBench 使用 CudNN 和 cuBLAS 庫。對於英偉達 GPU 而言,RNN kerenel 僅支援單精度,結果報告同樣給出。有關不同處理器支援哪些操作的更多詳細資訊,請參見第 4 節。
2.4 稀疏核
稀疏神經網路是大多數權重為零的神經網路。這些零權重對神經網路的預測沒有貢獻,但它減少了對於記憶體和計算效能的需求,從而使深度學習模型能夠部署在移動裝置上。RNN 的推理效能主要由硬體的記憶體頻寬支配,因為大多數工作是在每個時間步長中進行引數讀取。稀疏計算會帶來準確性的懲罰,但如果調整得當,稀疏資料需求也能滿足使用。
在資料中心裡使用的伺服器級處理器可以快速推理以服務於單個使用者,但是在資料中心中,效能/花費比是最重要的。允許模型評估更快的諸如稀疏技術等方法可以讓每塊 GPU 為更多使用者提供服務,從而提高能耗比。
過去幾年來,稀疏神經網路已經過了很大的發展 [4,13]。在 DeepBench 中,稀疏矩陣向量和稀疏矩陣乘法核已被包含在內。百度研究人員了在實驗中瞭解到,90-95% 稀疏的神經網路可以達到很好的效能。儘管目前的稀疏矩陣乘法應用使用了更高的稀疏(99% 或更高)。透過包含稀疏核,研究人員希望刺激硬體供應商和軟體開發人員構建新庫,為 90-95%的稀疏提供更好的效能。
DeepBench 使用 Eigen 庫來對 ARM 裝置上的稀疏操作進行基準測試,對於 GPU 的測試則使用了英偉達的 cuSparse 庫。
2.5 延遲討論
很多推理性應用有著實時延遲的要求。比如,語音介面要求語音識別模型在無延遲的情況下可以恢復一個結果,從而可以被使用者捕捉到。DeepBench 核可以被當做一個起點來使用,從而來測量獨立操作下的最佳延遲情況。然而,在聚焦於基礎操作而不是完整應用的情況下,測量全部系統的延遲是超出 DeepBench 此版本的範圍的。例如,一個在移動裝置上執行的完整應用可能需要修改系統啟動時的功率狀態。又比如,一個完整的伺服器應用程式可能有一個重要的延遲部件,它是由使用者和伺服器間的網路連線來決定的。我們可能需要用未來版本的 DeepBench 來解決操作延遲的問題。
3. 訓練更新
在此更新版本中,也包括對訓練核(kernel) 的更新,把百度新應用的核包括在內。此外,我們還看到了在已有應用上的大量新研究。下文中我們將討論兩個主要的訓練升級。
3.1 GRU 支援
在首版 DeepBench 中,我們納入了 Vanilla、LSTM [6] 迴圈神經網路的核函式。而另一個比較常用的迴圈架構師是 GRU(門控迴圈單元)[3]。近期的一項綜合研究顯示,帶有合適初始化門的 GRU 架構表現可媲美於 LSTM[10]。GRU 相比於 LSTM 有更少的引數,在訓練與推理上比 LSTM 更高效。
多種深度學習模型使用 GRU 作為迴圈單元,因此我們在新版 DeepBench 訓練與推理負載中加入了 GRU 核。GRU 相比 LSTM 單元有非常類似的表現特性。類似於 Vanilla RNN 和 LSTM,GRU 有可能透過對比多個層最佳化其表現。GRU 固有的非線性對 Reset 門和 Update 門而言應該是 S 型的。輸出門的非線形應該是一個 Relu 函式。
3.2 低精度訓練
雖然訓練深度學習模型時,大部分研究員都是用單個精度浮點數計算所有 kernel。但學術研究演示了減少在有限資料集上訓練的多個不同模型的精度訓練工作 [7、8、14]。根據以往經驗,我們發現 16 位的半精度浮點數足夠在大型資料集上訓練大型的深度學習模型。使用半精度浮點數訓練,能夠讓硬體更好的利用計算能力。此外,權重也只需要整個模型儲存的一半。
有了此版更新,我們規格化了訓練中用到的所有運算的加與乘的精度。其中,乘與加的最小精度分別設定為了 16 位和 32 位。目前,沒有硬體支援 16 位相乘 和 32 位相加。我們將能夠接受任何滿足這一最小精度需求的硬體平臺的結果。所有的結果都會包含該基準使用的精度。
4. 支援 Ops & 精度
在此部分,我們記錄了對不同處理器所有精度上各種運算的支援。我們儘可能挑選了接近最小需求精度的精度值,其中精度需求如下所示。然而,某些情況下我們需要衡量更高精度運算的基準。下表強調了每個處理器的運算基準。
- 訓練時的最小精度:16 位乘積,32 位的相加
- 推理時的最小精度:8 位乘積,32 位相加
4.1 訓練
單精度結果可用於 6 種英偉達 GPU 以及英特爾的 Xeon Phi 處理器。這些處理器都不支援 16 位相乘與 32 位相加。作為替代,我們衡量了英偉達 Psuedo FP 16 模型的基準,該硬體的輸入/輸出是 16 位,但仍舊是單精度計算。下面的硬體處理器支援單精度訓練。
4.2 伺服器部署
在英偉達處理器上,GEMM 和卷積基準執行的是 8 位相乘與 32 位相加。然而,該精度模式下英偉達 GPU 不支援所有的輸入大小。輸入大小要為 4 倍才能執行這一精度模型。
4.3 裝置部署
下表描述了在不同處理器、ops、精度上裝置推理的核結果。我們沒 RNN 的結果,因為沒有支援 RNN 的 ARM 庫。ARM 計算庫不支援 iPhone。
5. 結論
在這一部分中,我們將記載一些操作的效能。這些都是隨機挑選的,因為我們只是為了演示一些應用的效能。下面的結果僅包括針對特定操作和引數的快速處理器以及它的運算時間和每秒浮點計算。
全部的結果可在以下獲得:https://github.com/baidu-research/DeepBench
5.1 訓練結果
在第一版 DeepBench 中,我們展示了訓練 GEMM、Convolution、vanilla RNN 和 LSTM 的結果。下一部分為一些樣本 GRU kernel 提供了試驗結果。在 5.1.2 中,我們記載了 psuedo 半精度 GEMM 核。
5.1.1 GRU 結果
迴圈 op kernel 只在英偉達硬體上執行。
5.1.2 16 點位 GEMM 表現
在下表中,輸入和輸出是 16 位,但仍使用 32 位計算。
對 GEMM 核函式而言,M、N 和 K 表示矩陣大小。兩個矩陣的大小分別為 M x K、K x N。
5.2 推理伺服器結果
下面幾部分將提供在伺服器平臺上為推理核而執行的 GEMM、Convolution 和 Recurrent 操作結果。這些結果很快可以在英特爾平臺上獲得。
5.2.1 GEMM 結果
5.2.2 稀疏 GEMM 結果
5.2.3 卷積結果
5.2.4 RNN 結果
5.3 推斷裝置結果
5.3.1 GEMM 結果
5.3.2 稀疏 GEMM 結果
5.3.3 卷積結果