-
[딥러닝 경량화] 모델, 네트워크 경량화 : Quantization - PTQ, QATDeep learning 2022. 9. 3. 08:25
DNN model 크기가 커지는 것을 연산기 성능 향상이 따라가지 못하고 있습니다.
이렇게 빠르게 model이 커짐에 따라 inference, training cost가 너무 커지고 있어 이를 해결하기 위해 모델 경량화 기법들을 사용하고 있습니다. 모델 경량화 기법은 크게는 4가지로 볼 수 있습니다
pruning
0에 가까운 애들 다 지워버리자.
fine grained pruning할 떄는 unstructural pruning하면 연산에서 이득이 적음..
그래서 structural pruning을 많이 사용함 ( good for SIMD )
quantization
symmetrics vs assymetric quantization ( symmetrics 이 연산이 간단 )
극단적으로가면 BNN
quantization on training : training에도 quantization 쓰자
Knowledge distillation
원본 DL 모델 ( 크고 학습많이한 model )이 teacher, 이 모델을 다 쓸필요없거나 device에 안맞을 때 딱 task에 맞는 작은 student model 만듬. teacher model의 prediction을 loss에 넣어서 학습
low-rank factorization
NxM이 너무 크니까 Nxk @ kxM 으로 줄인 것 ( matrix factorization )
이 중 이 글에서는 quantizatin에 대해 설명하고자 합니다.
quantization은 크게는 fixed point dnn quantization과 floating point dnn quantization으로 나뉘는데 나뉘는 이유는 fix point dnn quantization는 forward에 대해서만 quantization 하는 것이고, (backward는 full precision 연산함) floating point dnn quantization은 backward에 대해서 quantization 함으로써 training 도 적은 bit 연산으로 하겠다는 것 입니다.
quantization algorithm을 보기 전에 숫자가 어떻게 표현되는지 살펴보려고 합니다.
우선 기본이 되는 32bit floating point 은 아래와 같습니다. exponent에 따라 float32가 나타낼 수 있는 range를 정해지게 되고 fraction(mantissa)에 따라 값의 정밀도가 정해집니다.
16 bit floating point는 exponent를 5bit으로 줄이고 fraction을 10bit으로 줄여 표현합니다. 16 bit floating point 만 되더라도 exponent 부족으로 quantization 시 문제가 발생하기 때문에 이를 해결하는 방법이 뒤에 나옵니다.
fixed point format에는 scale이라는 값이 있습니다. 이 값은 bit에 포함되지 않고 따로 들고 있어 공유하는 값 입니다. 얘를 들어 scale 이 3이고 2 bit fixed point 라고하면 {-3, 0, 3} 과 같은 표현이 됩니다.
이제 forward에만 quantization을 적용하는 fixed-point dnn quantization 에 대해 설명하고자 합니다.
fixed-point dnn quantization algorithm
fixed point dnn quantization의 목적은 inference에 사용할 model을 만들고자 하는 것입니다. 따라서 이후 설명하게될 algorithm들에서 forward path에만 quantization을 적용하고 있는 것을 볼 수 있습니다.
일단, 쉽게 생각하면 아래와 같이 float 32로 표현된 값을 int8로 qunatization 한다는 것은 정수로 mapping 하는 것 입니다.
int 8 quantization
하지만 더 적은 bit으로 기존 값을 잘 표현 하기 위해서는 분포가 낮은 outlier 를 제거하는 작업이 필요하고 어느정도까지 제거하느냐가 중요해집니다. 다시 말하면, fixed-point dnn quantization에서는 fixed-point 표현에서 scale 정하는 것이 핵심입니다.
fixed-point dnn quantization 의 종류는 크게 두개로 나뉩니다.
- post-training quantization
post-training quantization은 학습이 끝난 모델을 quantization 하는 것 입니다. 이 때 model의 weight 뿐 아니라 model 에 입력을 넣었을 때 나오는 activation들도 quantization 합니다.
post-training quantization 에서 중요한 부분은 scale을 정하는 것 입니다.
고정된 scale을 쓰는게 간단하지만 quantization 하면서 정보의 loss를 최소화하는 것이 중요하기 때문에 데이터를 network 에 통과시키면서 layer 별로 값을 분포를 보고 scale을 정하는 방법을 사용합니다.
weight는 data를 통과시켜서 연산을 하지 않더라도 이미 정해져있는 값이기 때문에 분포를 파악하기 쉬우나, activation의 경우에는 data를 통과시키면서 scale을 정해가야 합니다.
위 방법에서는 layer 별로 scale을 정했습니다. 이렇게 되면 layer안에 있는 channel 들은 동일한 scale을 쓰게되는데, channel 별로도 값 분포가 다르기 때문에 최근에는 layer 안 channel 별로도 적당한 scale을 찾아 사용하는 방법까지 사용하고 있다고 합니다.
4-bit post-training quantization도 시도되고 있으며 아직까지는 imagenet resnet50 기준 1% 이상의 정확도 손실이 있다고 합니다.
- quantization-aware training
quantization-aware training 은 training 이 완료된 후 quantization을 하면서 다시 training 해 나가면서 weight, activation 의 quantization 값을 조정해나가는 방법입니다.
fixed-point quantization 방법은 inference 용 model을 만들어내는 것이 목표이기 때문에 forward에 사용되는 값들은 quantization 하고, gradient와 weight update 시에는 quantize 하지 않습니다.
위에서 본 것 처럼 post-training quantization 방법으로도 4bit 까지는 어느 정도의 성능을 보이고 있기 때문에 quantization-aware training 방식은 1-bit / 2-bit fixed-point quantization 연구가 활발합니다.
먼저 binary 표현부터 보면,
weight 를 {-1, 1}로 표현하고 activation은 32bit float을 쓰는 binary connect(BC)라고하고,
weight도 {-1,1} activation 도 {-1, 1}로만 표현하는 것을 binarized neural network ( BNN ) 이라고 합니다.
BNN의 경우 연산이 XNOR 연산으로 다 되기 때문에 gate 하나로 연산이 된다는 큰 장점이 있지만 성능 하락이 크기 때문에 연구가 진행 중 입니다.
binary는 성능하락이 너무 크기 때문에 현실적으로 쓰기 위해 2bit으로 줄이는 연구도 활발합니다. 2bit을 쓸경우 {-w, 0, w} 와 같이 3가지 값을 쓰기 때문에 ternary network 라고도 합니다.
아래와 같이 ternary network 에서는 기존 값을 normalization 하고 값을 셋으로 잘 나누는 것이 중요합니다.
기존 값을 3등분으로 잘 표현하는게 핵심입니다.
이 때 quantization 해야하는 값은 activation과 weight 인데요, 연산과 분포의 특징이 다르기 때문에 각각의 문제에 대해 알아보고자 합니다.
activation quantization 의 문제
- relu : relu는 양수의 경우 그대로 출력하기 때문에 양수 값에 제한이 없게됨. quantization 시 값 표현에 제한이 있기 때문에 아주 큰 값들도 다 줄어들기 떄문에 quantization error 는 커지게 됨. 이를 보완하기 위해서 clip relu를 쓰게 되는데 이러면 full precision 정확도가 떨어지게 됩니다. 적절한 full precision 정확도와 quantization 정확도 사이의 trade off 를 조절해가는 것이 문제입니다. 이 적절한 clipping level을 찾는 것을 training 과정에서 자동으로 tuning 하는 방법을 사용합니다.
weight quantization 의 문제
- weight의 경우에는 forward 하지 않아도 분포가 있기 때문에 activation 보다는 나은 상황이지만, quantization-aware training 은 weight 가 update 되기 때문에 post-training quantization 처럼 간단하지는 않습니다. 또한 weight 분포는 normal distribution 이라고 하기 어렵습니다. 따라서 weight 분포를 잘 찾아서 이에 맞게 scale을 정하는 방법이 필요합니다.
activation문제를 해결한 것이 parameterized clipping activation ( PACT )
weight 문제를 해결한 것이 statistics aware weight binning ( SAWB ) 입니다.
이제 현재 가장 좋은 성능을 보이고 있는 learned step size quantization (LSQ) 방법에 대해 알아보려 합니다 .
* quantization-aware training의 기반이 되는 것은 state-through estimator(STE)입니다. quantization에 사용되는 round operation은 미분 불가능하기 때문에 gradient 값을 구할 수 없고 backward가 되지 않는 문제가 있었습니다. 이를 해결하기 위해 round function 의 평균으로 approximate 하여 이 함수를 미분하여 backward 를 수행하겠다는 방법입니다.
floating-point dnn quantization
- 16-bit mixed precision training
- 8-bit dnn training
- 6-bit post training quantization
- 4-bit dnn training
float32 > float16
range 가 바뀌기도 하면서, 정밀도도 줄어들게 된다
float8 의 경우 표현이 모자라서 forward와 backward에 따라 exponent, mantissa bit을 다르게 가져간다
16-bit mixed-precision training ( nvidia, ICLR 18)
gradient는 16 bit을 쓰지만 update 할 때는 32bit(full precision)으로 한다
float 16 은 sub-normal range라 하더라도 float32 보다는 차이가 많이난다.
특히 gradient의 경우 범위보다 작은 값이 많이 나온다. -25~-100 까지에 있는 많은 값을 다 0으로 만들어버린다. 제대로 quantization 하지 못한다.
오른쪽이 안쓰이고 있으니 저 그림을 오른쪽으로 shift 하면 해결될 것 같다.
어떻게 shift 할 것인가 ? ( bias 를 바꾸는건 hw를 바꿔야함 )
해결 : loss scaling. loss에 scale을 한번만 주면 backprop 하면서 gradient도 모두 scale 된다. 다만 scale이 너무 커지면 양수 값이 날아갈 수 있기 때문에 어느정도 scale 할지를 adaptive 하게 정한다 . 초기값은 최대한 크게하고 조정해나간다
- 8-bit dnn training
8 bit 까지 줄이게되면 accumulation 시에 문제가 생긴다.
- 6-bit post training quantization
floating point quantization에서 bias 정하는 것도 중요.
SQNR 을 가지고 adaptive 하게 bias를 정해나가자.
bias를 적절히 줌으로써 fixed bias보다는 성능이 잘나옴. max bias와 비슷한 결과가 나오는데 max에 비해서 2bit을 줄여도 성능이 유지됨이 확인됨
bit 수가 줄어들 수록 bias를 잘 정하는게 중요해짐.
4bit fp dnn training
fw (1 0 3), bw (1 3 0) format 사용
forward는 4bit PACT, SAWB를 쓰면된다. ( fixed point dnn quantization algorithm ) -> forward 검증됨
backward만 잘하면된다
radix-4 fp4 은 기존 raidx2 fp4는 2^-3~4 가 표현되었은데 radix를 4로 바꿈으로써 range가 4^-3~4 가 된다.
+ layer 별로 gradient scale을 준다
'Deep learning' 카테고리의 다른 글