DeepSeek-V4-Flash-0731-UD: Q8_K_XL vs IQ3_XXS 벤치마크 보고서
요약
DeepSeek-V4-Flash-0731-UD 모델의 양자화 방식(Q8_K_XL vs IQ3_XXS)에 따른 성능 및 속도 벤치마크 결과입니다. 테스트 결과 IQ3_XXS가 속도와 효율성 면에서 우세하며, 특정 설정에서 더 안정적인 성능을 보였습니다.
핵심 포인트
- IQ3_XXS가 Q8_K_XL보다 디코딩 속도 약 2.2배 빠름
- IQ3_XXS + reasoning-budget 4096 조합이 가장 우수한 설정
- Q8 모델에서 추론 예산 과다 소모로 인한 빈 답변(empty answer) 발생 사례 확인
- 양자화 수준 차이에 따른 객관적 정확도 저하는 측정되지 않음
저는 이전에 DeepSeek V4 Flash UD Q8_K_XL이 IQ3_XXS와 비교했을 때 어떻게 작동하는지에 관한 질문을 올린 적이 있습니다.
제 시스템은 5090 + RTX 6000 Pro Blackwell + 96 GB 6000 mts DDR5입니다.
Harness로는 Hermes를 사용했습니다.
개인적으로는 Q8이 더 낫고 신뢰할 수 있다는 편견이 있었으며, 더 신뢰할 수 있는 결과를 얻을 수 있다면 오프로딩 (offloading)으로 인한 시간 낭비를 감수할 의향이 있었습니다.
참고: 이 벤치마크 테스트는 아마 결함이 있을 수 있습니다. 저는 여전히 배우는 중이므로 걸러서 들어주시길 바랍니다. 하지만 단순한 느낌(vibes)보다는 저에게 더 많은 정보를 제공해 주었으며, 여러분에게도 도움이 되기를 바랍니다. 또한 의도했던 추론 노력(reasoning effort) 높은 패스를 포함하는 것을 잊었습니다. 그렇긴 하지만, 이 테스트를 실행하는 데 6시간 정도 걸렸기 때문에 당분간은 다시 실행하지 않을 것입니다.
DeepSeek에게 결과를 요약하게 했습니다. 읽을 내용이 길지만, 상단의 TL;DR(요약)을 확인하세요:
벤치마크 보고서 — DeepSeek-V4-Flash-0731-UD: Q8_K_XL vs IQ3_XXS
실행: results/20260804_131203 (2026-08-04)
배터리 (Battery): 25개의 layer-1 작업 x 5회 반복 (4회 비시드 + 1회 시드, seed 42) x 6개 arm = 750개 요청,
여기에 10개의 샌드박스 에이전트 도구 사용 (agentic tool-use) 작업 x 6개 arm = 60개 세션. 실패한 요청 없음, 모든 출력 존재.
Arm (실험군)
| arm | 모델 | 추론 설정 (reasoning config) |
|---|---|---|
| a | Q8_K_XL (150.75 GiB, ~40 GB RAM-offloaded) | reasoning_effort:max, 제한 없음 |
| b | IQ3_XXS (전체 VRAM 사용) | reasoning_effort:max, 제한 없음 |
| c | IQ3_XXS | max + --reasoning-budget 4096 |
| d | Q8_K_XL | max + --reasoning-budget 4096 |
| e | Q8_K_XL | enable_thinking:false |
| f | IQ3_XXS | enable_thinking:false |
| 모든 arm: temp 1.0, top-p 0.95, min-p 0.0, ctx 384k, bf16 KV, max_tokens 8192 — 프로덕션 샘플링 (production sampling). |
TL;DR (요약)
이번 배터리 테스트에서는 IQ3_XXS가 승리했으며, IQ3_XXS + reasoning-budget 4096 조합이 전반적으로 가장 좋은 설정입니다.
더 작은 양자화 (quant) 모델에서 측정 가능한 품질 저하는 없었습니다. — Q8의 유일하게 중요한 실패 모드는 IQ3가 그렇게 심하게 겪지 않는 방식입니다: 즉, 8192-토큰 예산 전체를 추론에 소모하여 **빈 답변 (empty answer)**을 반환하는 것입니다.
구체적으로:
- IQ3의 디코딩(decode) 속도가 2.2배 더 빠름 (~66 vs ~30 t/s), 정상 상태(steady-state) 프리필(prefill) 속도는 약 2.4배 (~129 vs ~54 t/s), 작업당 실제 소요 시간(wall time)은 약 2.4배 더 낮음 (평균 23.4초 vs 56.7초).
- 정확도는 동일함: 15개 작업의 객관적 테스트 세트(objective battery) + 추론 함정(reasoning-trap) 작업에서 두 양자화(quant) 모델 모두 5/5 통과; 유일한 실패 사례는 빈 답변(empty-answer)으로 인한 잘림 현상임 (Q8은 125회 중 8회, IQ3는 125회 중 5회 발생).
- 추론 예산(reasoning budget)을 4096으로 설정하면 빈 답변 실패가 완전히 제거됨 (arms c/d에서 250회 중 0회 발생), 실제 소요 시간(wall time)을 추가로 약 30% 단축하며, 추론 체인 중간에 잘리는 경우를 포함하여 모든 작업에서 품질을 유지함 (pound_weight, hen_eggs, Simpson's paradox 시드 실행 결과 모두 정확성을 유지함).
- 추론을 비활성화하는 것(arms e/f)은 잘못된 해결책임: 함정 처리 능력이 저하되며 (IQ3-no-reasoning 모델이 car-wash 함정에 대해 5회 중 2회
전체 실행 평균(all-run means, 64/199)은 작업의 첫 번째 요청이 더 높은 prefill t/s(초당 토큰 수)를 보고하는 타이밍 아티팩트(timing artifact)로 인해 상승했습니다. 콜드 스타트(cold start, 전체 arm의 첫 번째 요청)는 그 반대입니다 — arm a에서 12.6 t/s를 기록했습니다. 디코드 분산(Decode variance)은 매우 작습니다: arm 내 표준편차(stdev)는 0.5-1.7 t/s이며, 따라서 2.2배의 격차는 구조적인 것입니다. 디코드 t/s 분포는 25개 모든 작업(Q8 27-32, IQ3 63-70)에 걸쳐 안정적이며, 작업 수준의 이상치(outliers)는 없습니다. 제한 없는(uncapped) 작업별 실제 소요 시간(wall time) 비교(a vs b) 중 주목할 만한 셀은 다음과 같습니다:
| 작업 | Q8 (s) | IQ3 (s) | 비고 |
|---|---|---|---|
| find_process (brevity) | 214.1 | 14.8 | Q8이 reasoning chars를 6.6배 더 소모함 |
| unicode_palindrome | 278.0 | 112.0 | 둘 다 대부분 잘림 |
| simpson_paradox | 215.3 | 96.2 | |
| penny_double | 172.1 | 47.4 | |
| pound_weight | 159.6 | 89.3 | |
| sermon_pipeline | 44.6 | 13.2 | |
| monty_hall | 35.7 | 23.1 | |
| hen_eggs | 51.1 | 78.5 | IQ3가 더 느린 유일한 작업 — 3.5배 과잉 사고(over-thinking) |
2.2배의 디코드 격차는 양자화 효율성(IQ3 vs Q8)과 오프로드 페널티(offload penalty, Q8이 약 40 GB를 시스템 RAM으로 넘김)가 혼합된 결과입니다. 이 테스트 세트로는 두 가지를 분리할 수 없습니다. 두 현상 모두 실제하며, 이 장비에서는 둘 다 IQ3에 유리하게 작용합니다.
2. 빈 답변 실패 (핵심 이슈)
reasoning_effort:max 및 max_tokens 8192 설정 시, 두 양자화 모델 모두 토큰 예산이 소진될 때까지 가끔 추론을 지속하여 답변 내용이 전혀 없는(zero answer content) 결과를 반환합니다. 제한에 걸린 모든 사례는 정확히 8192 토큰입니다.
| arm | completion ≥ 8190 실행 횟수 | 빈 답변 실행 횟수 |
|---|---|---|
| a Q8 uncapped | 8 / 125 | 8 / 125 |
| b IQ3 uncapped | 5 / 125 | 5 / 125 |
| c IQ3 budget | 0 / 125 | 0 / 125 |
| d Q8 budget | 0 / 125 | 0 / 125 |
| e/f no-reason | 0 / 125 | 0 / 125 |
빈 답변이 발생하는 지점:
-
unicode_palindrome: Q8은 5회 중 4회(시드 포함) 빈 답변, IQ3는 5회 중 3회 — "함수를 작성하라"는 작업이 60-80%의 확률로 아무것도 반환하지 않습니다.
-
simpson_paradox: Q8은 5회 중 2회(시드 포함), IQ3는 5회 중 1회.
-
Q8 추가 사항: find_process 시드 적용 시 (간결성 작업, 31.4k 추론 문자 생성 후 아무것도 반환하지 않음), pound_weight 1/5. IQ3 추가 사항: lru_cache 1/5.
결정론적 시드 경로(deterministic seeded path)에서, arm a는 25개 작업 중 22개만 답변했습니다; arm b는 25개 작업 중 25개를 모두 답변했습니다.
이는 실제 운영 환경에서 관찰되는 "4분 동안 생각만 하고 아무런 답변도 하지 않는" 실패 사례입니다. 예산 플래그(budget flag)
--reasoning-budget 4096 --reason-budget-message "OK, I've thought long enough. Let's answer."를 사용하면 — 두 양자화(quant) 모델 모두에서 — 이 문제가 완전히 해결되며, 강제 답변 전환(forced-answer transition) 시 해당 메시지가 답변 필드에 배치됩니다 (arm c의 mental_math 답변은 49 토큰인 반면, 제한이 없는 IQ3는 4 토큰입니다).
3. 품질 (Quality)
객관적 테스트 세트 (작업 1, 2, 11-25; === ANSWER ===에서 추출하여 정답과 대조): 모든 arm이 모든 작업에서 5/5 달성 — 산술(arithmetic), 배트와 공(bat-and-ball), strawberry_r (3), 소수 비교 (9.9), 몬티 홀 (Monty Hall, 전환 시 2/3), 양말 짝 (3), 기차 통행권 (equally close), 동전 연속 (50%), 페니 두 배 늘리기 (penny doubling), 남겨진 양 (9), 파운드 무게 (pound weight, troy), 목요일 (Thursday), 부동 소수점 덧셈 (float add, 0.30000000000000004), 5 빼기 (subtract-five, 1회), 시계 각도 (clock angle, 7.5), 암탉의 달걀 (hen-eggs, 2/3). 유일한 오답은 빈 답변(Q8 pound_weight 2회차 반복)뿐이었으며 — 틀린 숫자를 제시한 경우는 없었습니다.
추론 함정 (Reasoning traps) (작업 9, 10):
- car_wash: 모든 추론 arm이 25/25회 반복에서 drive라고 답변했습니다 (Q8, IQ3, 두 예산 설정 모두).
IQ3-no-reasoning(추론 없음)은 5회 중 2회 함정에 잘못 답변했습니다 ("walk" / "push it"); Q8-no-reasoning은 5회 모두 (1.2-1.6k 문자) 말을 흐렸지만(waffles) 결국 drive로 결론지었습니다. - phone_throw: 추론 없음 설정을 포함한 모든 arm에서 30/30회 반복 모두 no라고 답변했습니다.
제약 조건 작업 (Constraint tasks):
- speculative_decoding "정확히 3문장": 모든 arm에서 30/30회 실행 시 3/3문장을 지켰습니다.
- cuda_error_explain "한 단락": 모든 경우에서 2-4문장으로 작성되었습니다.
- sermon_pipeline "400단어 미만": 모든 arm에서 278-373단어로 작성되었습니다.
- find_process "5줄 이하": 추론 arm들은 이를 유지했습니다 (a: 4/5 + 빈 답변 1개, b/c/d: 5/5); 추론 없음 arm들은 이를 어겼습니다 (Q8: 3회 반복 중 7/11/12줄; IQ3: 2회 반복 중 6줄 및 7줄).
코드 작업 (팰린드롬 함수, thread-safe LRU): 두 양자화 (quant) 모델 모두 유니코드 인식 (Unicode-aware) 구현 (casefold + NFKC/NFKD + alnum 필터) 및 올바른 잠금 처리된 OrderedDict LRU를 생성합니다. 추론 기능이 없는 (No-reasoning) 모델들은 동일하게 정확하지만, LRU를 극도로 과하게 구현합니다 (11-11.5k 자: TTL, 데코레이터, dict-interface 포함). 이러한 과잉 복잡화의 특징이 숨겨진 추론 단계에서 실제 답변 단계로 이동한 것입니다.
4. 추론 동작: 누가 과하게 생각하는가?
작업당 추론 글자 수 (5회 반복 평균), 제한 없는 (uncapped) 모델:
| 작업 | Q8 | IQ3 | 비율 (Q3/Q8) |
|---|---|---|---|
| hen_eggs | 4,561 | 15,770 | 3.5x — Q3 과잉 추론 |
| pound_weight | 17,587 | 20,924 | 1.2x |
| monty_hall | 3,848 | 5,279 | 1.4x |
| lru_cache | 13,414 | 14,778 | 1.1x |
| find_process | 24,549 | 3,740 | 0.15x — Q8 과잉 추론 (6.6x) |
| train_pass | 1,060 | 458 | 0.4x |
| sermon_pipeline | 3,722 | 1,650 | 0.4x |
| speculative_decoding | 1,050 | 343 | 0.3x |
| penny_double | 16,099 | 9,390 | 0.6x |
| unicode_palindrome | 30,441 | 27,183 | 0.9x |
Q3는 7개 작업(hen_eggs, pound_weight, monty_hall, lru_cache, car_wash, phone_throw, bat_and_ball)에서 과잉 추론을 수행했습니다. Q8은 18개 작업에서 과잉 추론을 수행했으며, 총합적으로 Q8이 15% 더 많은 추론 글자 수를 사용했습니다 (740k vs 644k). Q8의 최악의 사례: find_process 반복 1회에서 pgrep -ax llama-server를 출력하기 위해 7,593 토큰의 추론을 수행했습니다 (IQ3: ps -C llama-server -o pid=,args=를 위해 1,367 토큰 사용 — 답변은 동일함).
Q3의 hen_eggs 과잉 추론에 따른 비용: 제한 없는 IQ3가 Q8보다 더 높은 실제 실행 시간 (wall time)을 기록한 유일한 작업이었으며 (78.5초 vs 51.1초), 완료 토큰(completion tokens)은 3.4배 더 많았습니다 — 그러면서도 정답은 맞혔습니다. 추론 예산 (reasoning budget)을 설정하면 정확히 이 케이스가 해결됩니다 (arm c: 51.0초, 정답).
5. 예산 적용 모델 (arm c/d)
-
시드 기반 경로 결정론 (Seeded-path determinism) 확인됨: 제한 없는 추론이 4096 토큰 미만인 모든 경우에서, arm c의 출력은 arm b의 출력과 바이트 단위로 일치합니다 (동일한 시드 42 사용). 따라서 b와 c의 차이는 순수하게 제한(cap) 유무에 따른 것입니다.
-
예산 삭감 (Budget cuts): 추론 문자 (reasoning chars) -32% (b 5,155 → c 3,522; a 5,923 → d 3,672), 완료 토큰 (completion tokens) -29%, 실제 시간 (wall time) -30% (23.4 → 16.4 s; 56.7 → 37.0 s).
-
시드 경로에서의 품질 (Quality on the seeded path): c는 Q8이 잘린(truncated) 세 가지 작업(unicode_palindrome, find_process, simpson)과 Q3가 사고 도중 끊긴(cut mid-thought) 두 가지 작업(pound_weight, hen_eggs)을 포함하여 25/25개를 정확히 답변했습니다.
-
에이전트적 특성 (Agentic): 예산 제한이 있는 arm들은 다른 arm들과 마찬가지로 10/10개를 통과했지만, arm c는 recursive_search를 과도하게 도구 호출(over-tool-called)하였고 (다른 모든 arm이 1-2회 호출할 때 9회 호출), build_report를 과도하게 작성했습니다 (4회 호출 대비 6회 호출). 강제 답변 전환(forced-answer transition)은 숨겨진 과잉 사고(over-thinking)를 가시적인 도구 스팸(tool-spam)으로 맞바꿀 수 있습니다. 각각 한 번의 사례이며, 단발성(single-shot), 저전력 상황입니다.
6. 에이전트 계층 (Agentic layer)
모든 6개 arm: 10/10 작업 통과 (secret hunt, csv sum, debug script, build report, mental math, log analysis, csv merge, json repair, version pick, recursive search).
| arm | wall s | tool calls | tokens in | tokens out |
|---|---|---|---|---|
| a Q8 uncapped | 16.0 | 3.3 | 2,607 | 345 |
| b IQ3 uncapped | 6.3 | 3.1 | 2,499 | 336 |
| c IQ3 budget | 7.0 | 3.8 | 2,733 | 391 |
| d Q8 budget | 16.0 | 3.2 | 2,601 | 356 |
| e Q8 no-reason | 15.1 | 3.3 | 2,731 | 319 |
| f IQ3 no-reason | 5.8 | 3.1 | 2,584 | 306 |
IQ3는 실제 시간(wall time) 기준으로 약 2.5배 더 빠르며 (디코딩(decode)과 동일한 비율), 도구 호출 횟수는 같거나 더 적고 출력량도 더 적습니다. 에이전트적 과잉 복잡성 가설(agentic over-complication hypothesis)은 여기서 재현되지 않습니다 (Q8의 build_report는 8회 도구 호출/32.7 s를 소요한 반면 IQ3는 4회/9.7 s를 소요했습니다; mental_math: IQ3는 4개 토큰/0.7 s 만에 10368이라고 답변한 반면 Q8은 27개 토큰/2.9 s가 걸렸습니다). 주의사항: arm당 10개의 단발성(single-shot) 작업은 다회차(multi-turn) 에이전트 동작을 판단하기에는 표본이 적습니다.
7. 권장 사항 (Recommendations)
Q8_K_XL이 아닌 IQ3_XXS를 서빙하십시오. 디코딩 속도는 2.2배, 실제 시간(wall time)은 약 2.4배 더 빠르며, 이 배터리 테스트가 측정할 수 있는 모든 축에서 동일한 품질을 보여줍니다. 또한 VRAM에 완전히 들어맞습니다 (40 GB RAM 스필(spill)이나 오프로드 지연(offload stalls)이 없음).
프로덕션 환경에서 --reasoning-budget 4096을 추가하십시오 (arm c 설정). 이를 통해 빈 답변 실패(empty-answer-failure, 제한 없는 양자화 모델 전체에서 발견된 유일한 실제 품질 결함 — 13건 발생)를 제거하고, 실제 소요 시간(wall time)을 30% 추가로 절약할 수 있으며, 이 35개 작업 중 어떤 것에서도 정확도를 해치지 않습니다. 만약 설정된 제한(cap)이 어려운 문제에 대해 너무 얕다고 판단될 경우, 제한을 제거하기보다는 8192로 높이십시오.
속도를 높이기 위해 사고(thinking) 과정을 비활성화하지 마십시오. arm e/f 설정은 사고 과정이 비활성화될 경우 함정 문제(trap tasks)와 간결성 제약(brevity constraints)이 가장 먼저 희생된다는 것을 보여주며, 속도 이득은 예산 설정(budget config)을 유지하면서 사고 품질을 보존할 때보다 약 2배 정도에 불과합니다.
예산 설정을 적용한 상태에서 max_tokens를 8192 이상으로 유지하십시오. 빈 답변을 생성했던 상호작용(제한 없는 사고 + 토큰 상한선)은 피해야 할 대상이지, 상한선(ceiling) 자체가 피해야 할 대상은 아닙니다.
8. 주의 사항 (Caveats)
- 처리량(throughput) 격차에서 양자화(Quant)와 오프로드(offload)가 혼재되어 있습니다. 동일한 양자화 모델을 사용하고 크기를 제어한 실행(예: 레이어를 CPU에 고정시킨 IQ3)을 통해 이를 분리할 수 있으나, 현재의 의사결정에는 필요하지 않습니다.
- 단일 턴(Single-turn) 원시 API(raw-API) 배터리 테스트 + 10
AI 자동 생성 콘텐츠
본 콘텐츠는 r/LocalLLaMA의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기