본문 바로가기
이론

FLOPs, #param, throughput 계산, 의미, 관계

by davidlds 2024. 3. 19.
반응형

 

딥러닝 모델 논문읙 실험이나 결과 부분에 꼭 나오는 것.

FLOPs, #param, throughput 3가지 이다.

그런데 나는 이걸 계산하지도 못하고 의미도 모르고 관계도 모른다.

이번 포스팅에서 완벽히 정리하고 가자.

 

1. FLOPs

FLOPs는 (Floating Point Operations)의 약자로,

주로 모델의 계산 복잡성을 측정하는 데 사용된다.

딥러닝 모델의 연산 중에 많은 것은 '부동 소수점 연산(FLOP)'이고

이걸 몇번 하는지가 FLOPs다.

 

FLOPs가 높다 = 연산량이 많다, 무겁다

 

FLOPs는 입력에 따라 크기가 변한다.

따라서 단순히 파이썬 라이브러리 등으로 구하면 오류가 날 수 있다.

공식을 알아두고 검산할 필요가 있다.

 

[FLOPs 계산 공식 (CNN)]

FLOPs = H × W × F × F × Cin × Cout

 

[FLOPs 계산 공식 (transformer block)]

FLOPs = Embeddings + N_layer(Attention + Feedforward) + Logits

Embedding = 2N_ct × N_vocab × d_model

Attention = 2N_ct × 3d_model × (d_key × N_head)

Feedforward = 4N_ct × (d_model × d_ff)

Logit = 2N_ct × d_model × N_vocab

(요약하면 N_ct와 d_model에 비례함.)

 

[FLOPs 계산 공식 (FC)]

FLOPs = Nin × Nout

 

 

H, W : 입력 이미지 크기

F : 필터 크기

Cin, Cout : 입력, 출력 채널 수

Nin, Nout : 입력, 출력 뉴런 수

N_layer : 레이어 반복 수

N_ct : 인풋 되는 context/sequence 의 길이

N_vocab : vocabulary의 토큰 수

N_head : 어텐션 헤드 수

d_model : 모델의 dimension

d_key : QKV의 dimension

d_ff : 아웃풋의 첫 linear layer의 dimension

 

 

2. #param

#param은 (number of parameter)의 약자로

모델이 학습하는 동안 조정되는 변수의 개수이다.

weight + bias로 표현할 수 있다.

 

#param이 높다 = 학습하는 weight가 많다

(이게 작다고 꼭 가벼운건 아님. FLOPs가 더 중요.)

(총 연산 동안 같은 파라미터를 10번 사용하면 FLOPs는 커짐.)

 

파라미터 수는 모델의 고유한 특성으로 변하지 않는다.

므슨 말이냐면 입력의 크기가 바뀌더라도 똑같다는 말이다.

따라서 이건 그냥 파이썬 라이브러리에 시켜도 된다.

파이토치의 summary 함수를 사용하면 빠르게 계산할 수 있다.

from torchsummaryX import summary

model = ViT()
summary(model, torch.rand(16,2,224,224))

 

 

3. throughput

throughput은 처리량으로 주어진 시간 동안 모델이 처리할 수 있는 양이다.

throughput = 10(image/s) 이라면 1초에 이미지 10장을 처리하는 것이다.

 

이건 이론적 데이터가 아니라 실험적 데이터다.

특정 조건에서 실제로 돌렸을때 몇개를 처리하는지 측정한다.

 

throughput이 높다 = 실제로 모델이 빠르다

 

 

4. 관계

아주 간단하게 모델을 설계한다면 다음과 같은 비례 관계를 가진다.

 

#param 높음 -> FLOPs 높음 -> throughput 낮음

(파라미터 수가 많으니까, 연산하는 양이 많고, 실제로 돌리면 느리다.)

 

그런데 모델에 다양한 기법을 적용하거나 복잡한 설계 방식을 사용했다면

이 관계가 충분히 무너질 수 있고 그게 모델의 특장점이 될 수 있다.

 

예를 들어 Swin transformer의 결과를 해석해 보자.

 

Swin-B (224) 와 Swin-B (384)는 사실상 같은 모델이므로 #param은 같다.

하지만 시퀸스의 길이가 늘어났기 때문에(224 -> 384) FLOPs가 늘어났다. (15.4G -> 47.0G)

 

ViT-B/16과 Swin-B(384)는 #param이 비슷한 모델이다.

그런데 Swin-B가 #param은 더 큰데, FLOPs가 약간 낮다.

이는 내부적으로 window 간 QKV의 weight를 공유하기 때문이다.

 

그런데 또 Swin-B가 FLOPs가 약간 낮은데, throughput은 약간 낮다.

FLOPs를 줄였다고는 하나 실제로 동작하는데 큰 영향을 주지 못한 것이다.

실제로 돌려보니 ViT-B/16이 더 빨랐다.

 

 

반응형