최근 llama.cpp 에 I-Quant (IQ로 시작하는 것들, IQ1_S, IQ2_XS, IQ4_NL 같은 것들) 이 추가되면서,  데이터셋을 써서 imatrix calibration data 를 만들어서 양자화 할 수 있게 되었음. I-Quant 는 이게 필수임


그런데 imatrix 는 IQ3_XS 같은 I-Quant 뿐만이 아닌, 기존 K-Quant(Q4_K_M, Q3_K_S 같은 가운데 K 들어가는 것들)은 물론 그 이전에 등장한 양자화 방법인 Q4_0, Q4_1, Q8_0 같은 것으로 양자화 할 때에도 쓸 수 있음


여기서는 간단하게 LLaMa v2 7B 를 가지고 Q4_0 로 양자화 할 때 imatrix 를 쓰면 어떤 영향이 있는지 살펴보자


1. Perplexity

LLM 성능에 대해 말할 때 등장하는 대표적인 숫자임. PPL 로 줄여 쓰기도 함


이건 매우 쉽게 설명하면, LLM 이 토큰을 생성할 때, 이전 토큰을 가지고 다음 토큰을 생성할 때 후보로 고려하는 토큰 수임(토큰을 단어라고 생각해도 문제 없을듯). 이거 숫자가 작을수록 LLM 이 더 쉽게 다음 토큰을 예측하여 성생한다고 보면 됨. 즉, 작은게 좋음


imatrix calibration data 만들 때 context length 도 설정할 수 있는데, 그냥 돌리면 512 임. 이게 달라져도 차이가 있나 궁금해서 512 와 4096 (LLaMA v2 가 학습할 때 사용한 context length) 으로 다르게 해서 만들어봤음


Quantization TypePerplexity
LLaMA v2 7B Q4_05.9618
LLaMA v2 7B Q4_0 imatrix Ctx 5125.9107
LLaMA v2 7B Q4_0 imatrix Ctx 40965.9090
LLaMa v2 7B F16 Base5.7962



그 결과, Q4_0 임에도 imatrix 를 썼을 때 PPL 이 감소하고, context length 를 크게 했을 때 약간이지만 좀 더 줄어드는걸 볼 수 있음



2. KL Divergence

위에서는 토큰을 생성할 때 다음 토큰 후보로 고려하는 토큰의 갯수를 고려했는데, 그거보다 좀 더 차이를 빡세게 분석하는 것이 이것임


이것은 기준(여기서는 F16)확률 분포에 대해 주어진 확률 분포(여기서는 양자화 된 것들)이 얼마나 차이가 나는지 차이를 계산해서 숫자로 뽑음. 동일한 입력 프롬프트에 대해 다음 토큰으로 올 녀석의 확률 분포 전체를 가져다가 1:1 로 계산하여 차이가 나는 정도를 구함


즉, 이것도 숫자가 작은게 비교 대상인 F16 에 보다 근접하고, 좋은거다 라고 알고 있으면 됨


 

Quantization TypeKL Divergence AVGKLD99KLD95
LLaMA v2 7B Q4_00.0285750.2380900.089369
LLaMA v2 7B Q4_0 imatrix Ctx 5120.0196660.1667080.063026
LLaMA v2 7B Q4_0 imatrix Ctx 40960.0195800.1643610.062593

 


복잡해 보이지만 결론은, Q4_0 로 양자화 할 때도 imatrix 를 쓰고, context length 4096 으로 한 게 눈꼽만큼이지만 더 좋은 걸 알 수 있음



3. 고민이 필요한 부분

imatrix 만들 때 던져주는 데이터셋이 이상한 것이면 더 안좋아질 수도 있을 것 같지만, 어지간해서는 이런 일은 발생 안하지 싶음. 하지만 역으로 오버피팅(필요 이상으로 다음 토큰 고려 시 가능한 것들이 잘려나가는...)이 발생할수도 있을듯