在看論文時,經常會看到計算 CNN 的 parameters、 FLOPs、MACs、MAC、CIO 等指標,來評估神經網路在推理運算上的速度與效能。本文將要來一一介紹這些指標以及計算公式,在看本文前建議先了解 卷積神經網絡 Convolutional Neural Network (CNN)。
Parameters
Parameters 為模型中所有需要學習的參數量,包括卷積層、全連接層或其他網路架構等,同時也會反映出模型占用的記憶體大小,當參數量越大,所需的記憶體就越多。
CNN 的參數由卷積核權重與 bias 組成,令 input feature map 的維度為 H_in × W_in × C_in、kernel size 為 K_h × K_w,且總共有 C_out 個 kernel、output feature map 的維度為 H_out × W_out × C_out。
卷積核的參數量是 K_h × K_w × C_in × C_out,而 bias 的參數量是 C_out,因此 CNN 的參數量如下圖所示為兩者的相加。
舉個例子,假設 input feature map 的維度為 5 × 5 × 3、kernel 數量為 7 個且 kernel size 為 3 × 3、output feature map 的維度為 3 × 3 × 7,這樣一層的計算量為 3 × 3 × 3 × 7 + 7 = 196。
Parameters 可以使用 pytorch library torchinfo
來進行計算
# 安裝 torchinfo
$ pip install torchinfo# ================================
from torchinfo import summary
import torch
import torch.nn as nn# 自定義模型
class MyModel(nn.Module):
def __init__(self, in_channels, out_channels):
super(MyModel, self).__init__()
self.layer = nn.Conv2d(in_channels, out_channels, (3, 3))
def forward(self, x):
x = self.layer(x)model = MyModel(3, 7)
batch_size = 16
summary(model, input_size=(batch_size, 3, 5, 5))
FLOPs
FLOPs 全名為 floating point operations (浮點數的運算數),指模型前向傳播的計算量、計算速度,用於衡量模型的複雜度。進行前向傳播的過程,在卷積層、池化層、Batch Norm、active function、Upsample、Downsample 等都會產生計算量,尤其是在卷積層上佔比最高。這些計算量對於模型的部署有很大的影響。
❗ 值得注意的是 FLOPs 與 FLOPS (floating point operations per second) 不同,全大寫的 FLOPS 是指每秒浮點數的運算次數,用於衡量硬體性能。
FLOPs 的計算分為卷積核權重與 bias 兩部分(Wx+b),令 input feature map 的維度為 H_in × W_in × C_in、kernel size 為 K_h × K_w,且總共有 C_out 個 kernel、output feature map 的維度為 H_out × W_out × C_out。
首先計算 kernel 的計算量,在進行一次卷積運算時,會需要 (K_h × K_w × C_in)次乘法+(K_h × K_w × C_in -1)次加法。
舉個例子,若 input feature map 的維度為 5 × 5 × 1、kernel 數量為 1 個且 kernel size 為 3 × 3、output feature map 的維度為 3 × 3 × 1。如下圖所示,總共會有 3 × 3 × 1 = 9 個乘法、3 × 3 × 1 -1 = 8 個加法。
接著是 bias 的計算量,bias 只有加法的計算,在進行一次卷積運算時,若有bias 則加1。因此考慮有 bias 後的計算量為 (K_h × K_w × C_in)次乘法+(K_h × K_w × C_in -1 +1)次加法 = 2 × K_h × K_w × C_in。
輸出 feature map 的總計算量就會是 2 × K_h × K_w × C_in × H_out × W_out × C_out。
有時論文會使用別的單位,以下為單位的換算公式
MACs
MACs 全名為 multiply–accumulate operations,也可稱為 MADD,指一次乘加計算的運算數,與 FLOPs 一樣是模型計算量的指標,差別在於計算方式不同。
由於一個 MACs 包含一個乘法和一個加法操作,因此 MACs 和 FLOPs 之間為兩倍的關係。
Pytorch MACs / FLOPs
MAC
另一個和 MACs 縮寫很像的指標為 MAC (memory access cost),指記憶體使用量,儲存網路各層的 feature map、權重。
在 ShuffleNetV2 論文中有提到模型的推理運算速度不僅僅與 FLOPs 有關,MAC 也是影響速度的因素之一。在訓練或推理運算時,需要從記憶體讀取 input feature map 以及權重後進行計算,再將 output feature map 寫入記憶體中。因此 MAC 的計算為 input feature map、 output feature map、權重參數量的加總。
CIO
CIO 全名為 Convolutional Input/Output,是從 HarDNet: A Low Memory Traffic Network 論文中所提出的一個指標,該值近似於 DRAM IO 流量,藉由設計較低的 CIO 能降低功耗、提高推理運算的速度。
DRAM 用於讀取模型參數及 feature map,當模型參數過多或者是 feature map 太大 (如 Segmentation task),會導致 DRAM 存取過度而降低計算效率。並且 DRAM bandwidth 在不同的硬體架構上也會有各自的限制,因此需要控制 DRAM IO 流量在一定範圍內。
CIO 的計算為每個卷積層的輸入及輸出尺寸的加總,其中 l 指第 l 層 layer、c, w, h 分別指 feature map 的通道數、寬、高。