EfficientNet V2的背後: 釋放MobileNet在GPU/TPU上的效率

EfficientNet V2的背後: 釋放MobileNet在GPU/TPU上的效率

**在低運算量的類神經網路架構中,結合 inverted bottleneck與 depth-wise convolution的 **MobileNet **與其衍生的 **EfficientNet **系列堪稱經典之作。**然而,低運算量並不代表運行速度快,實際上 MobileNet運行在 GPU/ TPU/ DSP這類硬體上在大多數的時候其實比一般的 ResNet來的慢。因此, MobileNet系列可以說有兩個缺點:第一個是已訓練模型部屬在GPU類的環境下運行效率低落;第二個則是訓練時通常都是GPU類環境,因此時程也會拉得比較久。

近期 EfficientNet的原作提出了EfficientNetV2 ,一個全新的類神經網路架構家族,在精實的架構下提升MobileNet 在 GPU類環境下的運行效率。除了使用training-aware NAS加入對 GPU有善的building block外,訓練網路時會對影像大小與正規化進行動態調配 (progressive learning),在維持強大模型效果的同時,大幅減少模型收斂所需的訓練時間。

Cover made with Canva  (組圖來源)

Tip

文章難度:★★★☆☆

閱讀建議: 這篇文章主要介紹了 EfficientNet V2的改進與強大數據背後的一些訊息。文章整體分三個部分,第一部分介紹 low FLOPs網路架構設計,主要介紹 MobileNets V1到 V3與 EfficientNet V1。第二部分以 roof-line model介紹為何 FLOPs低不一定運行速度快。第三個部分正式介紹 EfficientNet V2與他真正的價值。

推薦背景知識:MobileNet, residual network, depth-wise separable convolution, inverted bottleneck, FLOPs, neural architecture search (NAS), EfficientNet.

在文章開始前,先看一下EfficientNet V2 [1]的數據圖。

EfficientNet V2初看極為驚人的效率圖表 (資料來源)

EfficientNet V2的數據看起來真的很強、很虐,但實際上並不能說是真正全盤輾壓 V1,美好數據隱藏的細節就藏在 latency與 throughput的計算上

Low FLOPs / MAdds Architecture

在電腦視覺領域,類神經網路架構隨著硬體加速元件的發展讓網路參數與運算量也不斷飆升。隨後,在追求網路強大之餘,開始有關注於運行於 mobile device的輕量網路設計。這些設計在前期主要的目標是降低 FLOPs或是 MAdds (可以直觀理解為四則運算的數量),這時期 (2017–2019年) 的知名架構包含MobileNet (V1-V3) [2, 3, 4]、ShuffleNet (V1-V2) [5, 6]、 EfficientNet [7]等等。

** 關於 FLOPs數或 MAdds的計算範例可參考 [補充 1]*

MobileNet最核心的精神是使用 depth-wise separable convolution作為主要的計算單元。一般的 convolution是在一個 3D的 kernel中同時考慮的space與channel之間的關聯,進行一個大的矩陣乘法。Seperable convolution是先考慮space的關聯 (depth-wise convolution),再考慮channel間關聯(pointwise convolution),這樣將一個大的矩陣乘法變成兩個小的矩陣乘法,行為與原本convolution相似卻大幅的降低運算量。

一般convolution與depthwise seperable convolution的差異 (資料來源)

後續改進的 MobileNet V2則是加入了 inverted bottleneck block,先用 point-wise convolution將 channel數拉高後才做過 depth-wise convolution,最後一樣用 point-wise convolution將 channel數拉回。

MobileNet V1對比MobileNet V2 (資料來源)

另外,也移除了最後的 ReLU (作者認為會降低表述能力)。

至於最後的MobileNet V3撇除使用了 NAS來搜尋架構,在 building上的差別是加上了SE (squeeze-and-excitation) [8]。**SE block考量特徵channel間的相關性進行評估,把重要的特徵進行強化來提升準確率。**不論是概念上或是架構上都有很強的attention的意味,是近年很常被使用的技巧。

ResNet加上SE block (資料來源)

EfficientNet的 building block設計延續 MobileNet V3,但是使用了MnasNet [8]的 NAS方法,同時將運算資源的估測從latency改成FLOPs,即對於某個網路m、目標運算量T,使用一個hyperparameterw控制accuracy與FLOPs的trade-of,最佳化Accuracy(m)*[FLOPs(m)/T]^w。

整體上來說,EfficientNet V1可以說是目前 (2021年) 在CPU上最強的 mobile網路架構之一。

EfficientNet-B0的架構 (資料來源)

FLOPs不等於 Latency

在不同的部屬環境 (硬體設備) 下,其實低 FLOPs或 MAdds並不一定等價於低 latency。而這原因來自於運算設計是否能夠達到硬體的計算巔峰,舉個例子來說, depth-wise convolution雖然運算量低,但是需要頻繁的訪問內存,在 GPU這類可以支援大量向量計算的硬體上其實達不到計算的巔峰。

更精準地解釋,**硬體差異在於計算能力 (每秒鐘所能完成的浮點運算量) 與內存頻寬 (每秒所能完成的內存交換量) **。不同類神經網路架構對這兩種能力有不同的需求量,而最理想的情況就是在部屬的硬體上找到這兩種資源的甜蜜點。

通常 roof-line model可以很好地描述這個現象,簡單地說明,由計算平台的計算能力和內存頻寬上限這兩個參數會產生一個 roof-line。計算能力決定屋頂的高度 (綠色線段),而內存頻寬決定屋簷的斜率 (紅色線段)。

Roof-line model清楚地描述 memory bound與 compute bound (資料來源)

以 MobileNet系列來說,大量使用 depth-wise separable convolution讓模型所需的計算能力不高,因此適合內存存取快的硬體,比如說 CPU。然而這就讓他在 GPU或 TPU這類硬體上運行達不到硬體計算能力的頂峰,也因此即使 FLOPs數很低,整體運算效率還是不好。

同理, EfficientNet在 GPU類硬體也不算很有效率。

整體上低 FLOPs但在 GPU高 latency的網路架構缺點以部屬硬體不同可以分成在 GPU類硬體上與 CPU類硬體上兩個部分。

  • 部屬於 GPU類硬體:在向量加速元件的硬體上運行效率不好,因此大多數在 GPU、 TPU或 DSP上運行的網路其實不適合直接採用這些低 FLOPs但實際 latency高的架構
  • 部屬於 CPU類硬體:即使在 CPU類硬體運行效率很好,但是網路的訓練通常還是在 GPU或 TPU上,導致訓練的時程拉得更久

EfficientNet V2 (EffNetV2)

即使 EfficientNet並不適合在 GPU類硬體上運行,許多研究還是大幅採用了 EfficientNet,因為 EfficientNet的 performance真的很不錯 (或許是真的來自有效率的參數配置或是僅僅是方便與 SOTA的比較)。因此,提升 EfficientNet在 GPU上的效率是很直覺的題目。

而 EfficientNet V2就是改善了在 GPU的運行效率。

依照原論文的說法,EfficientNet V2對比其他主流的 SOTA模型不只準度更好,模型大小更小、訓練速度也更快。

整體上 EfficientNet V2 的重點如下:

  1. 加入非 depth-wise separable convolution,並且使用 training-aware NAS找出適合 GPU類硬體的新網路架構家族。
  2. 在訓練時使用逐步加大的 image resolution,加快模型的訓練速度。同時在 regularization上也是逐步加強,減少可能因為解析度不對等造成的表現下滑。
  3. 修改 EfficientNet V1中各 stage等價的 compound scaling,使用 non-uniformed scaling讓模型在 scale up時效果更好

EfficientNet V2指出depth-wise convolution會降低 GPU的使用效率,特別是在網路的前期。論文沒有明確指出原因,個人推論應該是因為視覺類網路在前幾個 stage解析度大,導致需要頻繁的訪問內存而產生的 memory bound。

這其實是從 2019年就開始慢慢有的聲音,包含EfficientNet EdgeTPU [10]與MobileDets [11]等方法都大量使用了結合一般 convolution的 building block。具體上,** EfficientNet V2 是將完全沒有 depth-wise convolution的 Fused-MBConv加入 NAS的 search space中。**

原本使用 SE的 MBConv與新加入的 Fused-MVConv (資料來源)

** 關於 MobileDets在 GPU上的論點可以參考 [補充 2]*

其實 EfficientNet V2的 NAS 因為大多數都直接沿用 V1的結果,實際的 search space很小。最大的差異還是在於 Fused-MBConv的加入與reward function從精準度與 FLOPs改為精準度,標準化的訓練時間與模型參數量。

最終找出來的 EfficientNetV2 基本架構如下。

EfficientNet V2架構 (資料來源)

而 scaling整體上還是依靠 V1的 compound scaling,但為了保證運行速度,解析度設定了 480的上限;而在增加深度時,會額外加重於增加最後兩個 stage (5, 6) 的 layer數,而非如 V1那樣完全公平的增加。

** 關於 EfficientNet V1的 compound scaling 細節以參考 [補充 3]*

由於大解析度的輸入會直接導致訓練時間平方倍成長,許多論文 (如FixRes [12]) 試圖以小的解析度訓練,再用大的解析度 inference,以獲得較短的訓練時間。然而這樣的方法多半都還是會帶來準度的下降, EfficientNet V2作者認為這是因為大解析度的圖片更容易 overfitting,因此需要搭配強度更高的 regularization

EfficientNet V2的方法很簡單粗暴,把所有 training step切成M個階段,預先設定好起始與結束的解析度與regularization強度,從起始設定開始,在每個階段逐步加大解析度與 regularization強度,最終達到目標的結束解析度與強度。論文中使用的 regularization為標準的Dropout [13]、RandAugment [14]與Mixup [15]。

訓練越後期逐步加大解析度,也加強 regularization。(資料來源)

由於近期Vision Transformer (ViT) [16]相當熱門,論文也有提到這樣改變解析度的方法並不能直接套用在 ViT上,因為 ViT需要依靠 position embedding來理解圖像中 pixel的位置與關聯,而這個 embedding與解析度高度相關。

論文通篇著重強調 EfficientNet V2相比其他 SOTA方法,在較小的模型與較快的訓練速度的情況下,仍然擁有較好的表現。這個觀點在 GPU上的主流 SOTA模型 (NFNet [17]與 ViT) 確實如此,然而細看下方 FLOPs數據圖的左側,EfficientNet V2並沒有可以與 V1對比的數據

Model size, FLOPs, and inference latency. (資料來源)

即使論文在後面補上了與 V2與 V1在 ImageNet的 Top-1 Acc.、參數量與在 GPU上的 throughput的比較,在 CPU上的比較始終隻字未提。實際上結果可想而知,FLOPs數高的 V2在 CPU上是鐵定打不贏 V1的

EfficientNet V1與 V2在 GPU上的比拚 (資料來源)

總體來說,在 GPU類的硬體上 EfficientNet V2或許確實是至今最強的模型,然而在 CPU上他並不是最強的,因此在沒有 GPU、 TPU或 DSP的 mobile device上。 MobileNet 或 EfficientNet V1這類低 FLOPs數的模型還是比較佔有優勢的。

EfficientNet V2很強,但並不完全是 V1的升級版。

從另外一個層面來看,EfficientNet V2將 V1的 NAS與參數高效率帶到了 GPU上,並且證明了足以刷新 SOTA的水準。

EfficientNet V2仍將是網路架構的一個新標竿。

至於有些人可能會覺得像是 Fused-MBConv這樣的 building block 即使有 MobileNet的三個重點 (depth-wise convolution、 inverted bottleneck、 SE) 的其中兩個,硬是掛上 MobileNet的 MB很弔詭。但其實隨著硬體的變化, Mobile並不應再單指 CPU本身,而是能再 mobile device上有效運行的網路。

反而個人覺得更值得討論的是:**如果 Fused-MBConv這樣使用一般convolution的 inverted bottleneck架構如此有效,那是否代表著 ResNet的 residual bottleneck反而不是 efficient parameterized model的好範例?**但這或許就要再等待幾個月到一兩年才會有答案了。

Take-Away

  1. EfficientNet V2並不完全是 V1的升級版,因為 V2並不適合在 CPU上運作。
  2. EfficientNet V2承接 MobileDets的方向,在網路的前期移除 depth-wise convolution以在 GPU上達到最好的 roof-line trade-off
  3. 訓練 CNN可以從小解析度往上慢慢加高解析度,並搭配逐步增強的 regularization,可以在不掉精度的情況加速訓練。

好了~這篇文章就先到這邊。老話一句,Deep Learning領域每年都會有大量高質量的論文產出,說真的要跟緊不是一件容易的事。所以我的觀點可能也會存在瑕疵,若有發現什麼錯誤或值得討論的地方,歡迎回覆文章或來信一起討論 :)

Supplementary

最簡單也是最常見計算FLOPs的方法是:

  • 計算乘法與加法的數量總和。
  • 忽略batch normalization與activation function的運算量。

假設今天要計算一個標準的convolution layer的FLOPs數,convolution kernel大小為K,strides為1,輸入的解析度(H_1, W_1)、channel (filter) 數C_1,輸出的解析度(H_2, W_2)、channel數C_2,基本的convolution的運算量就是每個輸出channel的運算量(C_1kk)乘以輸出channel數乘(C_2)以輸出解析度(H_2W_2)。若有考慮bias,再加上bias的運算量(H_2W_2*C_2)。

一般convolution與depthwise separable convolution的 FLOPs計算 (圖片來源)

其實在今年年初,EfficientNet作者就自己提出了想要將 EfficientNet的精神繼續延伸到不同硬體上的想法。在這篇論文中作者自己指出了 MobileNet或 EfficientNet 在GPU、 TPU或 DSP上效率不好,搭要搭配一般的 convolution效率才會好。

整體上論文在GPU上的結論大致如下:

  1. FLOPs低不等於latency低,尤其是在有加速功能的硬體 (GPU、DSP與TPU)上不成立。
  2. MobileNet block (depthwise separable convolution)在有加速功能的硬體上比較沒有效率。
  3. 低channel數的情況下 (如網路的前幾層),在有加速功能的硬體使用一般convolution通常會比separable convolution有效率。
  4. 在大多數的硬體上,channel數為8的倍數比較有利計算

基於單一強化的實驗,EfficientNet的作者認為應該要一起考慮強化深度、寬度與解析度三項。然而,在一定的運算量設定下,如何決定調整這三項之間的調整比例則是一個開放的問題。

考量到同樣提高深度、寬度與解析度兩倍增加的運算量其實不同 (增加深度兩倍,會增加運算量兩倍;增加寬度或解析度兩倍,則會增加運算量四倍)。論文提出的compound scaling是考量運算量增加的比例,以規劃 (programming) 定義最佳化問題,再使用一個小的grid search近似最佳解。

搜尋compound scaling參數的設計 (資料來源)

Reference

  1. EfficientNetV2: Smaller Models and Faster Training[arXiv 2021]
  2. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications.[arXiv 2017]
  3. MobileNetV2: Inverted Residuals and Linear Bottlenecks[CVPR 2018]
  4. Searching for MobileNetV3[ICCV 2019]
  5. ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices[CVPR 2018]
  6. ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design[ECCV 2018]
  7. EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks[ICML 2019]
  8. Squeeze-and-Excitation Networks[CVPR 2018]
  9. MnasNet: Platform-aware neural architecture search for mobile[CVPR 2019]
  10. EfficientNet-EdgeTPU: Creating Accelerator-Optimized Neural Networks with AutoML[Google AI Blog 2019]
  11. MobileDets: Searching for Object Detection Architectures for Mobile Accelerators[arXiv 2020]
  12. Fixing the train-test resolution discrepancy[NeurIPS 2019]
  13. Dropout: A Simple Way to Prevent Neural Networks from Overfitting[JMLR 2014]
  14. RandAugment: Practical automated data augmentation with a reduced search space[CVPRW 2020]
  15. Mixup: Beyond Empirical Risk Minimization[ICLR 2018]
  16. An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale[ICLR 2021]
  17. High-Performance Large-Scale Image Recognition Without Normalization[arXiv 2021]
comments powered by Disqus