상태: 초안 (2026-10-27), FP8·GPTQ·AWQ 실측, GGUF·bitsandbytes 미실측. 8GB급 노트북 GPU(Ada 세대) 한 장, vLLM 0.31.0, Qwen3-Reranker-0.6B 로 2026-10-27 에 쟀습니다. 처음 측정 때는 미리 양자화된 체크포인트(AWQ·GPTQ)를 새로 받아야 해서 재지 않았고, 승인 뒤 3-1절에서 쟀습니다. KV 캐시 8비트의 용량 실측은 「토스 ML/AI Infra 준비」 14편에 있습니다. 2026-10-27 추가. 승인을 받아 vLLM 0.32.0 이미지와 Qwen3-0.6B, Qwen3-0.6B-GPTQ-Int8, Qwen3-4B-AWQ(모두 Apache-2.0, safetensors)를 받아 3-1절을 더했습니다. 앞의 0.31.0 수치는 그대로 두었습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」, 확인하지 못한 것은 「미확인」으로 표시합니다.
목차
- 1. 왜 빨라지는가
- 2. vLLM 의 양자화 지도
- 3. 직접 재 보기: 온라인 FP8
- 3-1. 2026-10-27 재측정: 대화 모델, 그리고 미리 양자화된 체크포인트
- 4. KV 캐시 8비트
- 5. 운영에서 가져갈 것
- 6. 확인하지 못한 것
- 참고
1. 왜 빨라지는가
디코드는 요청마다 토큰 하나를 만들기 위해 가중치 전체를 GPU 메모리에서 한 번 읽습니다. 0.6B 모델이면 bf16 로 1.2GB 가 걸음마다 오갑니다. 계산은 그에 비해 적어서, 걸음 시간은 대체로 「가중치 바이트 ÷ 메모리 대역폭」이 정합니다. 가중치를 8비트로 줄이면 읽을 바이트가 절반이 되어 걸음이 짧아집니다.
여기서 두 가지가 따라 나옵니다.
- 배치가 클수록 이득이 줄어듭니다. 한 걸음에 요청이 많아지면 가중치 읽기는 그대로인데 KV 읽기와 계산이 늘어, 걸음 시간에서 가중치가 차지하는 몫이 작아집니다.
- 활성값까지 8비트로 계산할 수 있으면(W8A8) 계산도 빨라집니다. FP8 텐서 코어가 있는 GPU(Ada, Hopper 이후)에서 가능합니다. 가중치만 줄이고 계산은 16비트로 하는 방식(W4A16, W8A16)은 메모리 읽기만 줄입니다.
2. vLLM 의 양자화 지도
| 방식 | 무엇을 줄이나 | 체크포인트 | 원리(논문) |
|---|---|---|---|
온라인 FP8(fp8_per_tensor, fp8_per_block) |
가중치·활성 8비트 | bf16 그대로, 띄울 때 변환 | FP8 형식(Micikevicius 외, 2022): E4M3·E5M2 |
| llm-compressor FP8 W8A8 | 가중치·활성 8비트 | 미리 변환 | 같은 형식, 보정 데이터로 척도 결정 |
| AWQ | 가중치 4비트 | 미리 변환 | 활성값이 큰 채널의 가중치를 보호(Lin 외, MLSys 2024) |
| GPTQ | 가중치 3·4비트 | 미리 변환 | 2차 정보로 오차를 보정하며 한 열씩 양자화(Frantar 외, ICLR 2023) |
| Marlin 커널 | GPTQ·AWQ·FP8·FP4 를 빠르게 | 위 형식 | 4비트 가중치와 16비트 활성의 곱셈 커널 |
| GGUF, bitsandbytes | 가중치 | 각 형식 | llama.cpp 형식, 읽어 들이며 양자화 |
KV 캐시 FP8(--kv-cache-dtype fp8) |
KV 저장 | 무관 | 같은 메모리에 토큰 두 배 |
공식 문서의 하드웨어 표를 보면 FP8 W8A8 은 Ada·Hopper 이상에서만, AWQ·GPTQ 는 Turing 이후 대부분에서 돕니다. 논문이 보고한 숫자는 조건이 서로 다릅니다. AWQ 는 4비트 가중치로 데스크톱·모바일 GPU 에서 Hugging Face FP16 구현보다 3배 넘게 빠르다고 했고, GPTQ 는 1,750억 매개변수 모델을 GPU 한 장에 올려 A100 에서 FP16 대비 약 3.25배, A6000 에서 4.5배를 보고했습니다(둘 다 초록 기준).
0.31.0 문서는 온라인 양자화의 방식으로 fp8_per_tensor, fp8_per_block, mxfp8, mxfp4 를 듭니다. MXFP8 의 W8A8 은 Blackwell(SM 100) 이상에서만 돌고, 그 밖의 GPU 는 가중치만 8비트인 경로로 내려갑니다.
3. 직접 재 보기: 온라인 FP8
방법
- 같은 bf16 체크포인트를 두 번 띄웠습니다. 한 번은 그대로, 한 번은
--quantization fp8. - 0.31.0 은 이 옵션에 경고를 냅니다. 「
--quantization fp8은 온라인 양자화에 대해 더 이상 권하지 않으니fp8_per_tensor를 쓰라.」 이름만 바뀌었고 동작은 같은 방식(텐서마다 척도 하나)입니다. 품질 비교는 새 이름으로 다시 띄운 서버에서 했습니다. - 부하는 2편과 같습니다(입력 256토큰, 출력 128토큰, 동시성마다 네 묶음 중 첫 묶음 예열).
- 출력 비교: 고정 프롬프트 열두 개(글을 그대로 베끼는 여섯 개, 무작위 단어를 이어 쓰는 여섯 개)를 탐욕 디코딩으로 128토큰 만들고 요청마다 출력의 해시를 비교했습니다.
- 품질 대리 지표: 직접 쓴 영어 글 네 편(합 338토큰)의 토큰별 로그 확률을 받아(
echo+logprobs) 퍼플렉서티를 냈습니다.
결과
| 항목 | bf16 | FP8(온라인) | 비 |
|---|---|---|---|
| 가중치 메모리(로그) | 1.12GiB | 0.71GiB | 0.63 |
| KV 자리 | 40,208토큰 | 42,080토큰 | 1.05 |
| 처리량, 동시 1 | 174.2 tok/s | 236.3 tok/s | 1.36 |
| 토큰 간격 중앙, 동시 1 | 5.6ms | 4.1ms | 0.73 |
| 처리량, 동시 16 | 1,683.1 tok/s | 2,085.8 tok/s | 1.24 |
| 처리량, 동시 64 | 2,899.3 tok/s | 3,143.3 tok/s | 1.08 |
| 탐욕 출력이 bf16 과 같은 요청 | 기준 | 12개 중 6개 | |
| 퍼플렉서티(글 네 편) | 36.03 | 36.46(+1.2%) |
- 가중치가 절반이 아니라 63% 가 된 까닭: 이 모델은 어휘 151,669 × 1,024 의 임베딩(약 0.3GB)이 출력층과 묶여 있고, 이 층과 정규화 층은 bf16 으로 남습니다. 작은 모델일수록 이 몫이 커서 양자화의 효과가 줄어듭니다.
- 처리량 이득은 배치가 클수록 줄었습니다(1.36 → 1.24 → 1.08배). 1절의 설명 그대로입니다. 혼자 쓸 때 토큰 간격이 5.6ms 에서 4.1ms 로 27% 짧아졌습니다.
- 출력은 달라집니다. 베끼는 프롬프트 여섯 개는 bf16 과 글자까지 같았고, 무작위 단어를 이어 쓰는 여섯 개는 모두 첫 몇 토큰부터 갈라졌습니다. 확률이 비슷한 후보가 여럿인 자리에서는 작은 수치 차이가 다른 토큰을 고르게 만듭니다. 이 차이가 과제 정확도에 주는 영향은 이번에 재지 않았습니다.
- 퍼플렉서티는 1.2% 올랐습니다(36.03 → 36.46). 네 편 중 두 편은 오히려 조금 내려갔고(54토큰 글 228.5 → 223.5, 55토큰 글 19.07 → 18.80), 가장 긴 190토큰 글에서 19.63 → 20.24 로 올랐습니다. 338토큰은 작은 표본이라, 1% 남짓의 차이는 「크게 나빠지지는 않았다」 정도로만 읽어야 합니다.
3-1. 2026-10-27 재측정: 대화 모델, 그리고 미리 양자화된 체크포인트
vLLM 0.32.0 공식 컨테이너에서 대화용 Qwen3-0.6B 를 기준으로 온라인 FP8 과 GPTQ 8비트판을 비교하고, 같은 GPU 에 4B 모델을 AWQ 4비트로 올려 봤습니다. 부하와 퍼플렉서티 방법은 앞과 같습니다.
| 모델·방식 | 가중치 메모리 | KV 자리 | 처리량 동시 1 | 동시 16 | 동시 64 | 퍼플렉서티 |
|---|---|---|---|---|---|---|
| Qwen3-0.6B bf16 | 1.12GiB | 38,224토큰 | 174.1 | 1,678.0 | 2,898.7 | 30.29 |
Qwen3-0.6B 온라인 FP8(fp8_per_tensor) |
0.71GiB | 42,080토큰 | 237.9(1.37배) | 2,094.5(1.25배) | 3,148.2(1.09배) | 29.88(-1.4%) |
| Qwen3-0.6B GPTQ 8비트(Marlin) | 0.74GiB | 42,048토큰 | 244.3(1.40배) | 2,023.0(1.21배) | 2,996.5(1.03배) | 30.78(+1.6%) |
| Qwen3-4B AWQ 4비트(Marlin) | 2.5GiB | 15,424토큰 | 80.0 | 651.9 | 736.4 | 21.02 |
처리량 단위는 tok/s 이고, 괄호는 bf16 대비입니다.
- GPTQ 8비트와 온라인 FP8 은 비슷했습니다. 혼자 쓸 때는 GPTQ 가 조금 빨랐고(244.3 대 237.9), 동시성이 높아질수록 FP8 이 앞섰습니다(동시 64 에서 3,148 대 2,997). GPTQ 는 가중치만 8비트이고 계산은 16비트(W8A16)인 반면, 이 GPU 의 FP8 은 활성값까지 8비트로 계산하기 때문으로 보입니다. 두 경우 모두 vLLM 은 로그에 Marlin 커널을 골랐다고 적었습니다(GPTQ).
- 미리 보정한 GPTQ 가 퍼플렉서티에서 앞서지는 않았습니다. 이 글 네 편에서 FP8 은 오히려 1.4% 낮았고 GPTQ 는 1.6% 높았습니다. 338토큰짜리 작은 표본이라 「둘 다 bf16 과 크게 다르지 않다」 정도로 읽어야 합니다. 4편과 5편의 추출·도구 호출 과제는 세 방식 모두 18/18, 36/36 으로 같았습니다.
- AWQ 4비트는 8GB 에 4B 를 넣어 줍니다. bf16 이면 가중치만 약 8GB 라 이 GPU 에 올라가지 않는 모델입니다. 대신 KV 자리가 15,424토큰으로 줄어 동시 64 에서는 첫 토큰 중앙값이 3.1초까지 늘었습니다(대기열). 퍼플렉서티는 0.6B 보다 낮았고(21.02), 4편의 추출 과제에서는 강제 없이도 18번 모두 울타리 없는 JSON 을 냈습니다. 작은 모델을 크게 돌릴지 큰 모델을 4비트로 돌릴지는 동시성과 품질 요구가 정합니다.
4. KV 캐시 8비트
--kv-cache-dtype fp8 은 가중치가 아니라 KV 를 8비트로 저장합니다. 같은 GPU 에서 1.7B 모델로 잰 이전 실측에서 KV 자리가 22,048토큰에서 41,920토큰으로 늘었고(토큰당 바이트가 정확히 절반), 긴 입력에서 KV 가 모자라 대기열이 생기던 지점이 뒤로 밀렸습니다(14편). 이번에는 같은 퍼플렉서티 시험과 탐욕 출력 비교만 더했습니다.
| 항목 | KV bf16(기본) | KV FP8 |
|---|---|---|
| KV 자리(로그) | 40,208토큰 | 69,920토큰(1.74배) |
| 퍼플렉서티(같은 글 네 편, 338토큰) | 36.03 | 36.50(+1.3%) |
| 탐욕 출력이 bf16 KV 와 같은 요청 | 기준 | 12개 중 5개 |
- KV 자리가 정확히 두 배가 아니라 1.74배인 것은 서버마다 KV 에 남는 메모리가 조금씩 달랐기 때문으로 보입니다(이 서버의 「KV 에 쓸 메모리」 줄은 기록하지 못해 미확인). 1.7B 로 잰 이전 실측에서는 토큰당 바이트가 정확히 절반이었습니다.
- 퍼플렉서티는 가중치 FP8 과 비슷하게 1.3% 올랐습니다.
- 탐욕 출력은 베끼는 프롬프트 여섯 개 중 다섯 개가 bf16 과 같았고, 하나는 「The scheduler is a class with a method schedule() that …」로 다른 글을 쓰기 시작했습니다. 가중치 FP8 에서는 베끼기 여섯 개가 모두 같았으니, 이 시험에서는 KV 쪽이 출력을 더 많이 바꿨습니다. 무작위 단어를 잇는 여섯 개는 모두 달라졌습니다.
5. 운영에서 가져갈 것
- 동시성이 낮은 대화형 서비스일수록 가중치 양자화의 체감이 큽니다. 동시 1 에서 1.36배였던 이득이 동시 64 에서는 1.08배였습니다. 큰 배치로 처리량을 뽑는 일괄 작업이라면 양자화보다 배치와 KV 용량이 먼저입니다.
- 양자화는 모델을 바꾸는 일입니다. 출력이 달라지므로, 켜기 전후로 자기 과제의 평가 세트를 돌려야 합니다. 퍼플렉서티는 빠른 1차 점검일 뿐입니다.
- 미리 양자화된 체크포인트를 받을 때는 출처와 형식을 봅니다. 파이썬 피클(
.bin,.pt) 가중치는 읽을 때 코드를 실행할 수 있으므로 safetensors 판을 고르고, 해시를 기록해 둡니다. - 판이 바뀌며 이름이 바뀝니다. 0.31.0 에서
--quantization fp8은 경고와 함께fp8_per_tensor로 옮겨 가는 중이고, 0.32.0 에는 체크포인트의 양자화 층을 다른 정밀도로 다시 양자화하는 기능이 들어왔습니다(미실측).
6. 확인하지 못한 것
- GGUF·bitsandbytes 는 체크포인트나 패키지를 새로 받아야 해서 미실측입니다. GPTQ 4비트, AWQ 와 같은 크기의 bf16 비교(4B bf16 은 이 GPU 에 안 들어감)도 미실측입니다.
- FP8 이 과제 정확도(질의응답, 코드 생성 등)에 주는 영향은 미실측입니다. 이번 모델은 재순위용이라 일반 평가가 의미가 없었습니다.
- 큰 모델에서의 이득(가중치 몫이 커서 이득이 더 클 것으로 예상)은 미실측입니다.
참고
- vLLM 문서, Quantization, Online Quantization, Quantized KV Cache(0.31.0·0.32.0): https://docs.vllm.ai/en/latest/features/quantization/
- Micikevicius 외, 「FP8 Formats for Deep Learning」, 2022. https://arxiv.org/abs/2209.05433
- Lin 외, 「AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration」, MLSys 2024. https://arxiv.org/abs/2306.00978
- Frantar 외, 「GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers」, ICLR 2023. https://arxiv.org/abs/2210.17323
- 이전 실측: 작은 모델로 vLLM 직접 재 보기