FLOPs 는 Floating point operations를 줄인 말로, 딥러닝 모델이 얼마나 빠르게 동작하느냐에 대한 지표입니다. 딥러닝 모델의 연산량 계산법입니다.
1초에 얼마나 많은 floating point 연산을 하느냐를 의미하는 것으로 gpu성능에 따라 달라지는 처리 시간이 아닌 절대적인 연산량으로서 딥러닝모델의 성능을 평가할 수 있습니다.
FLOPs에 포함되는 연산 : 더하기 빼기 곱하기 나누기, exponential, log, square root, …. 각각의 operations가 1FLOPs가 됩니다.
예시
두 벡터의 내적
크기가 4인 두 벡터의 내적
두 벡터의 내적
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([1, 2, 3, 4])
y = np.dot(a, b)
print(y)
# 30
Python
복사
곱하기 4번, 더하기 3번이 이루어지므로 7FLOPs네요!
n길이의 벡터였다면 n + (n-1) = 2n-1 FLOPs가 되겠습니다
Fully Connected Layer (FC Layer)
input node가 3개, output node가 4개인 FC Layer라면
import torch
import torch.nn as nn
import numpy as np
linear = nn.Linear(3, 4, bias=False)
x = torch.randn(3)
y = linear(x)
print(x.shape, y.shape) # torch.Size([3]) torch.Size([4])
W = np.random.randn(4, 3)
x = np.random.randn(3)
y = np.dot(W, x)
print(y.shape) # (4,)
Python
복사
결국 3크기의 두 벡터의 내적이 4번 일어나는 것이므로 총 4 x 5 = 20FLOPs네요
input node가 i개, output node를 j개로 일반화하면
i크기 두 벡터의 내적이 j번 발생하므로 FLOPs가 되겠군요!
Convolutional layer
드디어 convolutional layer입니다
(C, H, W)차원의 텐서 인풋이 들어오고 Kernel size는 라고 해봅시다
보통 BigO의 개념으로 라고 하는데 한번 직접 계산해봤습니다 (틀린 부분이 있으면 알려주세요… ui88g216@gmail.com)
input tensor shape:
output tensor shape :
kernel size :
output tensor의 한 채널을 연산하는데에는 일단 첫번째로 길이의 벡터 내적 연산이 만큼 이루어집니다 →
이 연산이 번 이루어지고 개의 채널의 값들이 sum이 이뤄지므로 번의 덧셈이 이루어집니다. →
이 과정이 C_{out}번 이뤄지면 최종 C_{out}채널의 아웃풋이 나오므로
⇒ convolutional layer FLOPs = 이 됩니다.
ReLU
ReLU같은 경우에는 y=max(0, x)의 함수인데, 비교 연산만 수행하므로 입력이 n크기라면 n FLOPs가 될 것이다.
Sigmoid
이러한 식을 갖는 입력을 0~1 사이 값으로 출력하는 함수입니다.
*(-1), exponential, +, / 이렇게 4개의 연산이 속하므로 4n FLOPs입니다.