최근 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 Type | Perplexity |
LLaMA v2 7B Q4_0 | 5.9618 |
LLaMA v2 7B Q4_0 imatrix Ctx 512 | 5.9107 |
LLaMA v2 7B Q4_0 imatrix Ctx 4096 | 5.9090 |
LLaMa v2 7B F16 Base | 5.7962 |
그 결과, Q4_0 임에도 imatrix 를 썼을 때 PPL 이 감소하고, context length 를 크게 했을 때 약간이지만 좀 더 줄어드는걸 볼 수 있음
2. KL Divergence
위에서는 토큰을 생성할 때 다음 토큰 후보로 고려하는 토큰의 갯수를 고려했는데, 그거보다 좀 더 차이를 빡세게 분석하는 것이 이것임
이것은 기준(여기서는 F16)확률 분포에 대해 주어진 확률 분포(여기서는 양자화 된 것들)이 얼마나 차이가 나는지 차이를 계산해서 숫자로 뽑음. 동일한 입력 프롬프트에 대해 다음 토큰으로 올 녀석의 확률 분포 전체를 가져다가 1:1 로 계산하여 차이가 나는 정도를 구함
즉, 이것도 숫자가 작은게 비교 대상인 F16 에 보다 근접하고, 좋은거다 라고 알고 있으면 됨
Quantization Type | KL Divergence AVG | KLD99 | KLD95 |
LLaMA v2 7B Q4_0 | 0.028575 | 0.238090 | 0.089369 |
LLaMA v2 7B Q4_0 imatrix Ctx 512 | 0.019666 | 0.166708 | 0.063026 |
LLaMA v2 7B Q4_0 imatrix Ctx 4096 | 0.019580 | 0.164361 | 0.062593 |
복잡해 보이지만 결론은, Q4_0 로 양자화 할 때도 imatrix 를 쓰고, context length 4096 으로 한 게 눈꼽만큼이지만 더 좋은 걸 알 수 있음
3. 고민이 필요한 부분
imatrix 만들 때 던져주는 데이터셋이 이상한 것이면 더 안좋아질 수도 있을 것 같지만, 어지간해서는 이런 일은 발생 안하지 싶음. 하지만 역으로 오버피팅(필요 이상으로 다음 토큰 고려 시 가능한 것들이 잘려나가는...)이 발생할수도 있을듯
끗