해당 포스팅은 네이버 부스트캠프 AI Tech 학습 정리 자료임을 알려드립니다.
이번 주 강의들은 생각보다 정리하기 어려워서 이해하기 어려운 부분이 있으실 것 같아서 미리 양해의 말씀을 드리고, 추후 살을 붙여나가도록 해보겠습니다.
1. 강의 정리
홍원의 마스터 - 빠르게
보통 머신러닝 모델을 만들 때, 주로 Software쪽에서 다양한 모델을 활용해서 Pytorch나 Tensorflow와 같은 High-level IR로 만들게 됩니다. 이렇게 만들어진 모델이 Hardware인 Processor에서 동작하기 위해서는 Processor가 알아들을 수 있는 방식으로 전달해야 합니다. 그래서 DL compiler, Low-level IR과 같은 단계를 거쳐서 전달되게 됩니다. 모델이 기계에서 동작할 때, 어떻게 되는 지에 대한 내용을 다뤘습니다.
1) Acceleration
기본적으로 Python list에서의 계산보다 Numpy array에서의 계산이 빠르다는 것을 많이 아실 것입니다. 그렇다면 어떤 이유에서 이러한 현상이 발생할까요? Python list의 경우, 리스트의 각 원소들을 각기 다른 object로 인식하고 있습니다. 하지만, Numpy array에서는 비슷한 데이터 타입들의 묶음을 메모리상에서 가까운 위치에 저장하고 있어서 빨라지는 효과가 있습니다. 또한 Numpy는 C로 만들어졌기 때문에 Python list에 비해 좋은 성능을 보여줍니다.
정보 전달 속도에 관점에서 Acceleration을 살펴보면, A라는 사람이 B에게 파일을 전송한다고 해봅시다. 빨라지고 느려지는 것은 보통 병목현상에 의해서 발생합니다. 4차선 도로가 갑자기 2차선 도로로 줄어들게 되면, 4차선에 있던 모든 차들이 2차선으로 지나가려고 하다보면, 이전의 속도보다 느린현상이 발생하게 되는 것입니다.
Hardware 측면에서도 가속을 위한 다양한 방법들이 존재합니다. Bandwidth, Throughput, Latency 등이 존재합니다. Bandwidth를 높게 한다는 것은 capacity를 늘리겠다는 것과 같습니다. Throughput은 실제 전송에 대한 이야기인데, 코어를 여러 개를 사용해서 병렬처리를 하는 것에 해당합니다. Latency는 우리가 필요한 정보를 Cpu의 가까운 곳에 놓아서 쉽게 가져올 수 있도록 하는 것입니다.
머신러닝에 적용하면, 가장 병목현상이 발생하는 부분은 어디일까요? 모델이 학습하는 구간이 될 것입니다. 그 중에서도 가장 연산량이 많은 부분이 병목현상에 해당될 가능성이 높습니다.
2) Hardware chip
우리가 흔히 알고 있는 hardware acceleration에는 GPU, TPU 등이 존재합니다. 물론, CPU도 포함하지만, 일반적인 목적으로 주로 활용됩니다. 이외에도 DPU, NPU, IPU, VPU, FPGA, SoC 등 다양한 것들이 존재합니다. SoC는 System on Chip으로 CPU, GPU, WIFI, CAMERA 등이 칩 안에 포함되어 있는 방식입니다. 이번에 나온 M1칩이 SoC에 포함됩니다. FPGA는 특정 용도에 맞춰서 조립가능한 칩입니다.
3) Compression & Acceleration
보통 Compression과 Acceleration은 논문 등에서 같이 묶여서 등장하는 경우가 많습니다. Compression의 경우는 Space complexity에 대한 내용을 줄여주는 방식으로 Software쪽에 해당되고, Acceleration은 Time complexity에 대한 것을 줄여주는 방식으로 Hardware쪽에 해당됩니다.
software 쪽으로만 acceleration 하는 것보다 hardware도 같이 고려하는 co-design이 더 효율적인 방법입니다.
4) Deep learning compiler
Compiler는 Hardware가 이해할 수 있는 언어로 변환해주는 역할을 하는 것입니다. 딥러닝 모델이 input으로 들어왔을 때, 다양한 hardware에 동작할 수 있도록 변환해주는 것이 Deep learning compiler입니다.
홍원의 마스터 - 가지치기
1) Weighted sum
weighted sum은 가중합을 구하는 방법입니다. 이것이 pruning에서 중요한 역할을 하게 됩니다. 어떤 것이 중요한지에 따라 다른 가중치를 부여하면 각 값이 영향을 미치는 정도가 달라지게 됩니다.
2) Pruning
Pruning은 가지치기와 같습니다. 자주 쓰는 것은 살리고, 자주 사용되지 않는 것은 잘라내는 것입니다. 이를 통해서 Inference speed 증가하게 되고, 모델이 일반화됩니다. 하지만, 얻는 것이 있으면 잃는 것이 있겠죠. 대표적으로 정보 손실, 네트워크에서 잘라냈을 때, 아무렇게 잘라놓으면 계산할 때, 어려움이 있습니다.
Deep learning에서의 Pruning은 가중치가 0 근방의 weight들을 잘라내는 방식을 사용하기도 합니다. 0의 주변을 없애는 이유는 뒤로 갈수록 크게 영향일 미치지 않는다고 판단한 것입니다. Pruning과 비슷한 형태의 Dropout이 생각날 수 있습니다. 둘은 비슷한 동작을 하지만 차이가 존재합니다. Pruning은 가지를 잘라낸 것은 복원하지 않지만, Dropout은 잠시 해당 노드들을 껐다가 킬 수 있고, 마지막에 inference할 때에는 모든 노드들을 살린채로 inference합니다.
위에 보이는 그림의 좌측 부분은 반복적인 Pruning을 표시한 것입니다. Network가 들어오면, 각 뉴런의 중요도(Magnitude)를 측정한 다음 중요하지 않은 부분은 제거하고, 데이터를 넣어서 Fine-tuning을 진행합니다. 그 후 더 Prouning 과정을 할지를 선택하게 되는데 보통은 반복적인 Prouning을 많이 사용합니다.
Pruning을 했을 때와 안했을 때는 (속도, 사이즈)와 (정확도)의 tradeoff가 존재합니다. 동일한 모델에 prouning을 했을 때와 안했을 때의 그래프가 위의 그림과 같습니다.
3) 다양한 Pruning
Pruning 방법은 무수히 많이 존재합니다. 몇가지 큰 종류의 Pruning만 소개하자면, Global Magnitude Pruning, Layerwise Magintude Pruning, Global Gradient Magnitude Pruning, Layerwise Gradient Magnitude Pruning, Random Pruning이 있습니다. 이렇게 큰 분류로 나누는 기준에는 여러가지가 존재하는데, 얼마나 자주 Pruning 하는가, 언제 Pruning 하는가(train 이전, train 중간, train 이후), 어떻게 Pruning 하는가, 어떤 것을 Pruning 하는가에 대한 다양한 기준으로 나누게 됩니다.
4) Lottery ticket hypothesis
Lottery ticket hypothesis는 2015년에 제안된 가설입니다. 전체 내용은 대략적으로 정리해보면 다음과 같습니다.
1. 네트워크를 처음에 랜덤하게 초기화를 해줍니다.
2. training을 진행한 뒤에 prouning을 진행합니다.
3. prouning한 네트워크에 처음에 초기화해 준 값을 넣고 training을 다시 진행합니다.
4. training한 결과가 처음에 training한 결과와 비슷한 결과를 얻는 network를 얻습니다.
이 때, 2번에서 prouning을 진행한 뒤에 나온 network를 Lottery ticket이라고 부르는 것입니다. 일반적으로 여기서 말하는 lottery ticket은 원래 네트워크의 subnetwork 중에 training을 했을 때, 비슷한 결과를 얻는 네트워크를 말하고, 이 논문에서는 존재할 것이라는 가설을 세웠습니다. 하지만, 결국에는 lottery ticket을 얻기 위해서는 원래의 네트워크를 학습을 시킨다음에 얻을 수 있다는 것입니다. 이외에도 weight rewinding 방법 등도 존재합니다.