轉載自知乎:Roofline Model與深度學習模型的性能分析緩存
在真實世界中,任何模型(例如 VGG / MobileNet 等)都必須依賴於具體的計算平臺(例如CPU / GPU / ASIC 等)才能展示本身的實力。此時,模型和計算平臺的"默契程度"會決定模型的實際表現。Roofline Model 提出了使用 Operational Intensity(計算強度)進行定量分析的方法,並給出了模型在計算平臺上所能達到理論計算性能上限公式。網絡
算力π:也稱爲計算平臺的性能上限,指的是一個計算平臺傾盡全力每秒鐘所能完成的浮點運算數。單位是FLOP/s
。性能
帶寬ß:也即計算平臺的帶寬上限,指的是一個計算平臺傾盡全力每秒所能完成的內存交換量。單位是Byte/s
。學習
計算強度上限 I max:兩個指標相除便可獲得計算平臺的計算強度上限。它描述的是在這個計算平臺上,單位內存交換最多用來進行多少次計算。單位是FLOP/Byte
。spa
I max = π / ßcode
注:這裏所說的「內存」是廣義上的內存。對於CPU計算平臺而言指的就是真正的內存;而對於GPU計算平臺指的則是顯存。blog
計算量:指的是輸入單個樣本(對於CNN而言就是一張圖像),模型進行一次完整的前向傳播所發生的浮點運算個數,也即模型的時間複雜度,單位是FLOPS。
內存
訪存量:指的是輸入單個樣本,模型完成一次前向傳播過程當中所發生的內存交換總量,也即模型的空間複雜度。在理想狀況下(即不考慮片上緩存),模型的訪存量就是模型各層權重參數的內存佔用(Kernel Mem)與每層所輸出的特徵圖的內存佔用(Output Mem)之和。單位是Byte
。因爲數據類型一般爲float32
,所以須要乘以四。get
模型的計算強度 I:由計算量除以訪存量就能夠獲得模型的計算強度,它表示此模型在計算過程當中,每Byte
內存交換到底用於進行多少次浮點運算。單位是FLOP/Byte
。能夠看到,模計算強度越大,其內存使用效率越高。深度學習
其實 Roof-line Model 說的是很簡單的一件事:模型在一個計算平臺的限制下,到底能達到多快的浮點計算速度。
更具體的來講,Roof-line Model 解決的,是「計算量爲A且訪存量爲B的模型在算力爲C且帶寬爲D的計算平臺所能達到的理論性能上限E是多少」這個問題。
所謂「Roof-line」,指的就是由計算平臺的算力和帶寬上限這兩個參數所決定的「屋頂」形態,如上圖圖所示。
Memory-Bound
當模型的計算強度 I 小於計算平臺的計算強度上限 I max 時,因爲此時模型位於「房檐」區間,所以模型理論性能 P 的大小徹底由計算平臺的帶寬上限 ß (房檐的斜率)以及模型自身的計算強度 I 所決定,所以這時候就稱模型處於 Memory-Bound
狀態。可見,在模型處於帶寬瓶頸區間的前提下,計算平臺的帶寬 ß 越大(房檐越陡),或者模型的計算強度 I 越大,模型的理論性能 P 可呈線性增加。
一方面,咱們能夠認爲計算平臺的帶寬限制致使計算平臺的算力不能徹底發揮;另外一方面咱們也能夠認爲,模型的計算強度過低,致使對單位內存訪問時的計算量過小。
Compute-Bound
無論模型的計算強度 I 有多大,它的理論性能 P 最大隻能等於計算平臺的算力 π 。當模型的計算強度 I 大於計算平臺的計算強度上限 I max 時,模型在當前計算平臺處於 Compute-Bound
狀態,即模型的理論性能 P 受到計算平臺算力 π 的限制,沒法與計算強度 I 成正比。
但這其實並非一件壞事,由於從充分利用計算平臺算力的角度上看,此時模型已經 100% 的利用了計算平臺的所有算力。可見,計算平臺的算力 π 越高,模型進入計算瓶頸區域後的理論性能 P 也就越大。
VGG 能夠說是在計算強度上登峯造極的一個模型系列,簡約不簡單。以 VGG16 爲例,從上表能夠看到,僅包含一次前向傳播的計算量就達到了 15GFLOPs,若是包含反向傳播,則須要再乘二。訪存量則是 Kernel Mem 和 Output Mem 之和再乘以四,大約是 600MB。所以 VGG16 的計算強度就是 25 FLOP/Byte。
另外若是把模型頂端那兩個碩大無比的全連接層(其參數量佔整個模型的80%以上)替換爲GAP以下降訪存量(事實證實這樣修改並不會影響準確率),那麼它的實際計算強度能夠再提高四倍以上,簡直突破天際。
注:以上分析僅限於前向傳播計算過程(即模型預測)。若是涵蓋反向傳播(即模型訓練),則計算量和訪存量都要考慮梯度更新的具體方式,例如計算 Momentum 幾個變量時引入的時間和空間複雜度。
MobileNet 是以輕量著稱的小網絡表明。相比簡單而龐大的 VGG16 結構,MobileNet 的網絡更爲細長,加入了大量的BN,每一層都經過 DW + PW 的方式下降了計算量,同時也付出了計算效率低的代價。從上面超級長的表格就能有一個感性的的認識。
MobileNet 的計算量只有大約 0.5 GFLOPS(VGG16 則是 15 GFLOPS),其訪存量也只有 74 MB(VGG16 則是約 600 MB)。這樣看上去確實輕量了不少,可是因爲計算量和訪存量都降低了,並且相比之下計算量降低的更厲害,所以 MobileNet 的計算強度只有 7 FLOP/Byte。
1080Ti 的算力 π = 11.3 TFLOPS/s
1080Ti 的帶寬 ß = 484 GB/s
所以 1080Ti 計算平臺的最大計算強度 I max ≈ 24
VGG16 的計算強度 I v≈ 25
MobileNet 的計算強度 I M≈ 7
由上圖能夠很是清晰的看到,
雖然 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 模型所定義的邊界(屋頂)。