『高性能模型』Roofline Model與深度學習模型的性能分析


轉載自知乎:Roofline Model與深度學習模型的性能分析

在真實世界中,任何模型(例如 VGG / MobileNet 等)都必須依賴於具體的計算平台(例如CPU / GPU / ASIC 等)才能展現自己的實力。此時,模型和計算平台的"默契程度"會決定模型的實際表現。Roofline Model 提出了使用 Operational Intensity(計算強度)進行定量分析的方法,並給出了模型在計算平台上所能達到理論計算性能上限公式。

一、指標介紹

1、計算平台的兩個指標:算力π,帶寬ß

算力π:也稱為計算平台的性能上限,指的是一個計算平台傾盡全力每秒鍾所能完成的浮點運算數。單位是FLOP/s

帶寬ß:也即計算平台的帶寬上限,指的是一個計算平台傾盡全力每秒所能完成的內存交換量。單位是Byte/s

計算強度上限 I max:兩個指標相除即可得到計算平台的計算強度上限。它描述的是在這個計算平台上,單位內存交換最多用來進行多少次計算。單位是FLOP/Byte

I max = π / ß

:這里所說的“內存”是廣義上的內存。對於CPU計算平台而言指的就是真正的內存;而對於GPU計算平台指的則是顯存。

2、 模型的兩個指標:計算量,訪存量

計算量:指的是輸入單個樣本(對於CNN而言就是一張圖像),模型進行一次完整的前向傳播所發生的浮點運算個數,也即模型的時間復雜度,單位是FLOPS。

訪存量:指的是輸入單個樣本,模型完成一次前向傳播過程中所發生的內存交換總量,也即模型的空間復雜度。在理想情況下(即不考慮片上緩存),模型的訪存量就是模型各層權重參數的內存占用(Kernel Mem)與每層所輸出的特征圖的內存占用(Output Mem)之和。單位是Byte。由於數據類型通常為float32 ,因此需要乘以四。

模型的計算強度 I由計算量除以訪存量就可以得到模型的計算強度,它表示此模型在計算過程中,每Byte內存交換到底用於進行多少次浮點運算。單位是FLOP/Byte。可以看到,模計算強度越大,其內存使用效率越高。

二、Roof-line Model 形態

其實 Roof-line Model 說的是很簡單的一件事:模型在一個計算平台的限制下,到底能達到多快的浮點計算速度

更具體的來說,Roof-line Model 解決的,是“計算量為A且訪存量為B的模型在算力為C且帶寬為D的計算平台所能達到的理論性能上限E是多少”這個問題。

所謂“Roof-line”,指的就是由計算平台的算力和帶寬上限這兩個參數所決定的“屋頂”形態,如上圖圖所示。

  • 算力決定“屋頂”的高度(綠色線段)
  • 帶寬決定“房檐”的斜率(紅色線段)

a、帶寬瓶頸區域 Memory-Bound

當模型的計算強度  小於計算平台的計算強度上限 I max 時,由於此時模型位於“房檐”區間,因此模型理論性能 P 的大小完全由計算平台的帶寬上限 ß (房檐的斜率)以及模型自身的計算強度 I 所決定,因此這時候就稱模型處於 Memory-Bound 狀態。可見,在模型處於帶寬瓶頸區間的前提下,計算平台的帶寬 ß 越大(房檐越陡),或者模型的計算強度 I 越大,模型的理論性能 P 可呈線性增長。

一方面,我們可以認為計算平台的帶寬限制導致計算平台的算力不能完全發揮;另一方面我們也可以認為,模型的計算強度太低,導致對單位內存訪問時的計算量太小。

b、計算瓶頸區域 Compute-Bound

不管模型的計算強度 I 有多大,它的理論性能 P 最大只能等於計算平台的算力 π 。當模型的計算強度 I 大於計算平台的計算強度上限 I max 時,模型在當前計算平台處於 Compute-Bound 狀態,即模型的理論性能 P 受到計算平台算力 π 的限制,無法與計算強度 I 成正比。

但這其實並不是一件壞事,因為從充分利用計算平台算力的角度上看,此時模型已經 100% 的利用了計算平台的全部算力。可見,計算平台的算力 π 越高,模型進入計算瓶頸區域后的理論性能 P 也就越大。

三、使用 Roof-line 分析模型

1、理論分析

a、VGG16

VGG 可以說是在計算強度上登峰造極的一個模型系列,簡約不簡單。以 VGG16 為例,從上表可以看到,僅包含一次前向傳播的計算量就達到了 15GFLOPs,如果包含反向傳播,則需要再乘二。訪存量則是 Kernel Mem 和 Output Mem 之和再乘以四,大約是 600MB。因此 VGG16 的計算強度就是 25 FLOP/Byte。

另外如果把模型頂端那兩個碩大無比的全鏈接層(其參數量占整個模型的80%以上)替換為GAP以降低訪存量(事實證明這樣修改並不會影響准確率),那么它的實際計算強度可以再提升四倍以上,簡直突破天際。

注:以上分析僅限於前向傳播計算過程(即模型預測)。如果涵蓋反向傳播(即模型訓練),則計算量和訪存量都要考慮梯度更新的具體方式,例如計算 Momentum 幾個變量時引入的時間和空間復雜度。

b、MobileNet

MobileNet 是以輕量著稱的小網絡代表。相比簡單而龐大的 VGG16 結構,MobileNet 的網絡更為細長,加入了大量的BN,每一層都通過 DW + PW 的方式降低了計算量,同時也付出了計算效率低的代價。從上面超級長的表格就能有一個感性的的認識。

MobileNet 的計算量只有大約 0.5 GFLOPS(VGG16 則是 15 GFLOPS),其訪存量也只有 74 MB(VGG16 則是約 600 MB)。這樣看上去確實輕量了很多,但是由於計算量和訪存量都下降了,而且相比之下計算量下降的更厲害,因此 MobileNet 的計算強度只有 7 FLOP/Byte。

 2、兩個模型在 1080Ti 上的對比

1080Ti 的算力 π = 11.3 TFLOPS/s

1080Ti 的帶寬 ß = 484 GB/s

因此 1080Ti 計算平台的最大計算強度 I max ≈ 24

VGG16 的計算強度 I v≈ 25

MobileNet 的計算強度 I M≈ 7

 

由上圖可以非常清晰的看到,

  • MobileNet 處於 Memory-Bound 區域。在 1080Ti 上的理論性能只有 3.3 TFLOP/s。
  • VGG16 剛好邁入 Compute-Bound 區域。完全利用 1080Ti 的全部算力

雖然 MobileNet 進行前向傳播的計算量只有 VGG 的三十分之一,但是由於計算平台的帶寬限制,它不能像 VGG 那樣完全利用 1080Ti 這個計算平台的全部算力,因此它在 1080Ti 上每秒鍾可以進行的浮點運算數只能達到 VGG 的 30%,因此理論上的運行速度大約是 VGG 的十倍(實際上會因為各方面其他因素的限制而使得差別更小)。

MobileNet 這類小型網絡更適合運行在嵌入式平台之上。首先這類輕量級的計算平台根本就放不下也運行不起來 VGG 這種大模型。更重要的是,由於這類計算平台本身的計算強度上限就很低,可能比 MobileNet 的計算強度還要小,因此 MobileNet 運行在這類計算平台上的時候,它就不再位於 Memory-Bound 區域,而是農奴翻身把歌唱的進入了 Compute-Bound 區域,此時 MobileNet 和 VGG16 一樣可以充分利用計算平台的算力,而且內存消耗和計算量都小了一兩個數量級,同時分類准確率只下降了1%,所以大家才願意用它。

 

Roofline 模型講的是程序在計算平台的算力和帶寬這兩個指標限制下,所能達到的理論性能上界,而不是實際達到的性能,因為實際計算過程中還有除算力和帶寬之外的其他重要因素,它們也會影響模型的實際性能,這是 Roofline Model 未考慮到的。例如矩陣乘法,會因為 cache 大小的限制、GEMM 實現的優劣等其他限制,導致你幾乎無法達到 Roofline 模型所定義的邊界(屋頂)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM