본문 바로가기
Inference/Quantization

Quantization Formats (GGUF, GPTQ, AWQ, bitsandbytes)

by AteN 2026. 8. 9.

양자화 포맷 완전 정리, 같은 4비트라도 어디서 도느냐가 갈린다

요약

  • 양자화에는 두 개의 다른 층이 있습니다. 방법(얼마나 잘 줄이나)과 포맷(어떤 형식으로 저장하고 어디서 실행하나)입니다. 배포의 절반은 포맷 선택입니다.
  • 핵심 사실 하나. 런타임은 자기가 아는 포맷만 읽습니다. 같은 모델 같은 4비트라도 llama.cpp는 GGUF를, vLLM은 compressed-tensors를, transformers는 bitsandbytes를 기대합니다.
  • 그래서 "4비트로 잘 줄였다"만으로는 배포가 끝나지 않습니다. 그 4비트를 내 실행 엔진이 읽을 수 있는 포맷으로 담았는지가 남습니다.
  • 흔한 오해. QAT를 했다고 특별한 포맷이 되는 게 아닙니다. QAT로 만든 q4_0과 PTQ로 만든 q4_0포맷도 속도도 같고 품질만 다릅니다.
  • 포맷 안에 담기는 내용은 세 축으로 결정됩니다. 언제 누르나(PTQ/QAT), 무엇을 누르나(weight-only/weight+activation), 몇 비트인가입니다.
  • 실무 순서가 명확합니다. 런타임을 먼저 고정하면 포맷이 거의 자동으로 결정됩니다. 반대로 하면 호환 문제로 돌아옵니다.

1장. 방법과 포맷은 다른 층이다

1.1 왜 이 구분이 필요한가

양자화를 처음 접하면 GPTQ, AWQ, GGUF, bitsandbytes가 전부 한 바구니에 담긴 비슷한 것처럼 보입니다. 두 층으로 나눠 보면 배포가 명확해집니다.

방법 (method)
   가중치를 어떻게 잘 줄이나
   스케일을 어떻게 잡고, 사후에 누를지 학습하며 누를지
   outlier 를 어떻게 다룰지

   GPTQ, AWQ, QAT 가 여기 속한다
   목표는 품질. 같은 비트폭에서 얼마나 원본에 가까운가

포맷 (format)
   줄인 가중치를 어떤 형식으로 디스크에 저장하나
   값의 배열 방식 + 스케일과 스키마 같은 메타데이터

   GGUF, compressed-tensors, bitsandbytes 가 여기 속한다
   목표는 호환. 어떤 런타임이 이 파일을 읽나

1.2 런타임은 자기가 아는 포맷만 읽는다

이게 이 글 전체의 전제입니다.

같은 모델, 같은 4비트라도

   llama.cpp     GGUF 를 기대한다
   vLLM          compressed-tensors 나 AWQ 를 기대한다
   transformers  bitsandbytes 를 기대한다

   그래서 "4비트로 잘 줄였다"만으로는 배포가 끝나지 않는다

1.3 영상 코덱 비유

같은 영상(모델)을 MP4, MKV, MOV(포맷)로 저장하면
재생기(런타임)마다 열리고 안 열리는 게 갈린다

   화질(양자화 품질)과 컨테이너(포맷 호환)는 별개다
   화질이 아무리 좋아도
   재생기가 그 컨테이너를 모르면 재생이 안 된다

1.4 가장 흔한 오해

"QAT 를 했으니 특별한 포맷이겠지"
   아니다

   QAT 를 거쳐도 결과 포맷은 평범한 q4_0 일 수 있다
   그 q4_0 는 PTQ 로 만든 q4_0 과
   포맷도 같고 속도도 같다

   품질만 다르다

   방법이 좋아진 것이지 포맷이 달라진 게 아니다

2장. 포맷 안에는 무엇이 들어 있나

2.1 담기는 세 가지

양자화된 값들
   int4, int8, fp8, 4비트 float 등으로 눌린 실제 가중치

스케일과 영점 (zero-point)
   눌린 정수를 원래 실수 범위로 되돌릴 배율
   보통 블록(그룹) 단위로 하나씩 둔다

스키마
   "이 텐서는 가중치만 4비트(w4a16)" 처럼
   무엇을 몇 비트로 어떻게 눌렀는지의 명세

2.2 런타임이 하는 일

포맷이라는 그릇을 열고
스케일로 값을 복원한 뒤 계산한다

   그릇의 규격이 맞지 않으면, 즉 런타임이 모르는 포맷이면
   아예 열지 못한다

스케일이 함께 저장돼야 하는 이유가 여기 있습니다. 눌린 정수만 있으면 원래 값을 복원할 수 없습니다.


3장. 스키마를 읽는 세 축

포맷 안에 담기는 "양자화의 내용"은 세 축으로 결정됩니다. 이 셋을 알면 낯선 포맷 이름도 해석됩니다.

3.1 언제 누르나, PTQ와 QAT

PTQ (Post-Training Quantization)
   학습이 끝난 모델을 나중에 보정 데이터 조금으로 누른다
   싸다

QAT (Quantization-Aware Training)
   학습 단계에서 "이 값은 나중에 저비트로 눌릴 것"을 가정하고
   손실을 미리 흡수시킨다
   비싸지만 저비트 품질이 좋다

둘 다 같은 포맷으로 떨어질 수 있고, QAT의 이점은 속도가 아니라 품질입니다. 1.4에서 짚은 그 얘기입니다.

3.2 무엇을 누르나

weight-only (예: W4A16)
   가중치만 4비트, 활성은 16비트
   메모리와 decode 이득이 목표

weight + activation (예: W8A8, W4A4)
   활성까지 눌러 연산 이득을 노린다
   대신 활성값의 outlier 를 다루기가 까다롭다

3.3 몇 비트인가

int8, int4
fp8 (E4M3, E5M2)
MXFP4
2-bit
ternary (1.58비트)

   낮출수록 작고 빠르지만 품질 위험이 커진다

3.4 스키마 이름 읽기

w4a16   weight 4비트 / activation 16비트
w8a8    weight 8비트 / activation 8비트

   세 축을 압축한 표기다

3.5 왜 weight-only만으로도 빨라지나

직관에 반하는 부분이라 따로 봅니다.

토큰 생성(decode)은 대개
연산이 아니라 메모리 대역폭에 묶여 있다 (memory-bound)

   4비트 가중치는 읽어야 할 바이트가 1/4 이다
   메모리 이동이 줄어 빨라진다

   연산 자체가 빨라지는 게 아니다

여기서 따라오는 결론이 둘입니다.

① W4A16 만으로도 decode 가 눈에 띄게 빨라진다
② 연산량이 많은 prefill 이득은 작다

4장. 포맷별로 뜯어보기

4.1 한눈에

포맷 만든 곳 주 런타임 대표 비트폭 누구에게
GGUF (K-quant) ggml / llama.cpp llama.cpp, Ollama, LM Studio Q4_K_M, Q8_0 단일 파일, CPU와 Mac과 로컬
compressed-tensors Neural Magic vLLM + transformers int4/int8/fp8, w4a16, w8a8 safetensors 확장, 서버 추론
bitsandbytes bitsandbytes transformers 8-bit, 4-bit(NF4) 로딩 시 즉석 양자화, QLoRA
GPTQ / AWQ 연구 vLLM, transformers 주로 4-bit weight-only 고품질 PTQ
MXFP4 OCP / 하드웨어 transformers, vLLM 4-bit float 네이티브 저정밀 출고
MLX Apple mlx-lm int4/int8 등 Apple Silicon 로컬

4.2 GGUF

로컬 실행의 사실상 표준

   가중치, 메타데이터, 토크나이저까지 단일 파일에 담는다
   배포가 간편하다

   K-quant (Q4_K_M 등) 로
   품질과 크기 균형을 세밀하게 고른다

   CPU 와 Apple Silicon(Metal) 에서 특히 강하다

노트북과 데스크탑 로컬 추론의 첫 후보입니다.

4.3 compressed-tensors

safetensors 를 확장한 포맷

   w4a16, w8a8, fp8 등 3장의 세 축 조합을
   스키마로 명시해 담는다

   llm-compressor 도구로 생성한다

중요한 오해를 하나 짚습니다.

"vLLM 전용" 이 아니다

   개방 포맷이라 transformers 로도
   이미 양자화된 모델을 로드할 수 있다

   다만 현재 transformers 에선 로드만 되고
   눌러서 다시 저장하는 건 안 된다

   vLLM 은 "권장이자 최적 경로"일 뿐이다

4.4 bitsandbytes

앞의 둘과 결이 다릅니다.

미리 눌러 저장하는 게 아니라
로딩 시 즉석으로 8비트나 4비트(NF4)로 양자화한다

   QLoRA 계열의 저비트 파인튜닝이 이 위에서 돌아간다

   transformers 에서 "일단 4비트로 올려서 실험하고 학습"할 때
   가장 손이 덜 간다

"저장 포맷"이 아니라 "로딩 동작"에 가깝다는 점에서 다른 항목들과 층이 살짝 다릅니다.

4.5 GPTQ와 AWQ

엄밀히는 방법(PTQ 계열)이지만 배포 포맷과 붙어 다닌다

   둘 다 주로 4-bit weight-only 고품질 PTQ
   도구는 GPTQ 가 GPTQModel, AWQ 가 AutoAWQ

   AutoAWQ 는 최근 llm-compressor 로 흡수됐다

서버에서 고품질 4비트를 원할 때 흔히 씁니다.

4.6 MXFP4

블록 스케일을 쓰는 4비트 부동소수점 포맷
OCP 표준 계열, 하드웨어 지원 지향

   사후에 억지로 누르는 대신
   처음부터 이 저정밀로 출고되는 모델이 등장했다

"양자화한다"가 아니라 "저정밀로 태어난다"는 방향이라 성격이 다릅니다.

4.7 MLX

Apple 의 온디바이스 ML 프레임워크

   mlx-lm 으로 int4/int8 등 양자화 모델을
   Apple Silicon 에 최적화해 돌린다

   Mac 로컬에서 GGUF 의 대안으로 자리 잡았다

4.8 포맷과 런타임은 다대다다

"이 포맷은 이 런타임 전용" 이라는 1:1 대응이 아니다

   compressed-tensors 가 vLLM 과 transformers 양쪽에서 읽히듯
   한 포맷이 여러 런타임에 걸치고
   한 런타임이 여러 포맷을 읽는다

   4.1 표의 "주 런타임"은 권장이자 최적 경로로 읽어야 한다

5장. 한 모델을 여러 포맷으로 배포한 사례

5.1 왜 이 사례를 보나

추상적인 표보다 하나의 모델이 여러 포맷으로 동시에 배포된 실사례가 이 구조를 가장 잘 보여줍니다.

Google은 온디바이스용 소형 멀티모달 모델에 QAT를 적용한 뒤, 목표 런타임에 맞춰 여러 형태로 함께 풀었습니다.

5.2 네 가지 변형

변형 저장 포맷 런타임과 용도
-qat-q4_0-unquantized bf16 (QAT 소스) 아직 4비트로 안 누른 상태. 직접 양자화하거나 연구할 출발점
-qat-q4_0 GGUF 4비트 llama.cpp와 Ollama로 즉시 로컬 배포
mobile (transformers) wNa8o8 (일부 층 2비트 + 정적 활성) transformers로 온디바이스 로드
mobile (compressed-tensors) compressed-tensors (w4a16) vLLM 네이티브 최적 배포

5.3 읽는 법

접미사 = 포맷과 런타임 선택이다

mobile 은 더 공격적으로 눌러(일부 층 2비트) 폰에 맞춘 스키마다

   능력과 아키텍처는 네 변형이 전부 같다
   달라지는 건 "어떤 포맷으로 담아 어디서 돌리나"뿐이다

5.4 unquantized의 함정

"QAT면 이미 4비트 아니야?"가 가장 흔한 착각입니다.

unquantized 는 "4비트" 가 아니라 bf16 원본이다

   QAT 라는 학습만 끝냈을 뿐
   실제 4비트 압축은 안 한 상태다

   메모리 이득은 이 파일을 직접 q4_0 등으로 누른 뒤에 생긴다

1.4의 "QAT는 품질이지 포맷이 아니다"가 여기서 구체적으로 드러납니다.

5.5 검증 메모

Google 공식 블로그는
"GGUF 포맷은 llama.cpp 용으로, compressed-tensors 는 vLLM 용으로 제공된다"
고 명시한다

   compressed-tensors 변형이 존재한다는 사실 자체는 확실하다

   다만 리포지토리 접미사가 문자 그대로 -ct 인지는
   1차 출처에서 확인되지 않았다
   공식은 컬렉션명만 표기한다

2차 자료에서 "-ct = compressed-tensors"로 단정하는 걸 보면 이 구분을 기억할 필요가 있습니다.


6장. 무엇을 고르나

6.1 환경이 포맷을 결정한다

환경과 목표 권장 포맷과 런타임
로컬 CPU와 Mac, 단일 파일로 간편하게 GGUF + llama.cpp / Ollama
서버 GPU, 고 throughput 서빙 compressed-tensors / AWQ / GPTQ + vLLM
transformers에서 빠른 4-bit와 QLoRA 학습 bitsandbytes (NF4)
Apple Silicon 로컬 MLX
폰과 온디바이스, 더 작게 모바일 2-bit 스키마 또는 GGUF

6.2 함께 보는 지점

비트폭과 품질
   Q4_K_M 이 로컬 기본 균형점이다
   품질이 아쉬우면 Q5, Q6, Q8 로 올린다
   더 작게가 목표면 4비트 아래를 보되 품질 손실을 감수한다

weight-only 와 weight+activation
   메모리와 decode 속도만 필요하면 W4A16 으로 충분
   연산까지 줄이려면 W8A8 을 보지만 활성 outlier 처리가 필요하다

PTQ 로 부족하면 QAT
   같은 4비트에서 품질이 아쉬우면 방법을 QAT 로 올린다
   포맷은 그대로 두고 품질만 끌어올리는 선택이다

6.3 실무 순서

① 내 실행 엔진(런타임)이 무엇인가를 먼저 고정한다
   └──► 포맷 선택이 거의 결정된다

② 그 포맷 안에서 비트폭과 스키마를 고른다

③ 품질이 부족하면 방법을 올린다 (PTQ → QAT)

반대로 포맷부터 정하고 런타임을 끼워 맞추면 호환 문제로 돌아옵니다.

6.4 어디에 쓰이나

로컬과 온디바이스 추론
   GGUF + llama.cpp / Ollama / LM Studio
   또는 MLX (Mac)

서버 서빙
   vLLM + compressed-tensors / AWQ / GPTQ
   llm-compressor 로 포맷을 만들어 올린다

저비트 파인튜닝
   bitsandbytes(NF4) 위의 QLoRA 계열

네이티브 저정밀 출고
   MXFP4 처럼 애초에 저정밀로 배포된 모델을 그대로 받아 쓴다
   별도 양자화 단계 없이 바로 돌린다

7장. 정리

7.1 핵심 셋

① 양자화엔 방법(품질)과 포맷(호환)이라는 다른 두 층이 있다
   배포의 절반은 포맷 선택이다

② 런타임은 자기가 아는 포맷만 읽는다
   GGUF(로컬), compressed-tensors(vLLM), bitsandbytes(transformers 학습)

③ "4비트면 다 같다"는 오해다
   방법과 포맷과 비트폭은 독립된 축이라
   같은 q4_0 도 QAT 판과 PTQ 판은 품질만 다르다

7.2 용어 정리

용어 한 줄 뜻
포맷 / 직렬화 양자화 가중치를 디스크에 저장하는 형식과 메타데이터
런타임 모델을 실제로 실행하는 엔진
GGUF / K-quant llama.cpp의 단일 파일 포맷과 그 양자화 레벨
compressed-tensors safetensors를 확장한 양자화 포맷
bitsandbytes 로딩 시 즉석으로 8비트나 4비트로 양자화하는 라이브러리
GPTQ / AWQ 고품질 4비트 PTQ 방법
MXFP4 블록 스케일을 쓰는 4비트 부동소수점 포맷
MLX Apple Silicon용 ML 프레임워크
PTQ / QAT 사후 양자화 / 양자화 인지 학습
weight-only / W8A8 가중치만 저비트 / 가중치와 활성 둘 다 저비트
스케일과 영점 눌린 정수를 원래 실수 범위로 되돌리는 배율과 기준점
bpw 가중치 하나당 평균 비트 수. 포맷 크기의 척도
memory-bound 연산이 아니라 메모리 대역폭이 병목인 상태

7.3 참고자료

'Inference > Quantization' 카테고리의 다른 글

Quantization (양자화)  (0) 2025.02.13

댓글