CNN parameters、FLOPs、MACs、MAC、CIO 計算

李謦伊
謦伊的閱讀筆記
7 min readJul 8, 2022

在看論文時,經常會看到計算 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 的參數量如下圖所示為兩者的相加。

參數量計算公式
source

舉個例子,假設 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 個加法。

source

接著是 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 的通道數、寬、高。

Reference

--

--