개념 딥다이브: 양자화

개념 딥다이브: 양자화 (Quantization)

대규모 언어 모델(LLM)에서 양자화가 어떤 역할을 하는지, 그리고 모델 메모리 요구 사항을 어떻게 추정하는지 함께 살펴보는 페이지예요.

출처: 문서

본문

Quantization은 대규모 언어 모델에서 아주 중요한 역할을 하는 과정이에요. 이 거대한 신경망들은 주로 weights 또는 파라미터라고 불리는 원시 값들로 구성돼 있어요. 파라미터 수가 많을수록 모델이 더 커지고, 더 많은 지식을 추출하고 유지할 수 있지만, 동시에 실행하는 데 필요한 리소스도 더 많아져요. 이런 대형 모델은 수백만 개에서 수십억 개에 이르는 파라미터를 가질 수 있답니다.

추론과 리소스 요구 사항 (Inference and Resource Requirements)

LLM을 실행하려고 할 때, 이를 Inference라고도 하는데, 필요한 계산을 수행하기 위해 모든 파라미터를 포함한 모델 전체를 메모리에 로드해야 해요. 이 요구 사항은 RAM/VRAM에 선형적으로 비례해서, 모델이 클수록 더 많은 메모리가 필요해져요.

양자화의 역할 (The Role of Quantization)

여기서 양자화가 등장해요. 모델의 지식과 의사 결정 능력을 저장하는 파라미터들은 특정 비트 수로 저장돼요. 예를 들어 우리가 오픈소스로 공개한 모델들은 보통 BF16으로, 16비트 정밀도로 저장돼요.

BF16에서 값이 저장되는 방식을 단순화해서 표현하면 이렇습니다:

Bit Position 15 14-7 6-0
Component sign exponent fraction

양자화의 목표는 모델 성능을 크게 떨어뜨리지 않으면서 각 파라미터(가중치)에 필요한 정밀도를 줄이는 거예요. 이게 항상 단순한 잘라내기(truncation) 과정은 아니에요. 정밀도를 줄일 때 발생하는 영향을 최소화하려는 다양한 양자화 방법이 존재해요.

모델 값을 평균적으로 더 적은 비트(예: 16비트, 8비트, 6비트, 4비트 또는 그보다 낮게)로 양자화하면, 디스크와 메모리에 모델을 더 효율적으로 저장할 수 있어요. 그 결과 모델에 더 쉽게 접근하고 리소스를 덜 소모하며 실행할 수 있게 돼요.

메모리 요구 사항 추정하기 (Estimate Memory Requirements)

메모리가 얼마나 필요한지, 그리고 어떻게 계산하는지 궁금할 수 있겠죠. 간단한 공식으로 추정할 수 있어요:

  • required_bytes = n_parameters * bytes_per_parameter

이 공식을 다양한 데이터 타입에 적용해서 우리 7.3B 모델을 비교해 볼게요!

Data Type Bytes Range N° Different Values Memory
FP32 4 -1.18e38 : 3.4e38 2^32 29.2 GB
FP16 2 -65k : 65k 2^16 14.6 GB
BF16 2 -3.39e38 : 3.39e38 2^16 14.6 GB
FP8 (E5M2) 1 -57k : 57k 256 7.3 GB
INT8 1 -128 : 127 256 7.3 GB
INT4 0.5 -8 : 7 16 3.65 GB

중요한 건, 이건 추론(inference)을 로드하는 데 필요한 메모리만 계산한 거고, 컨텍스트 크기(시퀀스 길이)와 계산량은 고려하지 않았다는 점이에요.

Mistral 모델 (Mistral Models)

앞의 공식을 그대로 사용해서, 각 모델의 데이터 타입별 대략적인 메모리 요구 사항을 계산해 볼게요.

Model Params BF16 FP8 INT4
Mistral 7B 7.3B 14.6 GB 7.3 GB 3.65 GB
Mathstral 7B 7.3B 14.6 GB 7.3 GB 3.65 GB
Codestral Mamba 7B 7.3B 14.6 GB 7.3 GB 3.65 GB
Mistral Nemo 12B 12.2B 24.4 GB 12.2 GB 6.1 GB
Mixtral 8x7B 46.7B 93.4 GB 46.7 GB 23.35 GB
Codestral 22B 22.2B 44.4 GB 22.2 GB 11.1 GB
Mixtral 8x22B 140.6B 281.2 GB 140.6 GB 70.3 GB
Mistral Large 2407 123B 246 GB 123 GB 61.5 GB

양자화 포맷 (Quantization Formats)

그 정밀도에서 추론에 최적화된 하드웨어 덕분에 BF16 또는 FP16으로 가중치를 공개하는 게 일반적인 관행이지만, 커뮤니티는 정밀도 손실이 아주 작거나 아예 없는 8비트를 선호해 왔어요. 그리고 Training with Quantization Awareness 같은 특별한 기법을 쓰면 FP8로 손실 없이 추론할 수도 있어요! Mistral Nemo 12B를 참고해 보세요.

앞서 언급했듯이 양자화는 종종 더 적은 비트에 맞추기 위한 단순한 잘라내기가 아니에요. 정말 다양한 포맷과 정밀도가 존재해요.

그중에는 이런 것들이 있어요:

  • Bits-and-bytes — 아주 빠르고 직관적인 양자화 접근 방식으로, 로드하면서 양자화해요. 다만 속도와 품질은 최적이 아니어서, 빠른 양자화와 모델 로딩에 유용해요.
  • GGUF (이전 GGML) — CPU와 Apple 기기에서 효율적으로 실행할 수 있어서 커뮤니티의 선호를 많이 받아요. GPU가 있으면 GPU로 오프로딩하기도 해요! 로컬 테스트와 배포에 좋은 선택이에요.
  • GPTQ — GGUF가 CPU에 집중한다면, GPTQ는 캘리브레이션 데이터셋으로 오류를 줄여 GPU 추론 성능에 초점을 맞춰요.
  • AWQ — 역시 GPU 지향적이에요. 가중치의 약 1%가 모델 정확도에 아주 크게 기여한다는 사실에 기반해요. 그래서 추론 중 활성화 분포를 분석하기 위해 데이터셋을 사용해 중요한 가중치를 식별하고, 이를 섬세하게 처리해야 해요.
  • EXL2 — GPTQ 최적화 방법에 기반한 더 최신 포맷인데, 혼합 양자화 레벨을 사용해요. GPTQ와 같거나 비슷한 비트레이트를 유지하면서 더 작은 오류로 평균 목표 비트레이트를 달성해요. VRAM 사용량은 약간 더 높을 수 있지만 추론 속도와 품질이 더 좋아요.

다른 포맷: HQQ, AQLM, EETQ, Marlin...

이 포맷들 중에서 가장 인기 있고 널리 쓰이는 정밀도는 4비트에서 8비트 사이예요. 8비트가 최고의 정확도를 보여주고, 6비트도 모델의 장점을 상당 부분 유지하면서 품질을 크게 해치지 않아요. 그리고 4비트 미만으로 내려가야 대부분의 모델에서 기능이 눈에 띄게 저하되는 아주 큰 영향이 나타나기 시작해요. 4비트보다 낮은 비트레이트의 모델도 여전히 사용 사례가 있지만, 모델·최적화 방법·포맷에 따라 품질 편차가 엄청 커질 수 있어요.

추론 엔진과 양자화 모델 (Inference & Quantized Models)

모든 추론 엔진이 모든 포맷을 지원하는 건 아니에요. 어떤 엔진은 특정 포맷에 고도로 특화·최적화되어 있고, 어떤 엔진은 모든 종류를 지원하도록 일반화하는 방향으로 만들어져요.

이런 엔진들을 살펴볼게요:

  • VLLM: 가장 오래되고 표준적인 엔진 중 하나로, GPTQ, AWQ, INT4, INT8, FP8을 지원해요.
  • Transformers: LLM 실행에 널리 쓰이는 라이브러리로, GPTQ, AWQ, bnb, EETQ, AQLM, torchao, HQQ, FP8 등 더 많은 포맷을 지원해요.
  • Exllamav2: 주로 GPTQ와 EXLV2 포맷용이에요.
  • Text Generation Inference: 대규모 언어 모델용 프로덕션 준비 추론·배포 라이브러리로, GPTQ, AWQ, bnb, EXL2, FP8, Marlin, Medusa (Faster Decoding) 등 더 많은 포맷을 지원해요.
  • llama.cpp/ollama: GGUF 추론에 좋은 선택지예요.
  • Aphrodite: 프로덕션용 대형 범용 엔진으로, AWQ, Bitsandbytes, EXL2, GGUF, GPTQ 등 많은 포맷을 지원해요.

더 알아보기 (Learn more)