본문 바로가기

Machine Learning Models/Techniques

FLOPS (FLoating point OPerationS) - 플롭스

반응형

개발한 딥러닝 모델은 얼마나 빠를까요? 특히, 모바일 같은 저사양 디바이스에서의 딥 뉴럴 네트워크에서는 성능보다는 해당 사양에서 원활히 돌아가는지가 서비스 측면에서 매우 중요합니다. 물론, 성능은 최대한 유지하는 선에서 말이죠. 모바일 같은 엣지 디바이스에서의 딥러닝 모델을 위해서는 무엇을 고려해야 할까요?

  • 먼저 모델의 크기일겁니다. (몇 MB 인지)
  • 동작 시에 메인 메모리를 얼마나 잡아먹는지도 있겠죠. 메모리를 너무 많이 잡아먹으면 꺼지겠죠.
  • 스트리밍 비디오 등 리얼 타임이 중요한 태스크에 대해서 동작 시간이 얼마나 걸리냐도 있겠습니다.
  • 전력소모도 고려사항이 되어야 할겁니다. 게임 같은 어플리케이션을 켰을 때 배터리가 엄청나게 빨리는 것을 경험해보셨을 겁니다.

그렇다면 딥러닝 모델이 얼마나 가볍고 빠른지 어떠한 metric으로 측정할 수 있을까요? 이번 포스트에서는 딥러닝 모델이 얼마나 빠르게 동작하는지에 관한 연산량 계산법인 FLOPS (FLoating point OPerationS) 를 살펴보겠습니다.

FLOPS

본래 FLOPS는 FLoating point Operation Per Second 의 약자로 단위 시간 (1s)에 얼마나 많은 floating point 연산을 하는지에 관한 지표입니다. 보통 컴퓨터의 성능을 나타내는데 주로 사용되나, 딥러닝에서의 FLOPS 는 단위 시간이 아닌 절대적인 연산량 (곱하기, 더하기 등)의 횟수를 지칭합니다. 따라서 약자도 FLoating point OperationS 가 됩니다.

FLOPS에 포함되는 연산단위는 더하기, 빼기, 곱하기, 나누기, exponential, log, square root 등 다양합니다. 각각의 operation이 1 FLOPS가 되는 것이죠. 간단한 벡터 내적부터, fully connected layer, convolution layer, activation function 등에 대해 FLOPS가 어떻게 되는지 살펴보겠습니다.

내적 (Dot Product)

길이 $n$의 두 벡터 $w, x$의 내적을 생각해봅시다. 결과값 $y$는 스칼라 값이 되겠죠.

y = w[0]*x[0] + w[1]*x[1] + ... + w[n-1]*x[n-1]

여기서 FLOPS는 얼마가 될까요? 우선 곱하기가 $n$번, 더하기가 $n-1$번 하니 총 $2n-1$ FLOPS가 되겠네요.

Fully Connected layer

Fully connected layer에서는 모든 인풋과 모든 아웃풋이 연결되어 있습니다. 인풋 노드의 개수를 $i$, 아웃풋 노드의 개수를 $j$라 하면 인풋과 아웃풋의 관계를 나타내는 weight matrix $W$는 $i\times j$가 되겠죠.

y = matmul(x, W)

여기서 FLOPS는 길이 $i$의 두 벡터 내적이 $j$번 일어나므로 $(2i-1)\times j$가 됩니다. 

Convolution layer

Convolutoin layer 에서는 인풋과 아웃풋이 벡터가 아닌 $H\times W\times C$의 3차원 텐서가 됩니다. 여기서 $H,W,C$는 각각 높이, 너비, 채널의 수가 됩니다. Convolution 연산을 위한 kernel의 사이즈가 $K\times K$라 했을 때, FLOPS는 일반적인 빅오의 개념으로 $K\times K\times C_{in}\times C_{out}\times H_{out}\times W_{out}$ 이 됩니다. (정확히는 더하기로 인해 이 값보다는 큽니다.)

  • $H_{in}, W_{in}$대신 아웃풋 feature map 사이즈를 사용하는 이유는 인풋으로 계산할 경우 convolution의 stride, dilation, padding을 다 고려해야 하지만 아웃풋 feature map은 이것이 모두 고려되었기 때문입니다.
  • $H_{out}\times W_{out}$만큼 계산되었고, convolution을 통해 $K\times K$만큼 내적이 수행되었으며,
  • $C_{in}$에 대해서 $C_{out}$만큼 수행해서 값이 도출됩니다.

Activation function

ReLU는 $y = max(0,x)$으로 음수는 0으로 양수는 값 그대로 내보내는 대표적인 non-linear activation function입니다. 입력 $x$가 $n$의 크기라면 FLOPS는 $n$이 되겠네요. 

Sigmoid는 $y = 1 / (1 + \exp (-x))$로 입력을 0에서 1사이의 값으로 출력하는 함수입니다. 여기서는 나누기, 더하기, -1 곱하기, exponential 연산으로 크기 $n$을 가진 $x$에 대해 $4n$의 FLOPS가 됩니다.

보통 이러한 activation function의 FLOPS는 딥러닝 모델 전체의 FLOPS 계산에 포함되지 않습니다. Fully connected layer나 convolution layer의 FLOPS에 비하면 미치는 영향이 미미하기 때문입니다.

홍머스 정리

  • FLOPS는 딥러닝 모델의 연산량을 (동작 속도) 파악하기 위한 단위!
  • 모바일 딥러닝을 위해서는 FLOPS가 전부가 아니다. 메모리도 고려해야한다.

참조

반응형

'Machine Learning Models > Techniques' 카테고리의 다른 글

Label Smoothing  (0) 2021.06.15
CutMix  (0) 2021.06.10
Mish  (0) 2021.06.06
Learning Deep Features for Discriminative Localization (CAM)  (0) 2021.05.08
Interpretable Explanations of Black Boxes by Meaningful Perturbation  (0) 2021.03.16