가중치를 W4A16으로 양자화하면 A100 80GB에 Llama-3-70B를 올릴 수 있다. 그런데 배치 크기를 키우거나 시퀀스가 길어지면 KV 캐시가 남은 메모리를 잠식하기 시작한다. 이때 KV 캐시까지 FP8이나 INT4로 내리면 배치를 더 넓힐 수 있다 — 그런데 정확도는 가중치 양자화 손실에 KV 캐시 양자화 손실을 단순히 더한 것만큼 나빠지는가, 아니면 더 나쁜 일이 생기는가.
직접 테스트해보면 조합에 따라 결과가 예상보다 크게 갈린다. W4A16 + KV FP8은 손실이 관리 가능한 수준이지만, W4A16 + KV INT4는 같은 모델에서 perplexity가 임계적으로 무너지는 경우가 있다. 그 이유는 두 오차가 독립적으로 더해지지 않기 때문이다.
메모리 압박의 이중 구조
가중치는 정적 메모리다. 모델을 로딩하면 고정된다. Llama-3-70B를 BF16으로 올리면 약 140GB, W4A16 AWQ로 양자화하면 약 37GB로 줄어든다. A100 80GB 단일 카드에 들어오는 수준이다.
문제는 그 다음이다. Llama-3-70B(80레이어, GQA 8 KV 헤드, 헤드 차원 128) 기준으로 배치 16, 시퀀스 8192에서 KV 캐시를 계산하면:
2(K,V) × 80(layer) × 8(KV head) × 128(dim) × 16(batch) × 8192(seq) × 2bytes(BF16)
= 약 40GB
양자화 후 남은 43GB를 KV 캐시가 그대로 채운다. KV FP8로 내리면 20GB, INT4로 내리면 10GB로 줄어들고 그만큼 배치 여유가 생긴다. 가중치를 아무리 INT4로 눌러도 긴 컨텍스트·대형 배치에서는 KV 캐시가 그 공간을 다시 채우므로, 메모리를 끝까지 쥐어짜려면 둘 다 내려야 한다.
오차가 어디서 만나는가 — Attention의 교차점
가중치 양자화 오차는 Q, K, V 프로젝션 행렬에 적용된다. INT4로 양자화된 가중치 행렬이 입력 은닉 벡터와 곱해지면서 프로젝션 출력 Q에 오차 εq_w가 섞인다. KV 캐시 양자화 오차는 K, V를 INT8이나 INT4로 압축해 저장하고 읽어들일 때 발생한다 — 여기서 K에 오차 εk가 추가된다.
두 오차가 만나는 지점이 Attention 스코어 계산이다:
score = softmax((Q + εq_w)(K + εk)^T / √d)
전개하면:
(Q + εq_w)(K + εk)^T = QK^T + Q·εk^T + εq_w·K^T + εq_w·εk^T
마지막 항 εq_w·εk^T이 교차 오차다. 두 오차가 각각 σ 크기를 갖는다면 이 항은 σ² 수준이고, 개별 오차 항(σ 수준)에 비해 작다. 그런데 소프트맥스의 지수 함수가 이를 비선형으로 증폭하고, 아웃라이어 채널이 두 오차에서 겹치는 경우엔 교차 오차가 특정 헤드의 Attention 분포를 완전히 틀어놓는다.
LLM.int8() 논문이 Transformer 레이어에서 아웃라이어 채널이 고정된 소수에 집중됨을 보였다. QServe의 SmoothAttention은 이 교차 오차가 실제로 작동한다는 사실을 간접 실증한다 — KV INT4 단독으로 발생한 perplexity 증가 0.14 중 0.05를 스케일 조정만으로 회복했는데, 이는 교차항 크기가 0이 아님을 의미한다.
조합별 perplexity 낙폭
아래 수치는 QServe와 WKVQuant 논문 결과를 기반으로 Llama 계열 7~8B 모델, WikiText-2 perplexity로 정리했다. 논문 간 세팅 차이가 있어 수치는 근사치다.
| 가중치 양자화 | KV 캐시 dtype | PPL (WikiText-2) | BF16 대비 낙폭 |
|---|---|---|---|
| BF16 (베이스라인) | BF16 | ~6.14 | — |
| W4A16 (AWQ) | BF16 | ~6.54 | +0.40 |
| W4A16 (AWQ) | KV FP8 | ~6.6 내외 | +0.5 내외 |
| W4A16 (AWQ) | KV INT8 | ~6.7 내외 | +0.55 내외 |
| W4A8 (QServe) + SmoothAttention | KV INT4 | ~6.82 내외 | +0.68 |
| W4A16 (AWQ) | KV INT4 | 7.1 이상 (고분산) | +0.96+ |
W4A16 + KV FP8은 가중치 오차 0.40에서 KV FP8 오차가 0.1 내외 추가되는 수준이다. W4A16 + KV INT4는 낙폭이 0.96을 넘고 모델·데이터셋 조합에 따라 크게 튄다. 값 자체보다 분산이 커지는 게 실제 문제다. 특정 조건에서 perplexity가 급격히 악화되는 임계 현상이 나타난다.
KIVI는 가중치를 BF16으로 유지한 채 KV 캐시를 2비트로 내렸을 때 perplexity 손실이 작다고 보고한다. 그런데 이 조건은 가중치가 BF16이다. W4A16 상태에서 KV INT4를 추가하면 교차 오차 조건이 달라지므로, KIVI 결과만 보고 W4A16 + KV INT4를 안전하다고 판단하면 안 된다.
어떤 레이어가 더 민감한가
KV 캐시 양자화 오차는 레이어 전반에 균일하게 분포하지 않는다. KVQuant와 KVSink 연구가 공통으로 가리키는 패턴은 두 가지다.
초반 레이어(레이어 0~3 내외)는 Attention Sink 현상으로 인해 첫 번째 토큰에 과도한 Attention 스코어가 몰린다. 이 첫 토큰의 K 벡터가 INT4로 양자화되면 오차가 Attention 분포 전체를 흔든다. KVSink는 Sink 토큰 K/V를 FP16으로 유지하는 것만으로 FP16 perplexity의 95% 이상을 회복한다고 보고한다.
후반 레이어는 오차 수정 기회가 없다는 점에서 민감하다. 레이어 출력이 곧바로 최종 예측에 반영되기 때문에 후반 레이어에서 Attention이 틀어지면 생성 토큰이 바뀐다. 중간 레이어들은 상대적으로 견고하다 — 오차가 다음 레이어에서 부분적으로 상쇄되는 여지가 있다.
이 분포가 mixed-precision KV 전략의 근거다. KVTuner는 레이어별 민감도를 프로파일링해 초반·후반 레이어에 FP8 또는 INT8을, 중간 레이어에 INT4를 할당한다. 균일 INT4 대비 같은 메모리 예산에서 perplexity가 눈에 띄게 개선된다.
가중치 양자화 오차도 레이어마다 다르게 분포한다. 두 오차의 민감 구간이 겹치는 초반·후반 레이어에서 교차항이 커질 확률이 높으므로, 복합 양자화를 쓴다면 그 구간의 KV 캐시 비트 수를 올려두는 게 안전하다.
실무 선택 기준
조합별 트레이드오프를 정리하면 다음과 같다.
| 조합 | PPL 낙폭(BF16 대비) | KV 메모리 절감 | 권장 여부 |
|---|---|---|---|
| W8A16 + KV FP8 | +0.07 내외 | ~50% | 안전 |
| W4A16 (AWQ) + KV FP8 | +0.5 내외 | ~50% | 안전 |
| W4A16 (AWQ) + KV INT8 | +0.55 내외 | ~50% | 조건부 안전 |
| W4A16 (AWQ) + KV INT4 | +0.96+ (고분산) | ~75% | 위험 — 반드시 측정 |
| W4A8 (QServe) + KV INT4 | +0.68 내외 | ~75% | SmoothAttention 필수 |
PPL 낙폭 0.7을 기준선으로 잡는 게 실무적이다. 이 값을 초과하면 MMLU 같은 downstream task에서 1~2% 이상 정확도 손실이 관측되기 시작하고, 코드 생성이나 복잡한 추론에서는 체감이 더 크다.
순서 논리가 있다. 메모리를 더 아끼고 싶을 때, KV 캐시 비트를 먼저 낮추는 것보다 가중치 양자화를 먼저 내리는 게 안전하다. 가중치를 W8 → W4로 낮출 때 오차는 프로젝션 행렬 내부에 국한된다. KV 캐시를 INT4로 낮추면 교차 오차가 Attention 전체 시퀀스에 걸쳐 퍼진다. 가중치를 먼저 내리고, KV 캐시는 FP8에서 멈추는 게 품질 대비 메모리 효율의 현실적인 균형점이다.
컨텍스트가 길수록 이 원칙이 더 중요해진다. 가중치 오차는 레이어 수에 비례해 쌓이고 시퀀스 길이에는 무관하다. KV 캐시 오차는 시퀀스가 길어질수록 오차 벡터 수가 늘어나므로 직접 누적된다. 32K 컨텍스트에서는 4K 대비 KV 캐시 오차가 비례적으로 커지기 때문에, 긴 시퀀스 환경일수록 KV 비트를 INT4 대신 FP8을 유지하는 쪽이 낫다.
vLLM에서 켜는 방법과 주의점
vLLM에서 가중치 양자화와 KV 캐시 양자화를 동시에 적용하는 기본 조합:
# W4A16 (AWQ) + KV FP8
vllm serve meta-llama/Llama-3-8B \
--quantization awq \
--kv-cache-dtype fp8_e4m3
# W4A16 (GPTQ) + KV FP8
vllm serve meta-llama/Llama-3-8B \
--quantization gptq \
--kv-cache-dtype fp8_e5m2
vLLM 문서는 --kv-cache-dtype-skip-layers 옵션으로 특정 레이어를 FP8 KV 캐시 대상에서 제외할 수 있다고 명시한다. 초반 Attention Sink 레이어나 슬라이딩 윈도우 어텐션 레이어를 제외하면 균일 FP8 대비 perplexity가 개선된다.
Flash Attention 3 백엔드와 FP8 KV 캐시를 함께 쓰면 Attention 연산 전체가 FP8 도메인에서 실행된다. 이 모드에서는 Q도 추가로 FP8 양자화되므로, 가중치를 이미 INT4로 내린 상태라면 오차 경로가 하나 늘어난다. vLLM 2026년 블로그는 선형 양자화 + KV 캐시 양자화 동시 적용으로 44% 누적 속도 향상이 가능하다고 밝히지만, 품질 민감 태스크에서는 캘리브레이션 스케일을 반드시 측정해야 한다.
AWQ + KV INT8 조합은 구버전 vLLM에서 명시적으로 미지원이었다. 현재 최신 버전에서는 지원 범위가 넓어졌지만, CUDA 버전·모델 아키텍처에 따라 런타임 오류가 나올 수 있다. 에러 메시지에 kv-cache-dtype과 quantization이 함께 등장하면 GitHub Issues를 먼저 검색하는 게 빠르다.
SGLang은 동일한 --quantization과 --kv-cache-dtype 인자를 지원하며, AWQ/GPTQ 형식 체크포인트를 자동 인식한다.