ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AI 알고리즘 경량화
    최신 기술동향/인공지능 (AI) 2021. 5. 1. 08:25
    반응형

     AI를 활용한 다양한 Application이 등장하며, 각 Application의 성능을 향상시키기 위한 최적의 알고리즘도 등장하고 있다. Natural Language Processing (NLP)를 향상하기 위해, '어느 context에 집중해서 봐야하는지'를 알려주는 Attention 알고리즘, 이를 CNN로 확장시키기 위한 Convoulution Bottleneck Attention Module (CBAM) 등 다양한 알고리즘이 파생되어 제시되고 있다. 하지만 대부분의 평가지표는 Accuracy 및 NMSE값에 초점이 맞춰져 있기 때문에 점점 복잡한 모델들이 등장하고 있다. 많은 GPU를 사용해서 Dataset을 병렬로 처리한다면, Train도 빠르게 될 것이고, Train된 모델을 기반으로 Inference 하는 시간도 줄어들기 때문에, 일단 Performance를 높이는 것이 초점이 맞춰져 있는 것은 당연하다고도 생각할 수 있다.

     음악이나 이미지를 만들어주거나, 오늘 어떤 주식을 사야할지 알려주는 상대적으로 느긋한 Application이나, 무한한 Computing 파워를 쓸 수 있는 클라우드 서버의 경우에는 이 가정이 맞을 수 있다. 하지만, 자율주행처럼 실시간으로 빠른 결정을 내려야 하는 경우에는 많은 시간을 기다려줄 수 없다. 그나마, 차량에는 비싼 GPU를 넣는다는 '가정'을 할 수는 있을 것 같다. 하지만, 통신 Application의 경우에는 더 심각한 문제가 일어날 수 있다. 기본적으로 수 ms 단위로 전송이 되는 통신은 말 그대로 시간과의 싸움이고, 더 나아가, 스마트 폰에 우리가 연구할 때 주로 사용하는 2080 Ti나 V100 GPU를 넣을 수는 없는 노릇이니 말이다. 따라서, 알고리즘의 경량화는 필수적이라고 할 수 있지만, 알고리즘 경량화에 대한 논문이나 글을 찾아보기는 힘들다. 이번 글에서는 알고리즘 경량화에 대한 여러 노력을 가볍게 정리해보고자 한다.

     

    AI 경량화 방향

     AI 경량화는 크게 경량화 알고리즘과 알고리즘 경량화로 나눠져있다. 똑같은 말 같지만, 전자는 '처음부터 가벼운 알고리즘 쓰기'이고 후자는 'Train한 알고리즘에서 필요 없는 부분 걷어내기'라고 생각하면 되는데 Model Compression이라고도 한다. 

     

    1. 경량화 알고리즘

     경량화 알고리즘은 대부분 CNN filter에서의 경량화가 많다. CNN은 알다시피, 거의 모든 AI 알고리즘의 기본 모델에 깔려있다. Feature를 잘 뽑아준다는 장점도 있지만, 그만큼 연산량도 많다는 단점이 있다. 이를 보완하기 위해 MobileNet같은 경량화 알고리즘이 나왔다. Mobilenet의 핵심은 Depthwise Separable Convolution이다.

     쉽게 얘기하면, 일반 CNN에서는 Output Filter가 Input Channel을 한번에 전부 훑으면서 Feature를 뽑았다면, Sepearable Convolution은 1개의 Filter가 1개의 Channel씩 돌아다니면서 Feature를 뽑는 Depthwise Convoution과 이렇게 생성된 여러 Filter들을 Output Filter의 수만큼 모아주는 (1,1) Pointwise Convolution 연산을 순차적으로 하는 방법이다. 이렇게 하면, 연산량이 줄어드는 것을 FLOPs 계산으로 알 수 있다.

    Depwise Separable Convolution의 구조도
    Depthwise Convolution

     이런 방식처럼 Convolution Filter 연산 방법을 다르게 하는 방법, Resnet처럼 Add 연산을 Bypass로 연결해주는 방법 등 다양한 방법으로 성능의 손실은 최소화 하면서 경량화하기 위한 연구들이 많이 제시되고 있다. 추가적으로 성능의 향상을 보기 위해 무겁게 모델을 돌리고 Hidden Node나 Layer 등을 조절하는 Hyper-parameter Tuning도 매우 중요한 과정이라고 할 수 있다.

     

    2. 알고리즘 경량화

     AI 모델 구조가 어느 정도 정리가 되었다면, Train을 시켜보고, 쓸데 없는 노드를 걷어낼 차례다. 꽤 유명한 방법으로 Pruning이 있다. Tree 계열의 Machine Learning (ML) 알고리즘에서도 등장하는 용어로 이름에서 알 수 있듯이 '가지치기'라고 생각하면 된다. 처음에 Fully Connected Layer에서 Hidden Node와 layer를 지정하면 모든 노드를 연결해서 Weight를 학습시키고, 이렇게 학습된 Weight를 통해 Inference를 진행하게 된다. 하지만, 1천개의 Hidden Node 중에 100개의 Node만 실제로 Inference하는데 큰 영향 (큰 Weight값) 을 미치고 나머지 Node들은 별 영향이 없다면, 해당 노드들을 끊어주면 더 적은 연산량으로 Inference를 할 수 있을 것이다. Fully Connected Layer의 Complexity는 이전 Layer와 현재 Layer의 노드 수의 곱으로 이루어져있기 때문이다. 이렇게 필요없는 노드를 끊어주는걸 Pruning이라 하며, 가중치를 0으로 Setting하여 Sparse하게 만들어주는 방식으로 이루어진다. 즉, 얼마나 노드를 끊어줄지 Sparsity를 지정해주던지, 직접 가중치가 Threshold를 넘는지를 판단하여 Pruning을 진행해줘야한다. 생각만해도 귀찮은 작업이지만, 역시 Tensorflow는 이런 귀찮은 작업을 하는 API도 만들어놨다.

    pruning 구조도

    - tfmot (Tensorflow Model Optimization) 패키지

     tfmot 패키지는 모델 자체를 최적화하기 위한 패키지다. 크게 Quantization과 Pruning 방법을 지원하는데 Quantization은 가중치의 부동소숫점 연산 숫자를 줄이는 방법이다. 예를 들어, float32를 float16으로 줄이면 정확도는 살짝 손해보지만, 더 적은 부동소숫점 연산을 하게 되어, 속도를 높이는 방법이다. 상당히 간단한 방법으로 보이는데, 이 방법도 시도해볼만 한 것 같다. 두 번째 방법이 위에서 소개한 Pruning 방법인데, 간단하게 얼마나 Sparsity를 줄지를 결정해주면 된다. Training을 하면서 Pruning을 진행할 수도 있는데, Train 이후에 Pruning을 하는게 더 간단하고 잘 된다는 것을 알 수 있다. 더 나아가, 어지간하면 AI 모델의 마지막에 있는 Fully Connected Layer만 Pruning하는 것을 추천하는 글들이 많기 때문에 이런 추천을 따르는 것을 권장한다.

     

    3. 모델의 끝판왕 Network Architecture Search (NAS)

     사실 위에 있는 경량화 모델이고, 모델 경량화고, Pruning이고간에 이게 최선인지도 모르겠다는 생각이 많이 들었다. 더 좋은 방법은 없는걸까라는 생각이 들었는데, NAS가 이런 논란의 종결자일수도 있겠다는 생각이 들었다. 앞 글에서 소개했던 NAS는 Architecure자체를 찾아주는 방법이다. AI 구조를 찾는 AI인 NAS는 주로 강화학습을 사용해서 Architecture를 Optimize해준다. 이런 능력으로 최적의 경량모델이면서 Performance를 최적화해주는 알고리즘을 추천해줄 수 있지 않을까 싶다. NAS를 돌리기 위해서 Computing Resource가 많이 필요하지만 Training을 위한 GPU는 많이 있다는 가정이기 때문에 큰 문제는 안 될것으로 보인다. 그러면 NAS를 쉽게 돌리고 경량화까지 고려하는 플랫폼을 잘 찾아서 공부해야하는데, 이 과정도 잘 공부해서 리뷰하는 것을 목표로 하고 있다.

    반응형

    댓글

Designed by Tistory.