왜 로컬 LLM이 더 멍청하게 느껴지는가: 양자화 및 추론 백엔드의 영향
로컬 LLM의 성능이 공식 벤치마크와 차이가 나는 이유는 기본 모델의 지능 때문이 아니라, 구현 방식에 따른 누적된 위험 요소 때문인 경우가 많습니다. 어텐션 백엔드 선택, KV 캐시 양자화, 그리고 가중치 양자화 방법 등의 요인은 "token flips"—모델이 참조 구현과 다른 다음 토큰을 선택하는 현상—를 유발하여, 도구 호출(tool calling)과 같은 복잡한 작업에서 치명적인 실패를 초래할 수 있습니다.
추론 백엔드 발산
서로 다른 어텐션 백엔드는 동일한 모델 가중치에 대해 서로 다른 로짓(logits)을 생성할 수 있으며, 이는 prefill 단계에서 서로 다른 토큰 선택으로 이어집니다. RTX PRO 6000 Blackwell GPU에서 Qwen3.6-27B를 사용하여 진행한 실험에서, 세 가지 vLLM 어텐션 백엔드—FlashAttention 2, Flash Inference, 그리고 Triton Attention—를 100k 토큰의 실제 워크스트림으로 비교했습니다.
주요 결과는 다음과 같습니다:
- Bit-for-bit identity: 동일한 백엔드를 여러 번 실행하면 동일한 로짓이 생성됩니다. 즉, 발산은 무작위 노이즈가 아니라 커널 내의 특정 행렬 곱셈 및 덧셈 연산에 의해 발생합니다.
- Context-dependent divergence: 백엔드 간의 불일치(token flips)는 클러스터 형태로 나타나며, 컨텍스트 길이에 따라 선형적으로 증가하기보다는 프롬프트 내용에 따라 달라집니다.
- Precision trade-offs: 발산은 서로 다른 CUDA 커널이 GPU 제품군 및 SM 연산 능력에 따라 수학적 연산을 다르게 구현하기 때문에 발생합니다.
KV 캐시 양자화의 영향
KV(Key-Value) 캐시를 양자화하면 컨텍스트 길이가 길어질수록 모델의 지능이 크게 저하되며, 특히 긴 시퀀스에서 논리를 유지하는 모델의 능력에 영향을 미줍니다.
Qwen3.6-27B를 통한 테스트 결과, BF16(Brain Floating Point 16) KV 캐시는 안정적으로 유지되었으나, 양자화는 다음과 같은 치명적인 실패를 유발했습니다:
- INT8 KV Cache: 일부 도구 호출 오류를 복구할 수 있었으나 눈에 띄는 발산이 나타났습니다.
- INT4 KV Cache: 도구 호출을 올바르게 실행하는 데 완전히 실패했습니다. 이는 KV 캐시 양자화가 약 40k 토큰 이후 모델의 "IQ를 급격히 떨어뜨릴 수" 있음을 보여줍니다.
가중치 양자화 및 충실도
모든 양자화 방법이 동일한 것은 아닙니다. 가중치와 활성화 함수(activations)를 어떻게 압축하는지에 대한 선택은 복잡한 구문을 따르고 도구 호출을 완료하는 모델의 능력에 직접적인 영향을 미줍니다.
Qwen3.6-27B 변형 모델들에 대한 5방향 비교 테스트 결과는 다음과 같습니다:
| 양자화 방법 | 성능 관찰 결과 |
|---|---|
| BF16 Reference | 기준 충실도. |
| INT8 (W8A16) | 높은 충실도; 첫 번째 파티(first-party) FP8 및 NVIDIA의 FP4 릴리스보다 성능이 뛰어났습니다. |
| FP8 (W8A8) | 중간 충실도; 올바른 올바른 도구 호출을 완료할 수 있습니다. |
| AWQ (W4A16) | 낮은 충실도; 도구 호출을 완료하지 못하고 Cisco CLI 구문을 망쳤습니다. |
| NVFP4 | 가장 낮은 충실도; 88k 컨텍스트에서 약 ~50%의 token flips가 발생했으며 도구 호출에 실패했습니다. |
결정적으로, INT8 (W8A16) 변형은 BF16 활성화 함수를 사용하고 Gated DeltaNet (GDN) 프로젝션을 양자화하지 않았기 때문에 우수한 충실도를 보여주었습니다.
양자화 이외의 구현 위험 요소
커뮤니티의 통찰에 따르면, 로컬 모델의 인지된 "멍청함"은 모델 가중치보다는 설정 오류에 기인하는 경우가 많습니다:
- Chat Templates: 잘못된 채팅 템플릿(예: 모델이 특정 형식을 요구할 때 ChatML로 대체되는 경우)을 사용하면 성능이 크게 저하될 수 있습니다.
- Sampling Settings: 벤더가 권장하는 temperature와 top-p 설정을 무시하면 루프에 빠지거나 일관성 없는 출력이 나올 수 있습니다.
- Grammar Constraints:
llama.cpp와 같은 일부 러너는 토큰 생성 시 문법 제약 조건을 강제함으로써 양자화로 인한 도구 호출 실패를를 Mitigate 합니다.
"대부분의 경우 로컬 모델이 멍청하게 느껴지는 것은 양자화 때문이 아니라 채팅 템플릿 때문입니다. 많은 gguf mints가 메타데이터에서 템플릿을 누락시켜 런타임이 조용히 chatml로 대체하게 만듭니다."
로컬 추론을 위한 모범 사례 요약
로컬 LLM의 지능을 성능을 최대화하기 위해 사용자는 다음 설정을 우선시해야 합니다:
- KV 캐시 양자화를 피하십시오: 긴 컨텍스트 창에서 논리적 붕괴를 방지하기 위해 KV 캐시를 BF16으로 유지하십시오.
- 고비트 가중치 우선순위 지정: VRAM이 허용한다면 Q8 또는 BF16 가중치를 사용하십시오. 에이전트 작업(agentic tasks)을 위해 공격적인 4비트 양자화(예: NVFP4 또는 AWQ)를 피하십시오.
- 채팅 템플릿 확인: 런타임이 모델의 Hugging Face card에 명시된 정확한 템플릿을 사용하고 있는지 확인하십시오.
- 샘플링 설정 일치: 출력 루프를 방지하는 일반적인 실패 모드를 위한 권장 temperature와 top-p 값을 사용하십시오.
Sources
관련
- Dispatch
- Dispatch
- Dispatch
- Dispatch
- Dispatch