Documents
Home>Documents>AI>Inference

양자화 방식별 throughput 실측: 배치 크기가 커질수록 W4A16이 W8A8에 역전되는 이유

13 min readAug 24, 2026Aug 24, 2026

"어떤 양자화가 빠른가?" — 이 질문에 조건 없이 답을 내놓는 벤치마크 글은 전제를 숨기고 있다. W4A16이 빠르다는 글은 decode 소배치를 전제했고, FP8이 낫다는 글은 대규모 prefill 환경을 상정했다. 같은 모델, 같은 GPU에서도 배치 크기 하나가 달라지면 어느 방식이 앞서는지 역전된다. 이 역전을 Arithmetic Intensity(연산 강도)로 설명한다.

연산 강도: decode와 prefill이 왜 반대 병목에 걸리는가

Arithmetic Intensity(AI)는 수행한 FLOPs를 이동시킨 바이트로 나눈 값이다.

AI = FLOPs / bytes_accessed

GPU는 연산 유닛(TFLOPS)과 메모리 대역폭(HBM GB/s) 중 먼저 포화되는 쪽에 묶인다. AI가 GPU의 ridge point(= peak TFLOPS ÷ peak BW)보다 낮으면 bandwidth-bound, 높으면 compute-bound다. H100 SXM의 ridge point는 약 295 FLOP/byte다.

Decode 단계(bs=1)에서 Transformer 선형 레이어는 가중치 행렬 전체를 HBM에서 읽되 각 가중치를 딱 한 번 사용한다. BF16 가중치 기준으로 AI ≈ 1 FLOP/byte, ridge의 0.3% 수준이다. 완전히 bandwidth에 묶여 있다.

Prefill은 정반대다. 시퀀스 길이 S의 입력을 처리할 때 같은 가중치를 S번 재사용하므로 AI ≈ 2S FLOP/byte다. S=2048이면 AI ≈ 4,096 — ridge를 14배 초과한다. 같은 모델, 같은 GPU인데 prefill은 compute-bound다.

배치 크기 B가 커지면 decode도 AI가 올라간다. 가중치를 한 번 읽어 B개 시퀀스에 재사용하기 때문이다. 선형 레이어 한 층 기준 공식은 단순하다:

AI(decode, bs=B) ≈ 2B / bytes_per_weight

이 식에 가중치 포맷별 bytes_per_weight와 ridge point(295)를 대입하면 compute-bound 전환 임계 배치 크기가 나온다.

W4A16: decode 소배치에서 강하고, 배치가 커지면 약해지는 이유

W4A16은 가중치를 INT4로 저장하고 GEMM 직전에 FP16으로 dequantize해 연산한다. 가중치당 바이트가 0.5 bytes로 줄고, 연산 자체는 FP16 Tensor Core에서 처리된다.

Bandwidth-bound 구간(decode 소배치)에서는 이 설계가 최적이다. 병목이 HBM에서 가중치를 읽는 속도인 상황에서 가중치를 4배 압축하면 읽는 시간이 그만큼 줄어든다. Dequantize 커널이 추가되지만 compute는 아직 병목이 아닌 구간이라 overhead가 숨겨진다. Lin et al. (AWQ, 2023) 기준으로 LLaMA2-7B에서 1.89×, LLaMA2-13B에서 2.41×, LLaMA3-8B에서 1.96× decode 가속이 나온다.

배치 크기가 커지면 상황이 달라진다. AI 공식에 bytes_per_weight = 0.5를 대입하면, H100 SXM에서 W4A16이 compute-bound로 전환되는 임계 배치 크기는 약 74다.

포맷bytes/weightcompute-bound 임계 bs (H100 SXM)
BF162.0~296
FP81.0~148
INT4 (W4A16)0.5~74

bs=74를 넘으면 W4A16도 compute-bound 구간에 진입한다. Dequantize 비용이 GEMM critical path 위로 올라오고, 가중치 압축으로 얻은 bandwidth 이득은 이미 실현됐지만 연산 가속은 없으므로 FP16 대비 이득이 빠르게 줄어든다.

Prefill(시퀀스 수백 이상)은 처음부터 compute-bound다. FP16 GEMM 앞에 dequantize 커널만 추가했을 뿐 GEMM 자체는 전혀 가속되지 않는다. 메모리가 남아돌고 연산이 병목인 구간에서 메모리를 아끼는 방식은 prefill 속도를 개선하지 않는다 — dequantize 오버헤드로 인해 BF16보다 느려질 수도 있다.

W8A8·FP8: prefill 대배치에서 역전이 일어나는 조건

W8A8(INT8)과 FP8은 가중치와 activation을 모두 낮은 정밀도로 줄이고, GEMM을 INT8 또는 FP8 Tensor Core에서 직접 실행한다. FP16으로 업캐스팅하는 단계가 없다.

Compute-bound 구간에서 이 방식이 유리한 이유는 두 가지다. 가중치 bytes가 절반으로 줄어 HBM 소비가 감소하고, INT8/FP8 Tensor Core는 같은 클럭에서 FP16 대비 2배 연산을 처리한다. Compute가 병목인 구간에서는 GEMM 자체가 빨라지므로 prefill에 직접 효과가 난다.

SqueezeBits의 실측(H100-PCIe, LLaMA-3.1-8B, vLLM v0.6.2, prefill-heavy 워크로드)에서 역전이 숫자로 나왔다:

max 배치 크기W4A16 (AWQ) vs FP16W8A8 vs FP16
1+80~100%+40%
256+10%+40%

소배치에서 W4A16이 두 배 가까이 앞서고, 대배치에서 W8A8이 역전한다. W8A8이 배치 크기와 무관하게 40% 이득을 유지하는 동안 W4A16의 이득은 10%로 줄어든다.

Decode-heavy 워크로드에서는 수치가 다르다. W8A8이 bs=1에서 FP16 대비 40%를 보이다가 bs=256에서 15~20%로 떨어진다. Attention 레이어가 FP16으로 남아 있고, 소배치 decode에서는 가중치 절약 폭(2×)이 W4A16(4×)보다 작아 bandwidth 이득이 덜하기 때문이다. Decode 전용 소배치 환경에서는 여전히 W4A16이 앞선다.

FP8은 H100에서 이 우위를 더 확장한다. FP8의 E4M3 포맷은 INT8보다 dynamic range가 넓어 activation outlier 처리가 쉽고, vLLM 공식 문서는 FP16 대비 최대 1.6× throughput 개선을 제시한다.

KV 캐시 양자화를 함께 쓸 때 생기는 순환 구조

W4A16을 쓰면 모델 파라미터 footprint가 BF16의 4분의 1로 줄어든다. LLaMA-3-8B 기준으로 BF16 약 16GB → W4A16 약 5GB다. 남은 VRAM으로 KV cache를 더 많이 수용하고 최대 배치 크기 상한을 올릴 수 있다.

여기에 KV cache를 FP8로 추가 양자화하면 배치 상한이 다시 올라간다. 문제는 배치 상한이 올라가면 실제 운용 배치도 커진다는 것이고, 더 큰 배치는 prefill을 더 깊이 compute-bound 구간으로 밀어 넣는다는 것이다.

W4A16 + KV FP8 조합으로 늘어난 배치 용량을 그대로 사용하면 prefill TTFT(Time To First Token)가 길어진다. Throughput은 올라가지만 tail latency가 악화되는 구조다. 메모리 절약이 배치 상한을 N% 올리더라도 prefill compute 병목이 심화되면 실제 throughput 증가 폭은 N%보다 작다.

이 조합이 실익이 있는 건 오프라인 배치 처리 환경이다. Latency SLA가 없고 throughput만 보면 되는 상황에서는 W4A16 + KV FP8이 단일 GPU에서 가장 많은 토큰을 뽑아내는 선택이 된다. 온라인 서빙에서 latency 예산이 타이트하다면 배치 상한을 올리더라도 실제 운용 배치 크기를 SLA 범위 안으로 제한해야 하고, 그 제약 안에서는 KV 양자화의 추가 이득이 작아진다.

vLLM에서 주요 조합을 구성하는 명령:

# W4A16 (AWQ) — decode 소배치 latency 최적
vllm serve meta-llama/Llama-3-8B-Instruct \
  --quantization awq

# W4A16 + KV cache FP8 — 메모리 한계 돌파, throughput 극대화
vllm serve meta-llama/Llama-3-8B-Instruct \
  --quantization awq \
  --kv-cache-dtype fp8_e5m2

# FP8 W8A8 — H100/RTX 4090 대배치 throughput
vllm serve meta-llama/Llama-3-8B-Instruct \
  --quantization fp8

하드웨어별 지원 현황과 실무 선택 기준

같은 FP8 설정이라도 GPU에 따라 native W8A8 computation과 weight-only fallback 사이에 성능 차이가 크게 난다.

H100 (Hopper, sm90) — FP8이 가장 큰 효과를 내는 GPU다. Transformer Engine이 내장되어 있고, FP8 Tensor Core 처리량은 약 3,958 TFLOPS — BF16의 두 배, A100 FP16의 6배다. FP8은 E4M3과 E5M2 두 포맷을 모두 지원하며, activation outlier가 많은 모델에서 INT8보다 정확도 손실이 적다.

A100 (Ampere, sm80)vLLM에서 FP8 W8A8 native 지원이 없다. FP8 모델을 로드하면 weight-only FP8(W8A16)으로 폴백하고 FP8 Marlin 커널로 실행된다. Activation은 FP16으로 남는다. A100에서 W8A8이 필요하면 INT8 SmoothQuant가 현실적인 선택이다. A100 INT8 Tensor Core는 FP16 대비 2×를 지원한다. Decode 소배치에서는 A100에서도 W4A16이 가장 좋은 선택이다.

RTX 4090 (Ada Lovelace, sm89) — Ada Lovelace도 FP8 Tensor Core를 갖고 있어 FP8 W8A8 native computation이 가능하다. 소비자 GPU 중 FP8 W8A8을 H100에 준하는 방식으로 활용할 수 있는 유일한 옵션이다. VRAM 24GB 제한이 크다. 70B급 모델은 W4A16 없이 단일 카드에 올라오지 않는다.

GPUFP8 W8A8INT8 W8A8W4A16 (AWQ/GPTQ)
H100NativeNativeNative
A100Weight-only fallbackNativeNative
RTX 4090Native (Ada FP8)Native
A10G (sm86)Weight-only fallbackNative

선택 순서는 GPU 먼저, 서빙 패턴 다음이다. GPU가 FP8 W8A8을 native로 지원하는지 확인하고, 실제 서빙 환경의 평균 동시 요청 수를 측정한다. H100 기준으로 bs=74 아래라면 W4A16, 그 위라면 FP8이 throughput 기준으로 앞선다. 이 임계값은 GPU 모델과 모델 파라미터 수에 따라 달라지므로, 직접 프로파일링해야 정확한 숫자가 나온다.

Tags
LLM 양자화W4A16W8A8FP8 추론Arithmetic IntensityInferenceGPU서빙vLLM양자화 latency