개발한 딥러닝 모델은 얼마나 빠를까요? 특히, 모바일 같은 저사양 디바이스에서의 딥 뉴럴 네트워크에서는 성능보다는 해당 사양에서 원활히 돌아가는지가 서비스 측면에서 매우 중요합니다. 물론, 성능은 최대한 유지하는 선에서 말이죠. 모바일 같은 엣지 디바이스에서의 딥러닝 모델을 위해서는 무엇을 고려해야 할까요?
- 먼저 모델의 크기일겁니다. (몇 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×j가 되겠죠.
y = matmul(x, W)
여기서 FLOPS는 길이 i의 두 벡터 내적이 j번 일어나므로 (2i−1)×j가 됩니다.
Convolution layer
Convolutoin layer 에서는 인풋과 아웃풋이 벡터가 아닌 H×W×C의 3차원 텐서가 됩니다. 여기서 H,W,C는 각각 높이, 너비, 채널의 수가 됩니다. Convolution 연산을 위한 kernel의 사이즈가 K×K라 했을 때, FLOPS는 일반적인 빅오의 개념으로 K×K×Cin×Cout×Hout×Wout 이 됩니다. (정확히는 더하기로 인해 이 값보다는 큽니다.)
- Hin,Win대신 아웃풋 feature map 사이즈를 사용하는 이유는 인풋으로 계산할 경우 convolution의 stride, dilation, padding을 다 고려해야 하지만 아웃풋 feature map은 이것이 모두 고려되었기 때문입니다.
- Hout×Wout만큼 계산되었고, convolution을 통해 K×K만큼 내적이 수행되었으며,
- Cin에 대해서 Cout만큼 수행해서 값이 도출됩니다.
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 |