티스토리 뷰

Study/AI

[DL] Optimization Techniques

생각많은 소심남 2020. 1. 28. 11:39

 보통 딥러닝에서 Model의 size를 줄이거나 동작 속도를 향상시키기 위해서 수행하는 Optimization 기법으로 크게 3가지 방법을 드는데, accuracy 측면에서 약간 손해보면서 Model Size를 줄이는 Quantization, training시 필요한 metadata나 Operation을 안쓰게끔 하는 Freezing, 그리고 Layer의 복잡성을 줄이기 위해서 여러 Operation을 하나의 Operation으로 바꾸는 Fusion 등이 있다.

Quantization

그림 1. Example of Quantization

 Quantization은 Model을 구성하는 weight이나 bias들이 과연 몇 bit으로 표현하느냐와 연관된 내용이다. 물론 정확성 측면에서는 각 weight와 bias들이 소수점 자리까지 정확히 update하고 계산에 활용하는 것이 좋겠지만, 그런 소수점이란 기능을 활용하기 위해서는 기본적으로 소수점을 지원하는 자료형을 사용해야 한다. 가장 기본적으로 알고있는 자료형이 FP32, 즉 32bit floating point value를 써야한다는 것인데, 이렇게 만든 모델을 실제 Edge단인 Embedded board에는 올리기 힘들다. 대신 32bit으로 표현한 값을 어느정도 정수로 표현해주면 소수점으로 표현해줄때보다는 model의 accuracy가 나빠지겠지만, 적어도 사용할 수 있는 용량이 제한적인 보드에 올리고자 할때에는 이점으로 작용할 수 있다. Quantization은 바로 이런 model의 precision을 줄이는 과정이라고 보면 된다. Intel OpenVINO Toolkit에서 제공되는 model은 기본적으로 FP32형으로 되어 있긴 하지만, Toolkit내에 포함되어 있는 Model Optimizer를 통해서 FP16(16bit floating point)나 INT8(8bit integer)등으로 변환시킬 수 있다. 물론 FP32를 사용할때보다 FP16나 INT8을 썼을 때 accuracy가 나빠지겠지만, model을 작게 만들고, model내에서 수행되는 연산도 그만큼 빨라지게 되므로, 이런 edge training에서 많이 사용되는 기법이다.

Freezing

그림 2. Example of Freezing

  보통 Neural Network에서의 freezing을 설명하라면, Training 과정에서 hyperparameter를 fine-tuning하는 과정 중 weight이 update되는 절차를 임시적으로 막아서 update되지 않게끔 하는 방법을 말하는데, 여기서 예로 들고 있는 TensorFlow model상에서의 freezing이 의도하는 freezing은 조금 다르다. 궁극적으로는 training시 update되는 것을 막는 과정은 비슷하나, 여기서는 training시에 필요한 operation이나 metadata를 제거하는 것을 말한다. 사실 backpropagation을 수행할 때도 training시에만 영향이 있지, 실제 inference를 수행할 때는 필요가 없게 된다. 그래서 Edge에서 inference만 한다고 가정했을 때는 이렇게 model freezing을 통해서 size를 줄이는 것도 좋은 방법이 될 수 있다.

Fusion

그림 3. Example of Fusion

 단어뜻에도 내포되어 있다시피, Fusion은 각각의 기능을 수행하는 Layer들을 하나로 결합시키는 기법이다. 예를 들어서 Convolutional Neural Network에서는 Batch Normalization이나, activation, convolution 연산을 하는 각 layer들이 존재하지만, 이로 인해서 model의 크기도 덩달아서 커졌다. 그래서 이를 하나의 연산으로 결합시킴으로써, layer내에서 데이터 이동시 발생하는 context switching에 대한 overhead를 줄이는 방법이 Fusion이 되겠다. GPU같이 Parallel Computation에 특화된 hardware라면 기존 방식대로 처리할 경우 하나의 GPU kernel이 모든 Operation을 Sequential하게 처리하기 때문에 비효율적으로 연산이 수행되겠지만, Fusion이 적용된 경우라면 여러개의 GPU kernel이 결합된 operation을 동시에 처리할 수 있기 때문에 overhead를 줄일 수 있다.

댓글