HW Engineer 가 이야기하는 AI/01 설계에 필요한 AI 지식

Grouped Convolution, Dilated Convolution

반응형

Intro

CNN 을 실제 HW 로 구현하려면 엄청난 MAC 량을 마주할 수 밖에 없습니다. 이는 빠른 detection 이 가능하다고 했던 YOLO 에서도 마찬가지 입니다. 하여 현업에서 네트워크를 학습 및 구현하려고 할때, Convolution 그대로를 사용하지는 않습니다. 여러 테크닉이 있었고 그 중 하나인 depth-wise, point-wise convoltuion 에 대해 알아보았었죠.

aifpga.tistory.com/12

 

[MobileNet v1] depthwise separable convolution (DW, PW)

Intro CNN 에서의 연산량을 줄이기 위에서, Depthwise / Pointwise 를 이용한 Convoultion 기법이 나왔습니다. 바로, Depthwise Separable Convolution - A FASTER CONVOLUTION! 입니다 :) mobile net v1에서 사용..

aifpga.tistory.com

 

여담으로 위 기법은 Mobile Net v1 의 내용이었는데, 현재 이글을 쓰는 시점은 v3 까지 나왔다고 합니다.

이미 이전자료에서, point-wise 와 depth-wise 는 충분히 이해가 되었기 때문에 다음 중 3,4 번에 대해 정리하려고 합니다.

1. Point-wise Convolution

2. Depth-wise (Separable) Convolution

3. Grouped Convolution

4. Dilated Convolution

 

 

Grouped Convolution

Convolution 의 연산을 하기 위해서는,

  • Input Feature : W * H
  • Kernel : kx * ky
  • Channel : #InC (number of input channel) * #otC (number of output channel)

일때, 하나의 layer 의 연산이 완료 시키기 위해서 W * H * Kx * Ky * #inC * #otC 만큼의 MAC 연산이 필요합니다.

Grouped convolution 을 이해하기 위해서, CNN 의 Input Feature, Kernel 을 배제해 보겠습니다. (grouped convolution 에서는 공통 인자) 그렇게 되면 알고있는 Fully Convoltuion Layer 의 그림을 가지게 됩니다. 다음 그림의 Figure (a) 처럼 되죠.

https://www.groundai.com/project/fully-learnable-group-convolution-for-acceleration-of-deep-neural-networks/

(b) 를 보시면, grouped convolution 은 channel 간의 dependency 를 끊어서 연산하는 것입니다. 이렇게 하면 MAC 량이 줄게 됩니다. 위 숫자대로 #inC : 9 , #otC : 6 이라고 가정해보겠습니다.

(a) : 9 * 6 = 54 의 연산이 필요합니다.

(b) : 3*2 + 3*2 + 3*2 = 18 의 연산이 필요합니다.

즉, 1/3 의 MAC 을 줄일 수 있습니다.

grouped convolution 을 논할 때 빠지지 않는 개념이 바로 ShuffleNet 입니다. (c) 이는 grouped convolution 을 적층 시 발생하는 문제 (Channel 에서의 Narrow Receptive Field) 를 해결하기 위함입니다.

다음 그림처럼 grouped conv laye 의 중간에 channel shuffle 을 넣어서, 문제를 해결합니다. 이는 HW 적인 Cost 가 거의 없습니다. Mux 도 아닌 Wiring 이 되기 때문입니다. (Dedicated HW 설계 시)

https://syncedreview.com/2017/08/23/shufflenet-an-extremely-efficient-convolutional-neural-network-for-mobile-devices/

 

(c) 에서의 shuffle 은 Hyperparameter 입니다. 즉, 사람이 개입해야합니다.

이를 해결하기 위해서 (d) FLGC fully learnable group convolution module 이 제안 됩니다.

Tranining 을 통해서 shuffle 이 결정된다 라고만 이해하고 있습니다. 방법이 궁금하시다면 다음 링크를 참고해보세요 :)

https://www.groundai.com/project/fully-learnable-group-convolution-for-acceleration-of-deep-neural-networks/

 

Dilated Convolution

 

Dialted Convolution 의 컨셉은 심플합니다. MAC 은 작은 Kernel size 로 깔고 (placed) 싶은데, Receptive Field 를 크게 가져고 싶은 Case 에서 사용합니다.

녹색은 3x3 Kernel 입니다. 일반적인 convolution 이라면, 3x3 kernel 의 input activation 은 3x3 의 position 이 1:1 로 Matching 되는 3x3 이 입력이 될 것 입니다. (글이 어렵네요;)

다음 그림의 Dialted Convolution 은 input activation 이 3x3 이 아닌, 5x5 에서, 3x3을 sampling 으로 추출하여 사용하고 있습니다. 이는 Receptive Filed 를 tricky 하게 확장시킬 수 있습니다.

https://mlblr.com/includes/mlai/index.html

 

Receptive Filed 가 커질 수록 Object Detection 시, Detecting 하는 Region 을 확장 시킬 수 있습니다.

MAC 을 늘리지 않고 RF 를 늘리는 기법이 되겠습니다. (이제 글이 쉬워졌네요.)

Dilated Convolution 은 사실 HW 로 적용하기에는 제약사항이 있습니다.

External Memory 를 이용하는 System 이라면 Dilated Convolution 의 risk 가 크게 없습니다.

하지만 만약에 External Memory 가 없는 System (ex : Sensor, ISP etc.. ?) 이라면, 이는 Linebuffer 를 필요 이상으로 늘리게 되죠. (3x3 kernel 에서 5x5 를 loading 해야 하기 때문) 물론 MAC 은 여기서도 줄어드는 것은 맞습니다.

개인적인 경험? 으로는 Linebuffer 가 MAC 보다 더 Bulk 한 System 을 만들게 되는 경향이 있었습니다.

좋은 approach 이지만 상황하게 맞게 잘 사용해야 겠습니다.

 

마무리

Grouped Convolution, Dilated Convolution 에 대해 Study 하였습니다.

HW 를 구현하는 입장에서는 이런 테크닉은 언제든지 환영입니다. (MAC 을 줄이면서 Accuracy 를 조금? 낮추는)

전세계 여러기업에서 NPU 를 만들기 위해서 노력 중인 것으로 압니다. 그래서, 이런 테크닉이 업데이트 될 수 록 NPU 를 만드는 회사 입장에서는 골치가 아프겠다.. 라는 생각을 합니다. 예전에는 Kernel size 를 키워서 네트워크를 구성했다면, 최근에는 작은 Kernel size + deep layer 가 대세입니다. 이런 환경 또한 NPU 를 만드는 분들이 힘들겠죠. (Variable Kernel size 를 제공하려면..?) 개인적으로 NPU 를 만들 수 있는 실력이 안되어.. 사용하는 유저로 남고 싶습니다. (대기업 분들 힘내세요.)

삼천포로 빠졌는데, 개인적으로는 Dedicated HW in FPGA 솔루션도 현실성 있지 않나... 생각을 하면서.. 마무리를 하겠습니다.

반응형