Qwen3.6-27B - KV 양자화(Quantization)가 KLD에 미치는 영향 - Q8, Q6, Q5 (bartowski)
요약
Qwen3.6-27B 모델의 KV 양자화가 KLD(Kullback-Leibler Divergence)에 미치는 영향을 실험적으로 분석했습니다. 다양한 양자화 수준(Q8, Q6, Q5)과 KV 양자화 조합을 비교하여 성능 저하를 최소화하는 최적의 설정을 제안합니다.
핵심 포인트
- Q8 양자화가 Q6 및 Q5보다 성능 면에서 우수함
- v 양자화를 q4_0로 설정할 경우 성능이 급격히 하락함
- VRAM 여유가 있다면 (q8_0, q8_0) 설정을 사용하는 것이 가장 권장됨
- Q5 모델은 Q8이나 Q6에 비해 v 양자화에 더 관대한 특성을 보임
낮을수록 좋습니다 - 오른쪽에서 왼쪽으로 갈수록 양자화(Quantization) 수준이 높아집니다.
최근 저는 bartowski의 Qwen3.6-27B Q8 모델에 더 많은 컨텍스트(Context)를 집어넣는 방법에 대해 이곳에 게시물을 올린 적이 있습니다. 제 (개인적인) 경험상 Q8이 Q6나 Q5보다 훨씬 더 성능이 좋았기 때문입니다.
더 높은 모델의 KV를 양자화하는 것에 대한 많은 댓글이 있었고, 일부 사람들은 그냥 Q6 같은 낮은 양자화 수준을 사용하되 KV는 양자화하지 않은 상태(unquantized)로 사용하는 것을 제안했습니다. 그래서 저는 KLD를 통해 그 가설을 테스트해보고 싶었습니다.
기준점(Base reference)은 KV 양자화를 하지 않은 Q8입니다. 제 5090은 Q8만 겨우 수용할 수 있기 때문입니다.
다음은 제 연구 결과입니다. 상세한 테스트 설정과 접근 방식은 아래에 이어집니다.
- Q8이 Q6 및 Q5보다 성능이 더 좋습니다 (놀라운 일은 아닙니다).
- Q6와 Q5 사이의 격차가 Q8과 Q6 사이의 격차보다 훨씬 큽니다.
- v를 q4_0로 설정하는 순간 Q8과 Q6 모두 급격히 하락합니다. k에 어떤 양자화를 사용하든 상관없습니다.
- 만약 v에 q4_0를 사용해야 한다면, 차라리 Q6 양자화에서 (q8_0, q8_0)를 사용하는 것이 낫습니다 (이 점은 정말 놀라웠습니다).
- Q5는 Q8이나 Q6보다 v 양자화에 더 관대합니다.
- (q4_0, q4_0)를 사용할 경우, Q8과 Q6는 수렴합니다.
권장 사항: VRAM에 들어갈 수 있는 무엇이든 사용하되, 그냥 (q8_0, q8_0)를 사용하세요. 거의 비용이 들지 않는 수준입니다.
테스트 설정:
이 데이터를 생성하기 위해 llama-perplexity를 사용했습니다. 이 모델의 저의 주요 사용 사례는 코딩, 특히 Python입니다. 그래서 Python 샘플 파일을 사용하고 싶었습니다. 여러 오픈 소스 코딩 저장소(transformers, torch, huggingface 등)를 다운로드하여 Python 소스 파일들을 연결해 230MB 크기의 거대한 텍스트 파일을 생성했습니다.
시스템이 관리할 수 있는 최대한 높은 컨텍스트를 사용하고 싶었습니다. 저는 5090과 64GB RAM을 보유하고 있습니다. 시행착오 끝에 최대 50K 컨텍스트까지 확보할 수 있었고, 모든 테스트에 이를 적용했습니다.
청크(Chunk) 수가 많아질수록 KLD가 개선되고 수렴하는 것처럼 보였습니다. 그래서 청크 크기를 32로 결정했습니다.
모든 다양한 조합을 실행할 스크립트를 작성하기 위해 Qwen-3.6-27B를 사용했습니다 (당연하죠!).
기본 로짓 (logits)을 생성하기 위해 사용한 명령어는 다음과 같습니다:
build/bin/llama-perplexity \ -m ~/myp/models/bartowski_Qwen_Qwen3.6-27B-Q8_0.gguf \ --temp 0.6 \ --top_p 0.95 \ --top_k 20 \ --min_p 0.0 \ --repeat-penalty 1.0 \ --presence-penalty 0.0 \ -c 50000 \ -t 16 \ -ngl 99 \ --flash-attn on \ -kvo -b 1024 -ub 256 \ --kl-divergence-base ~/tmp/base_50k_coding.kld \ --chunks 32 \ -f python_corpus.txt
이 과정이 완료된 후, 다른 실행(runs)들에서 이를 기준으로 사용할 수 있도록 --kl-divergence 플래그를 추가했습니다.
각 실행은 완료하는 데 17분이 소요되었고 총 23번의 실행이 있었으므로... 어... 시간이 꽤 오래 걸렸습니다.
면책 조항 (DISCLAIMER)
배우면서 진행하고 있습니다. 만약 이것이 어리석거나 제가 완전히 잘못된 방향으로 가고 있다면 말씀해 주세요.
벤치마크(benchmarks) 측면에서 보면, 개인의 경험이 더 중요하다고 생각합니다. 우리는 종종 자신의 직관을 믿는 것을 두려워하곤 합니다. 벤치마크가 절대적인 진리는 아닙니다.
차트에 나타난 거리(distances)가 얼마나 중요한지는 모르겠습니다. 결국, 양자화되지 않은 Q6는 양자화되지 않은 Q8과 0.01 유닛 차이가 납니다. 잘은 모르겠지만, 이는 엄청나게 좋은 절충안(compromise)처럼 들립니다.
저는 여전히 Q8 모델을 사용하고 싶습니다. 제 개인적인 경험으로는, Q8이 코드를 더 잘 이해하고 더 잘 작성한다고 느낍니다.
Bartowski 모델을 사용한 것은 특별한 이유가 아니라 이미 제 컴퓨터에 모델들이 있기 때문입니다. Unsloth 모델에 대해서는 별다른 의견이 없습니다. 제가 알기로는 그 모델들이 더 좋을 수도 있고 더 나쁠 수도 있습니다.
원시 데이터 (Raw Data)
model Q8_0 Q6_K_L Q5_K_L
(no_kv,no_kv) 0 0.010771 0.0228
(none,q8_0) 0.005399 0.01069 0.022322
(q8_0,q8_0) 0.00541 0.010709 0.022486
(q8_0,q5_1) 0.00736 0.011715 0.023135
(none,q5_1) 0.007397 0.011648 0.023194
(none,q4_0) 0.01164 0.014789 0.024295
(q8_0,q4_0) 0.011824 0.014666 0.024101
(q4_0,q4_0) 0.020817 0.022166 0.027909
submitted by /u/BitGreen1270
[link] [comments]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/LocalLLaMA의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기