모델 양자화 (Model Quantization): 노트북에서 70B LLM 실행하기
요약
모델 양자화 기술을 통해 고사양 GPU 없이도 노트북 환경에서 70B 규모의 대형 언어 모델을 실행하는 방법을 설명합니다. 가중치의 정밀도를 낮추어 메모리 사용량을 획기적으로 줄이면서도 모델 성능을 유지하는 원리와 주요 기법을 다룹니다.
핵심 포인트
- 양자화는 가중치 정밀도를 낮춰 메모리 점유율을 줄이는 기술입니다.
- 4비트 양자화 시 70B 모델의 용량을 약 140GB에서 40GB로 절감 가능합니다.
- GPTQ, AWQ, GGUF 등 다양한 양자화 방식이 존재합니다.
- QLoRA를 활용하면 양자화된 모델의 미세 조정이 가능합니다.
- 비트 수를 줄이면 메모리는 절약되나 모델 품질 저하가 발생할 수 있습니다.
가장 유능한 언어 모델들은 수백 기가바이트를 차지하며, 이론적으로는 여러 개의 하이엔드 GPU가 장착된 서버를 요구합니다. 하지만 오늘날 여러분은 48GB RAM을 탑재한 노트북에서 700억 개의 파라미터(parameters)를 가진 모델을 실행할 수 있습니다. 이를 가능하게 하는 기술은 **모델 양자화 (Model Quantization)**라고 불리며, 최근 몇 년 동안 인공지능을 가장 많이 민주화한 기술 중 하나입니다.
이 가이드에서는 기초부터 시작하여 명확한 비유를 통해 양자화가 무엇인지, 어떻게 모델을 쓸모없게 만들지 않으면서 16비트 숫자를 4비트 숫자로 변환하는지, 그리고 몇 줄의 코드로 직접 어떻게 적용할 수 있는지 이해하게 될 것입니다.
TL;DR
- 양자화는 모델 가중치(weights)의 수치 정밀도를 16비트 (FP16)에서 8, 4 또는 심지어 2비트로 줄입니다.
- FP16 상태의 70B LLM은 약 140GB를 차지하지만, 4비트로 양자화하면 약 40GB로 줄어들어 단일 GPU나 48GB RAM을 가진 노트북에 들어갈 수 있습니다.
- 핵심 아이디어: 대부분의 가중치는 좋은 답변을 생성하는 데 그렇게 높은 정밀도가 필요하지 않습니다.
- 인기 있는 방법: GPTQ, AWQ, bitsandbytes (NF4) 및 CPU에서 실행하기 위한 llama.cpp의 GGUF 형식이 있습니다.
- QLoRA를 사용하면 단일 소비자용 GPU에서 4비트로 양자화된 모델을 미세 조정(fine-tuning)할 수도 있습니다.
- 비용은 품질 저하입니다: 대형 모델에서는 보통 미미하지만, 소형 모델에서는 더 눈에 띕니다.
- VRAM 실용 규칙: 가중치당 비트 수 ÷ 8 × 파라미터 수 ≈ 필요한 기가바이트.
모델 양자화란 무엇인가?
언어 모델은 **가중치 (weights)**라고 불리는 거대한 숫자 집합에 불과합니다. 80억 개의 파라미터를 가진 모델은 말 그대로 80억 개의 숫자를 가지고 있습니다. 각 가중치는 두 인공 뉴런 사이의 연결이 얼마나 강한지를 설명하며, 이들이 모여 모델이 훈련 과정에서 학습한 모든 것을 인코딩합니다.
기본적으로 이 숫자들은 매우 높은 정밀도로 저장됩니다. 즉, 16비트(FP16 또는 BF16 형식) 또는 심지어 32비트로 저장됩니다. **모델 양자화 (Model Quantization)**는 이와 동일한 가중치들을 더 적은 비트(일반적으로 8, 4, 또는 최대 2비트)로 표현하는 것을 의미하며, 이를 통해 모델 전체가 메모리에서 차지하는 공간을 훨씬 줄이고 더 빠르게 실행할 수 있게 합니다.
가장 좋은 비유는 사진입니다. 전문 카메라의 RAW 사진은 각 픽셀을 엄청난 색상 디테일로 저장하며 수십 메가바이트의 용량을 차지합니다. 만약 이를 JPG로 내보내면 파일 크기는 10분의 1로 줄어들며, 육안으로는 차이를 거의 느끼지 못합니다. 양자화는 AI 모델의 JPG와 같습니다. 훨씬 다루기 쉬운 파일로 만드는 대신, 눈(이 경우에는 사용자)이 거의 인지하지 못하는 정보를 버리는 것입니다.
💭 핵심: FP16으로 저장된 가중치는 수천 개의 서로 다른 값을 가질 수 있습니다. 4비트로 양자화하면 단 16개의 가능한 값($2^4$)만 가질 수 있습니다. 마법은 이 16개의 단계를 잘 선택하는 데 있습니다.
16비트에서 4비트로 전환하면 크기가 4배 줄어듭니다.
내부 작동 원리
메커니즘을 이해하려면 컴퓨터가 숫자를 저장하는 방식에 대해 빠르게 복습할 필요가 있습니다. FP16의 가중치는 부호, 정수부, 소수부를 포함하는 십진수를 표현하기 위해 16비트를 사용합니다. 이를 통해 0.03719와 같이 매우 미세한 값을 표현할 수 있습니다. 정수 양자화(예: INT8 또는 INT4)는 이 십진수를 작은 정수와 원래의 근사값을 재구성하기 위한 공식으로 대체합니다.
이 기술의 핵심은 각 가중치 그룹당 두 가지 파라미터, 즉 **스케일 (scale)**과 **제로 포인트 (zero-point)**에 기반합니다. 스케일은 각 정수 단계의 값이 얼마인지를 나타내며, 제로 포인트는 범위를 정렬합니다. 이들을 사용하면 가중치를 재구성하는 과정은 다음과 같이 간단합니다: 근사값 = 스케일 × (정수 - 제로_포인트). 모델은 작은 정수(4비트)를 저장하고, 계산 시점에 공식이 원래 값에 가까운 값을 복구합니다.
섬세한 단계는 스케일(scale)을 잘 선택하는 것입니다. 만약 가중치 블록 내에 거대한 이상치(outlier)가 있다면, 그것이 전체 스케일을 끌어올려 나머지 가중치들의 해상도(resolution)를 떨어뜨리게 됩니다. 그렇기 때문에 현대적인 방법들은 모든 것을 동일하게 양자화하지 않습니다. 진정으로 중요한 소수의 가중치 그룹을 식별하여 보호하는 동시에, 나머지 부분은 공격적으로 압축합니다. 이러한 비대칭성 덕분에 4비트 모델이 대부분의 테스트에서 원본 모델과 1~2점 차이 내로 유지될 수 있는 것입니다.
양자화에는 두 가지 주요 시점이 있습니다. **사후 양자화 (Post-Training Quantization, PTQ)**는 이미 학습이 완료된 모델에 적용되며, 때로는 실제 활성화(activation) 범위를 측정하기 위해 작은 보정(calibration) 데이터셋을 사용합니다. **양자화 인식 학습 (Quantization-Aware Training, QAT)**은 학습 과정 자체에서 정밀도 손실을 시뮬레이션하여, 모델이 그 손실과 함께 공존하는 법을 배우도록 합니다. LLM의 경우, 재학습 비용이 매우 막대하기 때문에 오늘날 가장 흔히 사용되는 방식은 PTQ입니다.
graph LR
A["FP16 가중치 (16비트)"] --> B["데이터를 통한 보정"]
B --> C["INT4로 양자화"]
...
실제 과정은 다이어그램에 표시된 흐름과 같습니다. 원본 가중치에서 시작하여 범위를 보정하고, 작은 정수로 압축한 뒤, 추론(inference)의 매 단계마다 이 정수들을 곱셈을 수행할 수 있도록 근사치 소수로 즉석에서 재구성합니다. 이 모든 과정은 투명하게 이루어집니다. 사용자는 단지 모델이 이제 자신의 그래픽 카드(GPU)에 들어간다는 사실만을 체감할 뿐입니다.
가장 많이 사용되는 방법 및 형식
모델 양자화 알고리즘은 여러 가지가 있으며, Hugging Face에서 가중치를 다운로드할 때 자주 마주치게 되므로 그 명칭들을 알아두는 것이 좋습니다.
- bitsandbytes (NF4) —
transformers라이브러리에서 직접 4비트 또는 8비트로 모델을 로드하는 가장 간단한 방법입니다. NF4 (NormalFloat 4)는 정규 분포를 가진 가중치를 위해 설계된 데이터 타입입니다. 입문용으로 이상적입니다. - GPTQ — 보정 데이터 (calibration data)를 사용하여 레이어별로 가중치를 훑으며 오차를 최소화하는 사후 양자화 (Post-Training Quantization) 방식입니다. 좋은 품질을 유지하며 4비트로 사용하는 데 매우 인기가 높습니다.
- AWQ (Activation-aware Weight Quantization) — 활성화 값 (activations)을 바탕으로 가장 중요한 가중치를 식별하고 이를 보존합니다. 일반적으로 품질 대비 크기 비율이 매우 뛰어나며 추론 속도가 빠릅니다.
- GGUF — 알고리즘이 아니라
llama.cpp에서 사용하는 파일 형식입니다. 양자화된 모델(Q4_K_M, Q5_K_M, Q8_0 등의 레벨)을 패키징하여 저사양 CPU 또는 GPU에서 효율적으로 실행할 수 있게 합니다. Ollama 및 LM Studio와 같은 도구의 기반이 되는 형식입니다.
💡 팁: 모델 이름이
Q4_K_M으로 끝나는 것을 본다면, 4는 비트 수를 나타내고, K는 개선된 블록 단위 양자화 스킴을 의미하며, M은 중간 크기 (medium)를 의미합니다. Q4_K_M은 일반적인 용도에서 크기와 품질 사이의 최적의 균형점(sweet spot)입니다.
각 방법은 크기, 속도, 품질 사이의 균형을 서로 다른 방식으로 맞춥니다.
실습 예제: 4비트로 모델 로드하기
코드로 얼마나 간단한지 살펴보겠습니다. Hugging Face의 transformers 라이브러리와 bitsandbytes를 사용하면, 소비자용 GPU에서 4비트로 양자화된 8B 모델을 로드하는 작업은 단 몇 줄로 가능합니다:
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
import torch
...
load_in_4bit=True 설정이 없다면, FP16 형식의 8B 모델은 약 16GB의 VRAM을 요구할 것입니다. 하지만 4비트를 사용하면 약 5-6GB로 줄어들어 중급형 그래픽 카드에서도 여유롭게 구동할 수 있습니다. bnb_4bit_use_double_quant 옵션을 사용하면 스케일 상수 (scale constants) 자체도 양자화하여 메모리를 조금 더 절약할 수 있습니다.
그렇다면 어떤 모델이든 메모리를 어떻게 추정할 수 있을까요? 다음과 같은 실용적인 규칙을 사용하면 됩니다: GB ≈ (가중치당 비트 수 / 8) × 파라미터 수. 4비트(4 bits)를 사용하는 70B 모델의 경우 (4 / 8) × 70 = 35 GB가 되며, 여기에 컨텍스트 캐시 (context cache)를 위한 약간의 오버헤드가 추가됩니다. 그래서 약 40 GB 정도가 필요하다고 말하는 것입니다.
실제 사용 사례 (Real-world use cases)
모델 양자화 (Model quantization)는 실험실용 트릭이 아닙니다. 이는 오늘날 존재하는 로컬 및 효율적인 AI 생태계의 상당 부분을 지탱하고 있습니다.
- 개인용 기기에서의 AI — Ollama, LM Studio 또는 llama.cpp와 같은 도구들은 GGUF에 의존하여, 사용자가 데이터를 클라우드로 보내지 않고도 강력한 모델을 실행할 수 있게 해줍니다. 이는 개인정보 보호와 오프라인 작업에 있어 핵심적인 요소입니다.
- 추론 비용 절감 — 프로덕션 환경에서 모델을 16비트 대신 8비트로 서빙하면 GPU당 요청 수를 두 배로 늘릴 수 있어, 컴퓨팅 비용을 절반으로 줄일 수 있습니다.
- QLoRA를 통한 접근성 높은 미세 조정 (Fine-tuning) — QLoRA 기술은 4비트로 양자화된 베이스 모델 (base model)과 학습 가능한 LoRA 어댑터 (adapters)를 결합하여, 클러스터 대신 단일 소비자용 GPU에서도 대규모 모델을 맞춤화할 수 있게 해줍니다.
- 엣지(Edge) AI — 양자화된 모델은 메모리와 에너지가 희소한 자원인 스마트폰, Raspberry Pi 및 마이크로컨트롤러 (microcontrollers)에서 실행됩니다.
마지막 지점은 업계의 커지는 관심사인 AI의 에너지 소비 문제와 연결됩니다. 비트 수가 적을수록 메모리와 프로세서 사이에서 이동하는 데이터가 줄어드는데, 데이터 이동은 바로 추론 (inference) 과정에서 에너지를 가장 많이 소비하는 부분입니다. 따라서 양자화는 실제로 AI를 더 지속 가능하게 만드는 가장 직접적인 수단 중 하나입니다.
장점과 단점
모든 압축 기술과 마찬가지로, 양자화는 트레이드오프 (trade-off)를 수반합니다. 무작정 적용하기 전에 이를 명확히 이해하는 것이 중요합니다.
장점: 메모리 사용량을 획기적으로 줄여줍니다 (16비트에서 4비트로 전환 시 최대 4배). 이동해야 할 데이터가 적어지므로 추론 (Inference) 속도가 빨라집니다. 연산 비용과 에너지 소비를 낮추며, 거대한 모델을 겸손한 사양의 하드웨어에서도 사용할 수 있게 함으로써 접근성을 민주화합니다.
단점: 항상 정밀도 (Precision) 손실이 발생합니다. 거대 모델 (30B, 70B 이상)에서는 대개 거의 감지할 수 없는 수준이지만, 작은 모델 (1B, 3B)에서는 추론 (Reasoning)이나 수학 작업에서 차이가 느껴질 수 있습니다. 또한, 품질은 방법론과 비트 수준에 크게 좌우됩니다. 주의 없이 2비트로 낮추면 모델 성능이 심각하게 저하될 수 있습니다.
⚠️ 주의: 이미 성능 한계에 도달한 작은 모델을 가볍게 양자화하지 마세요. 모델이 작을수록 정밀도를 잃을 여유가 적습니다. 프로덕션 (Production) 환경에 적용하기 전에, 반드시 본인의 작업에서 양자화된 버전을 테스트해 보세요.
일반적인 권장 사항은 명확합니다. 거대 모델의 경우 4비트 (Q4_K_M 또는 그에 상응하는 방식)는 품질 측면에서 거의 손실이 없습니다. 중간 크기 모델의 경우 5비트 또는 8비트가 더 여유를 제공합니다. 만약 작업이 매우 중요하고 정밀도에 민감하다면, 결정하기 전에 FP16 원본 모델과 비교해 보는 것이 좋습니다.
📖 Telegram 요약: 요약 보기
자주 묻는 질문 (FAQ)
양자화를 하면 모델이 멍청해지나요?
정확도가 약간 떨어지는 것이지, 멍청해지는 것은 아닙니다. 거대 모델의 경우 벤치마크에서 원본과 비교했을 때 보통 1~2점 정도의 차이만 나며, 대부분의 사용 사례에서는 감지할 수 없습니다. 다만, 매우 작은 모델에서는 까다로운 추론 작업 시 차이가 느껴질 수 있습니다.
4비트 양자화와 8비트 양자화의 차이는 무엇인가요?
8비트를 사용하면 모델이 FP16 대비 절반의 공간을 차지하며 품질 저하가 최소화됩니다. 4비트를 사용하면 4분의 1의 공간을 차지하지만 압축이 더 공격적입니다. 대부분의 거대 모델의 경우, 좋은 방법론 (GPTQ, AWQ, NF4)을 사용한 4비트가 가장 최적의 균형을 제공합니다.
양자화된 모델을 사용하려면 비싼 GPU가 필요한가요?
꼭 그렇지는 않습니다. llama.cpp를 통한 GGUF 형식은 일반 RAM을 사용하여 CPU에서 양자화된 모델을 실행할 수 있게 해주며, 속도는 더 느릴 수 있습니다. 8~24GB 정도의 소비자용 GPU만 있다면 7B에서 30B 규모의 모델을 문제없이 실행할 수 있습니다.
양자화된 모델을 단순히 사용하는 것 외에 학습도 가능한가요?
네, QLoRA와 같은 기술을 통해 가능합니다. 핵심 아이디어는 베이스 모델 (Base Model)을 4비트로 동결(frozen)한 상태로 유지하고, 그 위에 작은 어댑터 (LoRA)만을 학습시키는 것입니다. 이를 통해 단일 소비자용 GPU에서도 거대 모델을 미세 조정 (Fine-tuning)할 수 있습니다.
Q4_K_M 또는 Q8_0와 같은 접미사는 무엇을 의미하나요?
GGUF 형식의 양자화 수준을 나타냅니다. 숫자는 가중치 당 비트 (bits per weight)를 나타내고, K는 개선된 블록 방식 (block scheme)을 의미하며, 마지막 문자 (S, M, L)는 상대적인 크기를 나타냅니다. Q4_K_M은 균형 잡힌 성능 덕분에 일반적인 용도로 가장 권장되는 옵션입니다.
양자화가 컨텍스트 길이 (Context Length)에 영향을 미치나요?
직접적으로는 아닙니다. 양자화는 가중치 (Weights)를 양자화하는 것이지 컨텍스트를 양자화하는 것이 아니기 때문입니다. 하지만 메모리를 확보함으로써 키-값 캐시 (KV cache)를 위한 더 많은 공간을 만들어주며, 결과적으로 동일한 하드웨어에서 더 긴 컨텍스트 창 (Context Window)을 사용할 수 있게 해줍니다.
참고 문헌
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기