2026-09-18. 대상: RQ2 "같은 모델을 더 낮은 비트로 줄일 때 과제 품질은 어디서부터 무너지는가, 그 경계는 무엇으로 예측할 수 있는가". 도구:
llama-imatrix·llama-quantize·llama-perplexity --kl-divergence·ai/scripts/llm_eval/{run_eval,analyze}.py원자료:quant/kld/*.txt(분포 비교 원문) ·quant/raw/*.jsonl(모델 출력) ·quant/analysis/*.json(자동 지표) ·quant/kld_summary.json
기준 모델은 Qwen3-4B-Instruct-2507. 배포사(Unsloth)가 공개한 양자화본 6종에, 직접 만든 4종을 더해 10종을 비교했다. 파일 크기가 같은 2비트 3종을 나란히 두어 비트 폭이 아니라 만드는 방법이 얼마나 영향을 주는지 분리했다.
| 변형 | 만든 방법 | 목적 |
|---|---|---|
| Q8_0 ~ Q3_K_M (5종) | 배포사 공개본 | 비트 곡선 |
| UD-Q2_K_XL | 배포사 공개본 (층별 비트를 달리 주는 방식) | 2비트 상용 기준선 |
| direct-Q2_K | F16 → Q2_K, 보정 없음 | 2비트 기본선 |
| koimat-Q2_K | F16 → Q2_K, 한국어 보정 행렬 사용 | 보정 언어 효과 |
| requant-Q4toQ2_K | Q4_K_M → Q2_K 재양자화 | 원본 없이 줄일 때의 손실 |
| koimat-IQ2_XXS | F16 → IQ2_XXS, 한국어 보정 | 2비트 아래 한계 |
보조로 Gemma 4 E4B 4종(Q8_0·Q6_K·Q5_K_M·Q3_K_M)과 Gemma 4 26B-A4B 1종(UD-IQ2_M)을 같은 케이스로 돌려, 결론이 한 모델 계열에만 해당하는지 확인했다.
보정용 텍스트와 평가용 텍스트를 분리했다. 보정에는 이 프로젝트 문서에서 뽑은 한국어 기술 문장 1,347줄(74.6 KB), 평가에는 겹치지 않는 824줄(30.2 KB)을 썼다. 같은 텍스트를 쓰면 보정이 유리하게 나오는 순환 논증이 된다.
llama-imatrix -m Qwen3-4B-Instruct-2507-F16.gguf -f ko_calib.txt -o ko.imatrix -c 512 --chunks 40
llama-quantize --imatrix ko.imatrix F16.gguf koimat-Q2_K.gguf Q2_K
F16 원본이 각 토큰에 매긴 확률 분포를 기준으로 삼고, 양자화본의 분포가 얼마나 벌어지는지 측정했다(KL 발산). 값이 클수록 원본과 다르게 예측한다는 뜻이다. 같은 한국어 평가 텍스트에 대해 10종 모두 같은 기준 파일(kld_base.bin)로 비교했고, GPU 경합을 피해 CPU 로 한 번에 하나씩 돌렸다(총 1시간 26분).
실제 서비스 프롬프트 그대로 세 과제를 돌렸다. 꼬리질문 40건, 질문 풀 15건, 코칭 15건(합계 70건, 1회 반복). 판정자 LLM 없이 자동 규칙 지표만 집계했다. 서빙은 llama.cpp 서버를 조건마다 새로 띄웠고 문맥 8192, 슬롯 1개로 고정했다.
| 변형 | 크기 (GiB) | 실질 비트 | 평균 KL | 상위 1% KL | 혼란도 비 | 1순위 토큰 일치 |
|---|---|---|---|---|---|---|
| Q8_0 | 3.99 | 8.51 | 0.0012 | 0.008 | 1.007 | 98.3% |
| Q6_K | 3.08 | 6.57 | 0.0079 | 0.050 | 1.008 | 95.4% |
| Q5_K_M | 2.69 | 5.74 | 0.0130 | 0.085 | 1.004 | 94.6% |
| Q4_K_M | 2.33 | 4.96 | 0.0318 | 0.260 | 1.039 | 90.2% |
| Q3_K_M | 1.93 | 4.12 | 0.1123 | 0.853 | 1.101 | 84.1% |
| UD-Q2_K_XL | 1.58 | 3.37 | 0.3489 | 2.644 | 1.212 | 74.5% |
| koimat-Q2_K | 1.55 | 3.32 | 0.3370 | 2.521 | 1.220 | 74.7% |
| direct-Q2_K | 1.55 | 3.32 | 0.7392 | 4.099 | 1.649 | 61.1% |
| requant-Q4toQ2_K | 1.55 | 3.32 | 0.7759 | 4.574 | 1.662 | 60.9% |
| koimat-IQ2_XXS | 1.16 | 2.48 | 1.1451 | 5.752 | 2.203 | 53.9% |
차이는 8비트에서 3비트까지 완만하게 늘다가 2비트 구간에서 한 자리수 배로 뛴다. Q8_0 → Q3_K_M 사이에 평균 KL 이 94배 커지지만 절대값은 여전히 0.11 로 작다. 2비트에서는 0.34~1.15 로, 원본과 다른 단어를 1순위로 고르는 비율이 4건 중 1건을 넘는다.
| 변형 | 태그 형식 | 답변 의도 | 점수 라벨 | 사실대조 | 질문 풀 성공 | 코칭 한 줄 | 꼬리질문 지연 중앙값 |
|---|---|---|---|---|---|---|---|
| Q8_0 | 100% | 92.5% | 70.4% | 84.6% | 86.7% | 100% | 3.47s |
| Q6_K | 100% | 92.5% | 70.4% | 84.6% | 80.0% | 100% | 3.13s |
| Q5_K_M | 100% | 95.0% | 70.4% | 84.6% | 86.7% | 100% | 3.02s |
| Q4_K_M | 100% | 97.5% | 70.4% | 88.5% | 93.3% | 93.3% | 3.38s |
| Q3_K_M | 100% | 92.5% | 70.4% | 84.6% | 86.7% | 93.3% | 3.17s |
| UD-Q2_K_XL | 76.9% | 89.7% | 50.0% | 40.0% | 100% | 93.3% | 3.23s |
| koimat-Q2_K | 97.5% | 87.5% | 66.7% | 38.5% | 93.3% | 53.3% | 3.37s |
| direct-Q2_K | 95.0% | 67.5% | 51.9% | 34.6% | 33.3% | 0% | 3.76s |
| requant-Q4toQ2_K | 90.0% | 65.0% | 48.1% | 76.9% | 0% | 81.8% | 5.61s |
| koimat-IQ2_XXS | 40.0% | 62.5% | 11.1% | 57.7% | 26.7% | 33.3% | 10.41s |
8비트에서 3비트까지 모든 지표가 사실상 평평하다. 점수 라벨 정확도는 70.4% 로 다섯 조건이 완전히 같고, 태그 형식은 전부 100%, 의도 분류는 92.5~97.5% 안에서 오르내린다. 이 변동은 케이스 40건 기준 한두 건 차이라 비트 폭의 효과로 보기 어렵다. 반면 2비트로 내려가면 구조 자체가 깨진다. 질문 풀은 정해진 JSON 형식을 지켜야 하는데, 재양자화본은 15건 전부 실패했고 보정 없는 2비트는 근거 인용의 5.9% 만 실제 자료에서 왔다.
| 모델·변형 | 태그 형식 | 답변 의도 | 점수 라벨 | 사실대조 | 질문 풀 성공 | 꼬리질문 지연 중앙값 |
|---|---|---|---|---|---|---|
| E4B Q8_0 | 100% | 97.5% | 88.9% | 96.2% | 100% | 3.51s |
| E4B Q6_K | 100% | 97.5% | 88.9% | 96.2% | 100% | 3.24s |
| E4B Q5_K_M | 100% | 97.5% | 88.9% | 96.2% | 100% | 2.81s |
| E4B Q4_K_M | 100% | 100% | 88.9% | 96.2% | 100% | 2.72s |
| E4B Q3_K_M | 100% | 92.5% | 88.9% | 100% | 100% | 3.07s |
| 26B-A4B UD-IQ3_S | 100% | 95.0% | 96.3% | 96.3% | 100% | 8.44s |
| 26B-A4B UD-IQ2_M | 100% | 92.5% | 96.3% | 96.2% | 100% | 7.98s |
E4B 도 8비트에서 3비트까지 평평하다. 26B-A4B 는 3비트와 2비트 사이에서도 무너지지 않는다. 점수 라벨이 96.3% 로 같고 의도 분류만 95.0% 대 92.5% 로 한 건 차이다. 4B 가 2비트에서 완전히 붕괴한 것과 대비된다. 파라미터가 많을수록 낮은 비트를 견딘다는 기존 관찰이 한국어 면접 과제에서도 확인된 것이며, 실무적으로는 같은 메모리 예산에서 큰 모델을 더 강하게 줄이는 선택이 두 배로 유리하다는 뜻이다. 다만 26B 는 이 GPU 에서 전문가 계층을 CPU 로 내보내야 하므로 지연이 8초대로 고정된다. 26B 조건은 이틀에 걸쳐 두 번 독립적으로 돌렸는데 점수 라벨 96.3%, 지연 중앙값 7.98초와 8.00초로 거의 같은 값이 나왔다(사실대조만 96.2% 대 94.2%). 케이스 70건·반복 1회 설계의 측정 잡음이 이 정도 범위임을 보여준다. 주목할 점은 26B 를 2비트로 줄인 쪽이 4B 를 8비트로 쓰는 쪽보다 모든 품질 지표에서 낫다는 것이다(점수 라벨 96.3% 대 88.9%, 카테고리 적합 100% 대 86.7%). 파일 크기는 10.0 GB 대 8.2 GB 로 비슷하다. 다만 지연은 2.3배로 늘어난다.
케이스가 과제당 40건(점수 라벨은 채점 대상 27건)이므로 비율 지표의 신뢰구간은 넓다. Wilson 95% 구간으로 보면 이렇다.
| 조건 | 답변 의도 (n=40) | 점수 라벨 (n=27) |
|---|---|---|
| Qwen3 4B Q8_0 | 92.5% [80.1, 97.4] | 70.4% [51.5, 84.1] |
| Qwen3 4B Q4_K_M | 97.5% [87.1, 99.6] | 70.4% [51.5, 84.1] |
| Qwen3 4B Q3_K_M | 92.5% [80.1, 97.4] | 70.4% [51.5, 84.1] |
| Qwen3 4B 보정 Q2 | 87.5% [73.9, 94.5] | 66.7% [47.8, 81.4] |
| Qwen3 4B 무보정 Q2 | 67.5% [52.0, 79.9] | 51.9% [34.0, 69.3] |
| Gemma E4B Q8_0 | 97.5% [87.1, 99.6] | 88.9% [71.9, 96.1] |
| Gemma E4B Q3_K_M | 92.5% [80.1, 97.4] | 88.9% [71.9, 96.1] |
| Gemma 26B IQ3_S | 95.0% [83.5, 98.6] | 96.3% [81.7, 99.3] |
| Gemma 26B IQ2_M | 92.5% [80.1, 97.4] | 96.3% [81.7, 99.3] |
이 표가 확실히 말하는 것은 무보정 2비트가 8비트보다 나쁘다는 것뿐이다(구간이 겹치지 않는다). 8비트와 3비트 사이의 1~2건 차이는 구간이 거의 완전히 겹쳐 구분되지 않는다. 즉 "3비트까지 지표가 같다"는 주장은 이 표만으로는 "같다"가 아니라 "다름을 보이지 못했다"에 머문다. 7-1절의 동등성 검정이 이 간극을 메운다.
Qwen3 4B 10종에 대해 평균 KL 과 각 지표의 순위 상관(스피어만 ρ)을 구했다.
| 지표 | ρ |
|---|---|
| 태그 형식 준수 | −0.90 |
| 점수 라벨 정확도 | −0.93 |
| 코칭 한 줄 규칙 | −0.88 |
| 답변 의도 정확도 | −0.84 |
| 질문 풀 근거 충실 | −0.77 |
| 사실대조 규칙 | −0.68 |
상관은 강하지만 선형이 아니라 문턱에 가깝다. 평균 KL 이 0.12 이하인 다섯 조건에서는 태그 준수가 모두 100%, 점수 라벨이 모두 70.4% 로 붙어 있고, 0.34 를 넘는 순간 태그 4097.5%, 점수 라벨 1167% 로 흩어진다. 즉 원본과의 분포 차이는 "안전한가"를 가르는 문턱 지표로 쓸 수 있고, 안전 구간 안에서 순위를 매기는 데는 쓸 수 없다.
실무 기준으로 옮기면 이렇게 읽힌다.
| 평균 KL | 1순위 일치 | 판단 |
|---|---|---|
| < 0.12 | > 84% | 구조화 출력·규칙 준수 유지 |
| 0.3 ~ 0.4 | ~75% | 형식은 대체로 유지, 채점·사실대조 붕괴 시작 |
| > 0.7 | < 62% | 질문 풀 JSON 실패, 반복 폭주 |
파일 크기가 1.55 GiB 로 동일한 2비트 3종의 대조가 이 연구에서 가장 실용적인 결과다.
| 만드는 방법 | 평균 KL | 1순위 일치 | 의도 | 질문 풀 성공 | 근거 충실 |
|---|---|---|---|---|---|
| 한국어 보정 행렬 사용 | 0.337 | 74.7% | 87.5% | 93.3% | 95.4% |
| 보정 없음 | 0.739 | 61.1% | 67.5% | 33.3% | 5.9% |
| Q4 에서 재양자화 | 0.776 | 60.9% | 65.0% | 0% | — |
- 한국어 보정 행렬은 2비트에서 원본과의 차이를 절반 이하로 줄인다 (0.739 → 0.337). 같은 크기에서 질문 풀 성공률이 33% 에서 93% 로 올랐다. 보정 텍스트는 74 KB, 제작 시간은 CPU 로 수십 분이면 된다.
- 직접 만든 한국어 보정본은 배포사의 상용 2비트본(UD-Q2_K_XL, 1.58 GiB)과 사실상 같은 수준(0.337 대 0.349)이며 파일은 26 MB 더 작다. 배포사가 한국어로 보정하지 않았음을 감안하면, 한국어 서비스는 자체 보정으로 상용본을 따라잡을 수 있다.
- 원본 없이 이미 줄어든 파일을 다시 줄이면 가장 나쁘다. 재양자화본은 보정 없는 직접 양자화보다도 KL 이 5% 더 크고, 질문 풀은 15건 전부 실패했다. 손실이 두 번 누적되기 때문이다. 앞선 라운드에서 Kanana 2 30B 를 Q4 에서 Q2 로 재양자화했을 때 출력이 깨진 것과 같은 현상이며, 이번에는 그 원인을 수치로 확인했다.
- 2비트 아래(IQ2_XXS, 2.48 비트)는 보정을 해도 회복되지 않는다. 태그 준수 40%, 코칭 성공 20%, 지연 10.4초로 서비스 불가다.
| 조건 | 결과 | 원인 |
|---|---|---|
| Gemma 26B UD-Q3_K_M | 실행 불가 | 12.7 GB 가중치를 6 GB VRAM + CPU 오프로드로 올리려다 연산 버퍼(633 MB) 할당 실패, 3회 재시도 후 포기 |
| Qwen3 4B F16 | 실행 불가 | 8.05 GB 가중치가 6 GB VRAM 을 넘어 CUDA 초기화 실패, 3회 재시도 후 포기 |
| Gemma E4B Q4_K_M, 26B IQ3_S | 컨테이너 즉시 종료 | 양자화 디렉터리 밖을 가리키는 심볼릭 링크가 컨테이너 안에서 끊김. 하드링크로 교체 후 재실행 |
| Qwen3 4B Q8_0·Q6_K | 1차 실패 → 재시도 성공 | 컨테이너 생성 직후 간헐적 CUDA 초기화 실패 |
심볼릭 링크 문제는 하드링크로 바꿔 해결했고 해당 조건을 모두 다시 돌렸다. F16 만 하드웨어 제약으로 영구 결측이다.
세 번째 항목은 이 서버에서 반복 관측된 현상이다(6.4절 운영 교훈). 조건마다 재시도 루프를 두지 않으면 실패가 조용히 결측으로 남는다.
- 4B 급 모델에서 8비트를 쓸 이유가 없다. 3비트까지 과제 지표가 변하지 않고 파일은 절반이 된다. 6 GB GPU 에서 4B 를 3비트로 올리면 남는 메모리를 문맥 길이와 병렬 슬롯에 쓸 수 있다.
- 한계선은 3비트와 2비트 사이에 있다. 이 경계는 모델 크기가 아니라 구조화 출력 요구와 맞물린다. 태그·JSON 형식을 요구하는 과제가 먼저 깨지고, 자유 서술인 코칭이 늦게 깨진다.
- 저비트를 꼭 써야 한다면 원본에서, 한국어로 보정해서 만들어야 한다. 이미 줄어든 파일을 다시 줄이는 선택은 가장 나쁘다.
- 같은 메모리라면 큰 모델을 강하게 줄이는 쪽이 낫다. 26B 를 2비트로 쓴 결과가 4B 8비트보다 품질이 높았고, 26B 는 3비트와 2비트 사이에서도 품질이 유지됐다. 저비트 손상이 모델 크기에 따라 다르게 나타난다는 뜻이다. 다만 이 서버에서는 지연이 8초로 늘어 대화형 면접에는 쓸 수 없고, MoE 구조라 CPU 오프로드에 의존한다.
- 분포 차이 지표는 사전 선별에 쓴다. 후보를 전부 과제 평가에 올리기 전에 KL 로 걸러내면 비용을 줄일 수 있다. 단 안전 구간 안의 미세한 순위는 판정자 평가로만 가려진다.
규칙 지표가 8비트와 3비트를 구분하지 못했기 때문에, 같은 출력을 블라인드로 채점해 확인했다. 후보 6종(Qwen3 4B 의 Q8_0·Q5_K_M·Q4_K_M·Q3_K_M, Gemma E4B 의 Q8_0·Q3_K_M)을 익명 라벨로 섞어 3계열 판정자(Google·Anthropic·OpenAI)가 순서를 바꿔 두 번 채점하는 설계였다.
게이트웨이 채점 크레딧이 도중에 소진되어 40케이스 중 12케이스만 완전 판정됐다. 아래는 그 12케이스의 예비 결과이며, 같은 계열 판정자를 제외한 점수다(Gemma 후보에서 Google 판정자 제외).
| 후보 | 종합 (5점) | 95% 신뢰구간 |
|---|---|---|
| Gemma E4B Q8_0 | 3.56 | [3.17, 3.90] |
| Gemma E4B Q3_K_M | 3.06 | [2.62, 3.54] |
| Qwen3 4B Q5_K_M | 2.61 | [2.06, 3.21] |
| Qwen3 4B Q4_K_M | 2.42 | [1.83, 3.04] |
| Qwen3 4B Q3_K_M | 2.38 | [1.93, 2.85] |
| Qwen3 4B Q8_0 | 2.36 | [1.75, 2.99] |
- Qwen3 4B 는 비트 폭에 따른 차이가 보이지 않는다. Q8_0 대비 Q5·Q4·Q3 의 짝지은 차이가 모두 0.25 이하이고 부호도 일정하지 않다(Wilcoxon p = 0.31~0.61). 규칙 지표 결과와 같은 방향이다.
- Gemma E4B 는 8비트가 3비트보다 0.50점 높게 나왔다(p = 0.155). 케이스 12건으로는 유의하지 않지만, 규칙 지표가 완전히 같았던 두 조건 사이에 판정자만 감지한 차이라는 점에서 주목할 만하다. 40케이스 전체로 확인이 필요하다.
- 같은 계열 편향도 재현됐다. Google 판정자는 Gemma 후보에 다른 계열 판정자보다 높은 점수를 줬다(Q8_0 에서 전체 평균 3.64 대 계열 제외 3.56).
비유의(p > .05)는 "차이가 없다"의 근거가 되지 못한다. 차이가 실질적 경계 안에 있음을 보이는 동등성 검정(TOST)을 했다. 경계는 두 가지로 잡았다.
- 0.43점 — 이 데이터에서 측정한 판정자 같은 계열 편향의 크기. "판정자 자체의 잡음보다 작은 차이"라는 뜻이다.
- 1.0점 — 5점 척도에서 한 등급. "사람이 등급을 다르게 매길 만한 차이"라는 뜻이다.
| 비교 | 평균차 | 90% 신뢰구간 | 경계 1.0 | 경계 0.43 |
|---|---|---|---|---|
| Qwen3 4B 8비트 대 5비트 | −0.25 | [−0.76, +0.26] | 등가 (p = .012) | 판정 불가 |
| Qwen3 4B 8비트 대 4비트 | −0.06 | [−0.38, +0.27] | 등가 (p < .001) | 등가 (p = .032) |
| Qwen3 4B 8비트 대 3비트 | −0.01 | [−0.61, +0.58] | 등가 (p = .007) | 판정 불가 |
| Gemma E4B 8비트 대 3비트 | +0.50 | [−0.03, +1.03] | 판정 불가 (p = .060) | 판정 불가 |
읽는 법: Qwen3 4B 는 8비트에서 3비트까지 내려도 품질 차이가 한 등급 미만임이 통계적으로 확인됐다. 다만 "판정자 잡음보다도 작다"까지는 12케이스로 말할 수 없다. Gemma E4B 는 반대로 8비트 우위 가능성이 남아 있다.
필요 표본을 계산하면 이렇다.
| 비교 | 관측 표준편차 | 경계 0.43 확인에 필요 | 경계 1.0 확인에 필요 |
|---|---|---|---|
| Qwen3 4B 8 대 3비트 | 1.15 | 48케이스 | 9케이스 (충족) |
| Qwen3 4B 8 대 5비트 | 0.99 | 187케이스 | 11케이스 (충족) |
| Gemma E4B 8 대 3비트 | 1.03 | 불가 (관측차가 경계 초과) | 27케이스 |
계획했던 40케이스를 모두 채우면 Qwen3 의 3비트 동등성은 엄격한 경계(48케이스 필요)에 근접하고, Gemma 의 8비트 우위는 판정 가능(27케이스)해진다. 나머지 28케이스를 채우는 것이 이 절의 결론을 바꾼다.
남은 작업: 채점 크레딧을 다시 확보하면 같은 설계로 나머지 28케이스(163회 호출)를 이어 돌린다. 원자료는 quant/judge-pilot.jsonl, 도구는 stats.py 의 tost_paired.
- 판정자 평가가 12케이스에서 멈췄다(7-1절). 동등성 검정 기준 표본이 부족하다. 본 분석의 주 결론은 자동 규칙 지표에 근거하며, 같은 형식을 지키면서 질문의 깊이만 떨어지는 변화는 규칙으로 잡히지 않는다.
- 케이스는 과제당 15
40건, 반복 1회다. 12건 차이는 해석하지 않았다. - 분포 차이 측정은 Qwen3 4B 계열만 했다. Gemma 계열은 과제 지표로만 확인했다.
- 보정 텍스트가 이 프로젝트 문서에서 왔으므로, 평가 케이스와 주제가 겹칠 여지가 있다. 평가 텍스트는 분리했지만 도메인은 같다.
- 단일 GPU·단일 서빙 엔진(llama.cpp) 결과다. 다른 커널 구현에서는 저비트 손상 양상이 다를 수 있다.