ICML 2022 에서 발표된 논문들을 살펴보다가 또 그나마 익숙한 경량화 관련된 논문은 한편 정리하였다.
하지만, 이전 논문뿐만 아니라 기존 경량화 논문들이랑은 조금 다른 관점으로 연구가 진행되었고, 실용적인? 측면에서 의미가 있어보이는 논문이라 읽어 봤다.
Introduction
딥러닝 모델의 성능이 향상될 수록 이를 활용하고자하는 어플리케이션의 범위도 넓어지고, 결국 실시간 추론이 가능한 모델에 대한 관심이 커지면서 효율적인 모델 설계 및 경량화에 대한 연구도 많이 진행되었다. 경량화에 대한 대부분의 연구들은 기본적으로 모델에서 이루어지는 연산량을 줄이는데 초점을 맞추고 있다(성능은 당연히 최대한 유지).
이 논문에서는 기존 연구들은 inference가 실제 H/W에서 구동됐을 때의 영향?을 고려하지 않았다고 얘기하고 있다.
Motivation
MobileNet V2, EfficientNet과 같은 모델들은 상대적으로 가벼운 모델에 대한 요구로 탄생된 모델이다.
기존의 Conv layer 구조를 Depthwise, Pointwise Conv의 조합으로 분해하여 연산량(FLOPs)를 줄이면서도, 성능을 유지하였다. 하지만 실제로 하드웨어에서 구현해보면 기대만큼(연산량의 감소만큼) inference 속도가 빨라지지는 않는다.
이유인즉슨 inference 속도는 연산량(FLOPs)과 Memory Access Cost(MAC)의 영향을 받는다.
H/W에서 inference가 진행 될 때는 연산량 이외에도 MAC의 비중이 큰 데 기존의 연구들은 연산량 측면에서만 접근하고 있다(연산량자체가 이론적으로 다루기 좋은 주제라서 그런것 같기도?). 실제로 대부분의 논문들이 경량화의 근거로 제시하는게 연산량 및 # of parameter의 감소이다.
논문에서는 기존 연구 결과를 바탕으로 Conv layer를 Depthwise, Pointwise Conv들로 구성된 블럭으로 대체하는 것은 메모리 효율이나 속도가 떨어진다고 한다. 아래는 각 네트워크의 블락(Depthwise, Pointwise Convs)들을 같은 연산량을 가지는 Dense Conv. layer로 치환했을 때, fps를 나타낸 표이다.
H/W 측면에서는 같은 연산량을 가진 모델이면 layer의 개수가 적을 수록 메모리에 엑세스하는 횟수가 줄어서 더 효율이 좋다는 걸 알 수 있다. 실제로, 박사과정 중 수행했던 과제에서 Tensor Decomposition 활용해서 연산량을 매우 줄였는데 fps는 생각보다 큰 향상이 없었는데 이런 이유 때문이었던 거 같다.
정리하면 아래와 같다.
1) Shallow networks 가 H/W 효율이 좋다
: H/W에서 연산이 이루어지는 과정을 명확히는 알지는 못하지만 아마도 메모리에 데이터를 끌어온 뒤에 본격적인 계산이 이뤄지는 것 같다(당연한가?). MAC는 아마 데이터를 메모리 끌어오는 과정에서 소요되는 시간과 연관이 깊은 것 같다. GPU의 발전으로 한번에 계산할 수 있는 양은 증가하고 있지만, 한번에 끌어올 수 있는 메모리는 정해져 있나..? 이것도 증가한 거 아닌가(이 부분은 어렴풋한 느낌으로 무슨 말인지 알겠다 정도이지 완벽히 이해는 못한 것 같다. 컴퓨터 구조라도 열심히 들을걸). 쨋든, 요지는 적은 연산량이라도 layer의 개수가 느는 것 자체가 시간적인 측면에선 손해다! 인 듯
2) DNN의 linear operation은 합쳐질 수 있다
같은 연산량에서 layer가 적을수록 H/W 효율이 좋다면 이 논문에서 목표로 하는 실제 환경에서 빠른 inference가 가능하도록 하기 위해서는 layer의 숫자를 최대한으로 줄이는 게 좋다.
i딥러닝에서 이루어지는 연산은 대부분 linear operation 이다. linear의 linear는 또 다른 linear로 표현 가능하다. 만약 모델에서 이루어지는 모든 연산이 linear operation이면 layer 들을 integration 할 수 있다. 하지만 actiavation function을 통해 non-linear한 특성을 가지도록 해주고 있다. activation function만 제거할 수 있다 연속된 layer를 merge 할 수 있다.
문제는 activation의 역할이 굉장히 중요하다는 거?
3) avtivation function의 역할
activation function은 network가 non-linear한 특성을 가지도록하여 좋은 성능을 가지도록 한다. 기존의 경량화에 대한 연구(Ex. pruning)의 컨셉은 network에 존재하는 layer들은 학습이 더 잘되도록 돕지만, 결과적으로 불필요한 파라미터들도 포함하게 되기때문에, 결과에 영향 없이 특정 layer들을 제거할 수 있다는 것이다. activation function도 하나의 layer 중 하나로 non-linear 특성을 부과하여 학습을 도와주지만 모든 activation function이 추론 시에 필요하지 않다면 제거할 수 있다.
그래서, 불필요한 activation function을 찾아 제거하고 연속된 layer를 merge 할 수있다면 보다 높은 inference 속도를 얻을 수 있고 그 걸 해보겠다!는게 이 논문의 목적
Methodology
1) 불필요한 activation function 찾기
당연하게도 적절하게 activation function의 중요성을 평가하는 것이 이 논문에서 가장 중요한 부분 중 하나이다.
중요성을 제대로 평가해야 성능 저하를 최소로 할 수 있기 때문에도 중요하다.
논문에서는 각 activation function의 중요도를 m 이란 파라미터로 측정한다. activation function의 중요도가 학습되게 하기 위하여 아래와 같은 수식을 설계하였다.
수식 자체는 그렇게 복잡하지 않다. m이 1에 가까울 수록, 원래의 activation function 그대로 적용되게 되고 0에 가까울수록 직전 layer의 아웃풋에 L번째 레이어에서 이루어지는 연산들(T)만 적용됩니다. activation function의 중요도는 미리 학습된 네트워크에 대해서 일정 에포크(epoch)를 돌려서 (논문의 경우 20) 측정합니다.
2) Fine-tuning
activation function의 중요도가 측정되면 중요도가 작은 순으로 k개의 레이어를 삭제한다. 이후 값을 보정해주기 위하여 fine-tuning을 진행한다. activation function 자체는 연산량적인 측면에서 보았을 때, inference 속도에 미치는 영향이 미미하지만 non-linear 한 특성을 부과하여 표현력?을 올려줘 성능 보전에 도움을 주므로 새로운 activation function을 추가한다. 추가적으로, Fine-tuning 과정에서 원본 모델을 활용하여 self-distillation을 진행하면 정확도를 더 끌어올리는 것도 가능하다.
3) 인접 레이어 병합
actiavation function이 제거된 후에는 모든 연산이 linear operation이기 때문에 새로운 수식으로 동일하게 표현 가능하다. 자세한 수식은 논문에 있으나, 어찌 보면 당연해서 생략하였다.
(Expand-the-Shrink) 논문에서는 이를 역으로 이용하여, 일반적인 컨볼루션을 Depthwise와 Pointwise conv 조합으로 쪼개고 학습 후 다시 합쳐서 학습 효율을 올릴 수도 있다고 얘기한다. 일종의 Idea 인 듯!
Experiments
Tesla V100 / RTX 2080i / TX2 기반으로 실험을 진행하였다(ImageNet).
결과만 놓고 보면 정확도의 손실이 거의 없는 상태에서도 최소 1.5배 이상 inference 속도가 향상되었다..
약 2-3 퍼센트의 정확도 손실 범위 안에서 2.5배 까지도 inference 속도가 향상되었다. self-distillation을 활용하면 정확도 손실을 1퍼센트 안쪽으로 줄일 수 있다. 추가적으로, 논문에서 제안한 방법을 학습 기법으로 응용하여도 기존 네트워크 대비 약 1퍼센트 이상의 성능이 향상되었다. 기타 실험 결과들을 보면 초반 쪽에 존재하는 layer의 경우 input 사이즈가 커서 연산량은 많지만 결과에 미치는 영향이 상대적으로 적어서 주로 제일 먼저 삭제되는 것 같다. Tensor Decomposition 할 때도 그랬던 것 같기도...?
Wrap-up
대부분의 경량화 논문은 성능을 유지하면서 연산량이나 파라미터 숫자를 줄이는 것을 목표로 하고 있다. 그와 달리 이번 논문은 성능 유지보다도 경량화를 통해 실제로 얻을 수 있는 inference 속도 향상에 초점이 잡혀있습니다. 실제로, 논문에 나타난 실험 구성들을 보더라도 inference 속도를 중요시 여기는 걸 알 수 있다. 실험 결과 inference 속도도 꽤나 향상된 걸 알 수 있다. 다만 MobileNet이나 EffiecientNet 같이 특정 Conv layer block 들(Depthwise + Pointwise)의 블록으로 구성된 모델에만 사용 가능한 것 같다?(Rep-VGG 논문을 열심히 들여다보진 않았지만 일반 Conv layer에 대한 문제들은 Rep-VGG에서 다뤄서 이 쪽으로 집중한 것 같기도 함). 해당 논문의 코드가 github에 공개되었기 때문에, 적용하여 성능과 inference 속도를 비교해 볼 수 있을 것 같다(https://github.com/facebookresearch/depthshrinkert). 꽤나 흥미로운 논문이었다.
'논문리뷰' 카테고리의 다른 글
[이상탐지] Towards Total Recall in Industrial Anomaly Detection (0) | 2022.10.26 |
---|---|
[경량화] F8Net: Fixed-Point 8-bit Only Multiplication for Network Quantization (0) | 2022.08.20 |