본문 바로가기

IT 기술 정보

인공지능 효율화 기법. 계산량이 얼마나 줄어들까?

반응형

이번에는 실제 인공지능 효율화 기법을 적용했을때 수학적으로 계산량이 얼마나 줄어들지를 확인하고 비교해보겠다.

 

Q1.

인풋 이미지의 크기가 W x H이고 채널이 C개인 합성곱 신경망(CNN)이 있다고 하자. 필터는 M개가 있고 크기는 3 x 3이다. 계산의 편의를 위해 padding size와 stride는 1이라고 하겠다. 배치는 3이다. 이 경우 기본 계산량은 어떻게 될까?

 

우선 CNN 합성곱에서 필터 연산 수(MACs)는 출력 피쳐의 크기 x 필터의 크기다. 왜냐하면 출력 피쳐라는 것 자체가 인풋 이미지에 필터를 합성곱하여 나온 결과이기 때문이다.

 

 

위 그림을 보면 3x3의 필터가 5x5의 이미지를 움직이며 피쳐 맵을 만드는 과정을 확인할 수 있다. 너비가 3인 필터는 너비가 5인 이미지를 3번 움직일 수 있다(5-3+1).  결국 3번의 곱셈이 일어나며 너비가 3인 피쳐맵이 생긴다. 여기서 만약 좌우 패딩이 1씩 있다면(총 2) 5번을 움직이고(5+2-3+1) 너비가 5일 것이다. 또 stride가 2라면 움직임 자체가 2배로 커지므로 피쳐맵의 크기는 1/2가 될 것이다. 이런 규칙을 고려하면 아래와 같은 공식이 나온다.

 

피쳐맵의 크기 = (이미지 크기 − 필터의 크기 + 2*패딩) / 스트라이드 + 1

(참고로 피쳐맵이 소수가 될 순 없으므로 스트라이드를 나눴을 때 소수가 나오면 버린다.)

 

테스트로 입력이 6x6, 필터가 3x3, 패딩이 2, 스트라이드가 3인 경우 출력 크기를 계산해보자.

(6 - 3 + 2 * 2 / 3) + 1 = (3 + 4) / 3 + 1 = 7 / 3 + 1 = 3

 

진짜 이렇게 되는지 확인해보자!

 

패딩을 넣은 입력은 아래와 같이 생겼다.

P P P P P P P P P P
P P P P P P P P P P
P P M M M M M M P P
P P M M M M M M P P
P P M M M M M M P P
P P M M M M M M P P
P P M M M M M M P P
P P M M M M M M P P
P P P P P P P P P P
P P P P P P P P P P

 

그리고 3x3의 필터는 스트라이드가 3이므로 아래와 같이 이동한다.

F F F . . . . . . .       . . . F F F . . . .       . . . . . . F F F .
F F F . . . . . . .       . . . F F F . . . .       . . . . . . F F F .
F F F . . . . . . .       . . . F F F . . . .       . . . . . . F F F .
. . . . . . . . . .       . . . . . . . . . .       . . . . . . . . . .
. . . . . . . . . .       . . . . . . . . . .       . . . . . . . . . .
. . . . . . . . . .       . . . . . . . . . .       . . . . . . . . . .
. . . . . . . . . .       . . . . . . . . . .       . . . . . . . . . .
. . . . . . . . . .       . . . . . . . . . .       . . . . . . . . . .
. . . . . . . . . .       . . . . . . . . . .       . . . . . . . . . .
. . . . . . . . . .       . . . . . . . . . .       . . . . . . . . . .

 

즉 CNN에서 MACs(곱+합 연산)이 일어나는 양은 필터의 크기와 출력 피쳐의 크기로 쉽게 계산이 된다. 하지만 이는 결과론적인 것으로, 실제로 출력 피쳐 자체가 입력 크기, 필터, 스타라이드 등에 의해 결정된 것이므로, 실제론 이 모든 것을 고려하여 계산량을 확인해야 한다.

 

그래서 우리의 예제는 이를 단순화 했다. 필터가 3x3, 패딩이 1, 스트라이드가 1인 경우 계산을 해보면

피쳐맵의 크기 = (입력 크기 − 3 + 2) / 1 + 1 = (입력 크기  - 1) + 1 = 입력 크기

즉, 피쳐맵의 크기 = 입력 크기가 된다.

 

즉, 계산량을 복잡하게 표현하지 않고 입력 크기 = 피쳐맵의 크기 W x H를 그대로 쓸 수 있다는 것이다. 즉 앞서 CNN 합성곱의 연산량은 필터의 크기 x 피쳐맵의 크기라고 하였는 여기선 이걸 W x H x 3 x 3 으로 표현해도 된다. 그리고 필터가 M개, 채널이 C개, 배치가 3이라고 했으므로 W x H x C x M x 3 x 3 x 3이 된다.

 

Q2.

여기서 필터를 n%로 프루닝한다면 연산이 얼마나 줄어들까? (프루닝이 무엇인지 모른다면 이 글을 참고하자.)

 

계산은 매우 간단하다. 3 x 3의 필터에서 n%가 지워지게 된다면 연산량은 그만큼 그대로 줄어든다. 물론 이는 하드웨어적인 병렬처리를 고려하면 현재 기술로는 정확한 표현은 아니지만 우선 소프트웨어 레이어에서 인공지능 효율을 연구하는 쪽에선 그렇게 가정을 한다. 그럼 계산량은 아래와 같다.

 

(1 - p/100) x W x H x C x M x 3 x 3 x 3

 

쉽게 말해 30%를 프루닝하면 70%만큼의 연산만으로 가능 하다는 것이다. 

 

Q3.

여기서 필터를 줄여버린다면? 즉 3개에서 2개로 줄인다면? 마찬가지로 계산은 현재 연산량이 2/3이 줄어든다고 볼 수 있다.

 

하지만 여기서의 차이는 Q2보다 줄어드는 효과가 확실하다는 것이다. 이렇게 구성 자체를 바꾸어버리는 것을 "구조적 프루닝(Structured Pruning)"이라고 한다. 반대로 Q2과 같이 텐서 내의 값을 직접적으로 건들이는 것을 "비구조적 프루닝(Unstructured Pruning)"이라고 한다. 구조적 프루닝은 이론적으로는 연산량이 프루닝을 한 비율만큼 줄어드는 것이 맞지만, 실제로 GPU의 병렬 연산이나, CPU의 캐싱 등 하드웨어의 동작을 고려하면 실제로는 그만한 효과가 나지 않는다. 하지만 구조적인 프루닝은 CPU, GPU 등 하드웨어 구조에 무관하게 효율화가 확실히 일어난다.

 

Q4.

프루닝을 하는 것, 필터를 하나 줄이는 것, 채널을 하나 줄이는 것, 층을 하나 줄이는 것. 어떤 것이 효과가 클까?

 

여기에 대한 답은 없다. 이것이 모두가 고민하고 있는 부분이다. 우리가 CNN이라고 하면 이는 포괄적인 모델의 분류를 나타내는 것으로 실제로는 LeNet, ResNet, MobileNet, DenseNet, SqueezeNet 등 엄청나게 다양한 종류가 있다. 이들 모두 깊이를 깊고 좁게 하거나(층을 늘리고 필터는 작게) 반대로 층을 낮고 넓게 하는 등 다양한 시도를 하며 중간 중간 간단한 트릭을 추가한 것들이다. 이 중 어떤 것들은 성능을 조금이라도 늘리기 위해 많은 계산량을 감내했고, 어떤 것들은 계산량을 대폭 낮추면서도 성능을 어느정도 유지한 것에 초점을 두었다. 

 

대표적인 CNN 모델들은 이 글에서 정리를 하였으니 참고를 해보자.

 

Q5.

실제 동작하는 CNN의 연산량(MACs)를 계산 LeNet-5의 계산량을 계산해보자면 대략 아래와 같다.

LeNet-5은 32×32 크기의 흑백 이미지를 입력으로 받아, 2개의 합성곱 계층(Conv)과 2개의 평균 풀링 계층(AvgPool), 그리고 3개의 완전연결 계층(FC)으로 구성되어 있다. 여기서 평균 풀링은 계산량이 거의 없으므로 생략한다.


1. Conv1

입력 채널 수 Cin = 1
출력 채널 수 Cout = 6
커널 크기 = 5×5
출력 feature map 크기 = 28×28 (패딩 없음, stride=1)
MACs = Cin × Cout × 커널크기 × 출력높이 × 출력너비
      = 1 × 6 × 5×5 × 28×28
      = 1 × 6 × 25 × 784
      = 117,600

2. Conv2

입력 채널 수 Cin = 6
출력 채널 수 Cout = 16
커널 크기 = 5×5
출력 크기 = 10×10 (14 - 5 + 1)
MACs = 6 × 16 × 5×5 × 10×10
      = 6 × 16 × 25 × 100
      = 240,000

 

3. FC1

입력 노드 수 = 16×5×5 = 400
출력 노드 수 = 120
MACs = 400 × 120 = 48,000

 

4. FC2

입력 노드 수 = 120
출력 노드 수 = 84
MACs = 120 × 84 = 10,080

 

5. FC3 (출력층)

입력 노드 수 = 84
출력 노드 수 = 10
MACs = 84 × 10 = 840

 

총합

Conv1: 117,600 + Conv2: 240,000 + FC1: 48,000 + FC2: 10,080 + FC3: 840
합계 ≈ 416,520 MACs (약 0.42M)
즉 LeNet-5의 총 MAC 연산량은 약 4.2×10⁵이며, 그중 약 85%가 합성곱 층에서 발생한다. 내가 합성곱 계산을 위주로 설명한 이유이다.

 

결론

이 글에서 말하고자 하는 것들은 CNN 뿐만 아니라 다양한 모델들을 계산할 때 이런 계산량과 효율을 고려하여 개발한다는 것이다. 이런 계산량 계산 과정에서 발생하는 비효율을 해결하고 그런 과정에서 또 혁신이 발생하기도 한다. 특히 우리 같이 빵빵한 IDC를 가지고 있지 않은 연구자, 중소기업 등에선 모델의 연산량까지 주의깊게 봐가며 모델을 개발하거나 선정하여야 한다. 

모델의 연산량을 숫자로 기억하거나 모두 계산해야 할 필요는 없지만, 어떤 모델에서 어떤 구성의 변화가 있었을 때 연산량이 얼마나 줄어들거나 늘어나는지에 대해선 감각을 가져두면 큰 도움이 될 것 같다.

반응형