Q8이 Q4보다 4.5배 느렸다 — 24GB에서 양자화를 올려봤다
이 포스팅은 쿠팡 파트너스 및 네이버 쇼핑 커넥트 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
양자화를 낮추면 품질이 떨어진다고들 합니다. 그래서 여유가 되면 Q8을 쓰라고 합니다.
24GB에서 그게 되는지, 되면 값어치를 하는지 재봤습니다.
같은 모델인지부터 확인했다
gemma4:26b(Q4_K_M)와 gemma4:26b-a4b-it-q8_0(Q8_0)이 정말 같은 모델인지 먼저 봤습니다.
$ curl -s localhost:11434/api/show -d '{"model":"gemma4:26b"}' | jq .model_info
"gemma4.block_count": 30,
"gemma4.embedding_length": 2816,
"gemma4.expert_count": 128,
"gemma4.expert_used_count": 8,
두 모델 모두 30층, 임베딩 2816, 전문가 128개 중 8개 사용으로 같았습니다. 파라미터도 25.8B로 같습니다. 양자화만 다릅니다.
디스크 크기는 17GB와 28GB입니다.
속도와 VRAM
RTX 3060 12GB 두 장, 합계 24GB입니다. 조건당 2회 반복했습니다.
| Q4_K_M | Q8_0 | |
|---|---|---|
| 생성 속도 | 74.34 tok/s | 16.57 tok/s |
| Q4 대비 | 100% | 22% |
| VRAM | 19,501 MiB | 22,285 MiB |
| 배치 | GPU 100% | 26% / 74% CPU/GPU |
Q8은 24GB에 다 들어가지 않았습니다. ollama ps 가 26%/74% CPU/GPU 로 표시했고, 속도는 Q4의 22%가 됐습니다.
이 퍼센트는 메모리 배치 비율이지 연산량이나 시간 비율이 아닙니다. 26%의 무엇이 내려갔는지(레이어인지 바이트인지)까지는 확인하지 않았습니다.
두 번 잰 값의 차이는 Q4가 0.08, Q8이 0.10 tok/s였습니다.
느려진 게 양자화 때문인가, 넘쳐서인가
둘이 섞여 있습니다. 갈라보려고 계산을 해봤습니다.
Q8_0은 파라미터당 약 1.06바이트입니다. 이 모델이 토큰당 읽는 활성 파라미터는 설정값에서 유도해 약 2.12B입니다. 레이어별 어텐션과 실제로 쓰는 전문가 8개의 FFN만 더한 값이고 임베딩·라우터·공유 가중치는 빼놨습니다.
곱하면 토큰당 약 2.25 GB를 읽는 셈이고, 카드 한 장 사양인 360 GB/s로 나누면 160 tok/s가 나옵니다. 두 장 구성인데 한 장 대역폭을 썼습니다. KV 캐시·PCIe 전송·런타임 오버헤드도 전부 뺐습니다. 신뢰할 만한 상한이 아니라 비교용 눈금입니다.
Q4에서 실측이 이론값의 26% 수준이었으니, Q8도 같은 비율이라면 전부 GPU에 올라갔을 때 40 tok/s 언저리가 됩니다. 다만 양자화가 바뀌면 커널도 메모리 접근 방식도 바뀌므로, 같은 26%를 적용할 근거는 없습니다.
실제 측정값은 16.6이었습니다.
여기서 멈추겠습니다. 74 → 40 → 16.6 처럼 원인별로 나눠 적고 싶었지만, 40이라는 값 자체가 추정입니다. 추정값을 사이에 끼워 넣고 앞뒤를 퍼센트로 쪼개면 실측으로 원인을 분해한 것처럼 보입니다. 그건 하지 않은 일입니다.
확인된 것은 74.34에서 16.57로 떨어졌다는 것뿐이고, 그 안에 양자화와 CPU 스필이 섞여 있습니다. 갈라내려면 Q8이 전부 GPU에 올라가는 카드에서 다시 재야 합니다.
정답률은 같았다
짧게 답할 수 있는 문제 25개를 냈습니다. temperature=0, 같은 시드입니다.
산술, 단위 변환, 프로그래밍 상식을 섞었습니다. 채점은 정답 문자열이 답에 들어 있는지로 했습니다.
채점한 그대로의 결과입니다.
| Q4_K_M | Q8_0 | |
|---|---|---|
| 정답 | 24 / 25 | 23 / 25 |
한 문항 차이입니다. 그 한 문항은 이랬습니다.
git에서 변경을 되돌리는 명령어 한 단어.
Q4는 revert, Q8은 reset을 먼저 댔습니다. 제가 정답을 revert로 잡아 뒀지만 질문 자체가 답을 하나로 좁히지 못합니다. 되돌리는 방법이 여럿이니까요.
비슷한 문제가 하나 더 있었습니다. “평균 O(n log n)인 정렬 알고리즘 하나”의 정답을 퀵정렬로 박아 뒀는데 두 모델 모두 병합정렬이라 답했습니다. 병합정렬도 맞습니다.
이 두 문항을 빼면 23문항에서 양쪽 다 23개를 맞습니다. 다만 이건 결과를 본 뒤에 뺀 것이라 사후 선택입니다. 주 결과는 위의 24/25 대 23/25이고, 23/23은 참고용입니다.
어느 쪽으로 보든 25문항으로는 품질 차이를 확인하지 못했습니다. 차이가 없다는 뜻이 아니라, 이 정도 문항 수로는 있는지 없는지 가릴 검정력이 없다는 뜻입니다.
대신 문장은 달라졌다
정답은 같았지만 답하는 문장은 자주 달랐습니다.
- 출력이 완전히 같았던 문항: 25개 중 16개
- 평균 문자열 유사도: 0.919 (파이썬
difflib.SequenceMatcher의ratio(), 공백·대소문자 정규화 없이 원문 그대로)
달랐던 예를 그대로 옮깁니다.
| 질문 | Q4_K_M | Q8_0 |
|---|---|---|
| 144의 제곱근은? | 12 |
12, -12 |
| 파이썬 리스트 길이 함수 | len() |
len |
| HTML 최대 제목 태그 | `<h1>` |
<h1> |
| 파이썬 주석 기호 | **#** (해시 기호)입니다. |
**#** 입니다. |
양자화는 답을 바꾸지 않았지만 표현은 바꿨습니다. 같은 시드에서도 그렇습니다.
그래서 24GB에서는
이 모델·이 시험에서는 Q8을 쓸 이유를 찾지 못했습니다. 4.5배 느려졌는데 정답이 나아지는 것을 확인하지 못했습니다. 장문 생성, 코드 작성, 긴 추론처럼 이번에 재지 않은 작업에서는 다를 수 있습니다.
Q8을 쓰려면 VRAM이 더 필요합니다. 28GB 모델이니 32GB 카드나 그 이상이 있어야 스필 없이 올라갑니다. 24GB에서는 선택지가 아닙니다.
품질이 걱정되면 양자화보다 모델 급을 올리는 쪽이 낫습니다. 같은 VRAM으로 한 단계 큰 모델을 Q4로 돌리는 편이, 작은 모델을 Q8로 돌리는 것보다 나을 가능성이 큽니다. 다만 이건 이번에 재지 않았습니다.
내 카드에 어떤 조합이 올라가는지는 매칭표에서 볼 수 있습니다. 조건을 바꿔 계산하려면 VRAM 계산기를 쓰십시오.
이 측정에 쓴 장비
- RTX 3060 12GB 계열 — 쿠팡에서 보기 · 네이버 380,000원
이 사이트의 모든 측정에 쓰는 카드입니다. 두 장을 꽂아 24GB로 씁니다.
측정 방법
- RTX 3060 12GB × 2 (합계 24 GiB), AMD Ryzen 7 5800X
- Ollama 0.20.0, KV 타입 f16,
num_ctx=8192 - 속도: 동일 프롬프트,
num_predict=200,temperature=0,seed=42, 조건당 2회, 매 회 언로드 후 재적재 - 품질:
POST /api/chat에think=false, 25문항,num_predict=48,temperature=0,seed=42 - 배치는
ollama ps, VRAM 은nvidia-smi두 장 합산 - 두 모델의 구조 동일 여부는
POST /api/show의model_info로 확인
think=false 를 쓴 이유가 있습니다. 이 모델은 생각 과정을 먼저 출력하는데, 처음에 /api/generate 로 재보니 200토큰을 전부 생각에 쓰고 본문이 비어 있었습니다. 속도 수치는 생성한 토큰 기준이라 그대로 유효하지만, 출력 비교는 이 설정으로 다시 했습니다.
한계
- 모델 하나, GPU 구성 하나입니다. 다른 모델이나 32GB 이상 카드에서는 결론이 달라집니다.
- Q8을 전부 GPU에 올려서 재지 못했습니다. 양자화 자체의 손실과 CPU 스필의 손실을 실측으로 분리하지 못했고, 40 tok/s 라는 값은 계산으로 얻은 추정입니다.
- 25문항은 적습니다. 검정력을 계산하지 않았고 신뢰구간도 없습니다. “차이가 없다”가 아니라 “차이를 확인하지 못했다”까지가 이 데이터로 할 수 있는 말입니다.
- 짧은 답을 요구하는 쉬운 문제였습니다. 긴 추론이나 코드 생성에서는 다를 수 있습니다.
- 채점 기준에 결함이 있었고, 두 문항을 결과를 본 뒤에 제외했습니다. 사후 선택이므로 23/23 결과는 주 결과가 아니라 참고값입니다.
- 완전일치가 아니었던 9문항이 표현 차이인지 의미 차이인지 분류하지 않았습니다. 눈으로 본 범위에서는 표현 차이였지만 기준을 세워 세어보지는 않았습니다.
- 출력 유사도 0.919는 문자열 기준이며 의미의 유사도가 아닙니다.
- 속도는 조건당 2회입니다. 반복 폭은 좁았지만 워밍업을 두지 않았고 실행 순서(Q4 먼저, Q8 나중)를 무작위화하지 않았습니다. 온도·클록도 기록하지 않았습니다.
- 두 장에 레이어가 어떻게 나뉘었는지, GPU별 사용량이 얼마인지 기록하지 않았습니다.
- 프롬프트 길이와 KV 캐시 사용량을 밝히지 않았습니다.
num_ctx=8192기준이며 다른 컨텍스트 길이에서는 적재 여부가 달라집니다. - 원본 데이터와 25문항 전체 응답은 저장소에 공개해 두었습니다. 다른 카드 결과를 알려주시면 출처를 밝히고 반영하겠습니다.