서론
최근 AI 모델의 발전으로 인해 대규모 언어 모델(LLM)이 다양한 산업과 응용 분야에서 활용되고 있습니다.
하지만 LLM은 고용량 GPU 메모리와 높은 연산 자원을 요구하며, 이러한 자원 소모는 실무 및 서비스에 적용할 때 큰 제약으로 작용합니다.
이 문제를 해결하기 위해 양자화(Quantization)는 중요한 해결책으로 주목받고 있습니다.
양자화는 모델의 성능 저하를 최소화하면서 메모리 사용량을 줄이고 추론 속도를 높이는 데 기여합니다.
본 글에서는 양자화가 모델 성능에 미치는 영향을 심층적으로 탐구하고, Bitsandbytes, AWQ, GPTQ의 세 가지 대표적인 양자화 기법을 비교 분석합니다.
모델 양자화란 무엇인가?
양자화는 모델의 파라미터를 고정밀도의 부동소수점(FP16 또는 FP32)에서 낮은 비트수로 변환하여 메모리 사용량을 줄이고, 연산 속도를 향상시키는 기술입니다.
주요 특징
- 모델 경량화: 파라미터를 저비트 정밀도로 변환해 메모리 사용량을 줄임.
- 추론 속도 개선: 연산 자원 부담이 감소하면서 실시간 응답 속도 향상.
- 대규모 batch size 처리 시 병렬 처리와 하드웨어 최적화를 통해 효율적인 추론 가능.
- 효율적 활용: 제한된 하드웨어 환경에서도 대규모 모델의 실행 가능.
이번 글에서는 세 가지 양자화 기법을 통해 LLM의 성능과 자원 효율성을 평가합니다.
Bitsandbytes
Bitsandbytes는 LLM을 8비트 및 4비트로 양자화할 수 있는 가장 간단한 방법 중 하나입니다.
주요 기법
- 8비트 양자화 (LLM.int8()):
- 모든 가중치를 INT8로 양자화
- 이상치(outlier) 감지 및 처리:
- 각 레이어에서 이상치를 식별
- 이상치는 FP16 정밀도로 유지
- 비이상치는 INT8로 양자화
- 추론 시 두 텐서를 결합하여 정확도 유지
- 4비트 양자화:
- 메모리 사용량을 4배 줄이면서도 QLoRA와 같은 기법과 병행해 성능을 유지
- 더블 양자화(Double Quantization) 기법 사용으로 추가 메모리 절감
코드 예제
4비트 양자화를 통해 메모리 사용량을 대폭 줄일 수 있습니다.
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(load_in_4bit=True)
model_4bit = AutoModelForCausalLM.from_pretrained(
"bigscience/bloom-1b7",
quantization_config=quantization_config
)
AWQ (Activation-aware Weight Quantization)
Activation-aware Weight Quantization (AWQ)는 활성화 패턴을 분석하여 모델 성능에 중요한 가중치를 식별하고 보존하는 양자화 기법입니다.
주요 특징
- 활성화 인식 스케일링:
- 각 레이어의 활성화 패턴을 분석
- 활성화 값이 큰 가중치를 식별하여 더 높은 정밀도로 보존
- 덜 중요한 가중치는 더 공격적으로 양자화
- 4비트 정밀도: 성능에 영향을 주는 핵심 가중치 보존
- 유연성: 다양한 하드웨어와 양자화 요구에 적합
- 메모리 효율성: 중요 가중치 선별적 보존으로 최적의 압축률 달성
코드 예제
아래는 autoawq를 사용한 양자화 예제입니다.
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
model_path = 'mistralai/Mistral-7B-Instruct-v0.2'
quant_path = 'mistral-instruct-v0.2-awq'
quant_config = {
"zero_point": True,
"q_group_size": 128,
"w_bit": 4,
"version": "GEMM"
}
model = AutoAWQForCausalLM.from_pretrained(
model_path,
low_cpu_mem_usage=True,
use_cache=False
)
tokenizer = AutoTokenizer.from_pretrained(model_path)
model.quantize(tokenizer, quant_config=quant_config)
model.save_quantized(quant_path)
tokenizer.save_pretrained(quant_path)
GPTQ (Gradient-Post-Training Quantization)
GPTQ는 각 가중치 행을 독립적으로 양자화해 오차를 최소화하고, 메모리 사용량을 약 4배 줄이는 기법입니다. 추론 시 실시간 복원을 통해 효율적인 연산을 지원합니다.
주요 특징
- 그래디언트 기반 양자화: 학습된 모델의 그래디언트 정보를 활용하여 최적의 양자화 지점 결정
- 행 단위 독립 양자화: 각 가중치 행렬을 독립적으로 처리하여 정확도 손실 최소화
코드 예제
아래는 GPTQ를 활용한 양자화 예제입니다.
from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig
model_id = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_id)
# 모델 로드
model = AutoModelForCausalLM.from_pretrained(model_id)
# GPTQ 설정
gptq_config = GPTQConfig(
bits=4,
dataset="c4",
tokenizer=tokenizer,
block_name_to_quantize="decoder.layers"
)
# 양자화 수행
quantized_model = model.quantize(gptq_config)
# 저장
quantized_model.save_pretrained("opt-125m-gptq")
tokenizer.save_pretrained("opt-125m-gptq")
각 양자화 기법은 고유한 장점을 가지고 있으며, 사용 사례와 요구사항에 따라 적절한 방법을 선택할 수 있습니다. Bitsandbytes는 구현이 간단하고 범용적이며, AWQ는 활성화 패턴을 고려한 지능적인 양자화를 제공하고, GPTQ는 그래디언트 정보를 활용한 정교한 양자화를 지원합니다.
성능 테스트
평가 모델
양자화 기법의 효과를 검증하기 위해 다음 모델을 선정했습니다.
Gemma2-9B
- google에서 2024년 6월 공개한 모델 - 다국어 이해력이 뛰어나며, 특히 한국어, 힌디어 등 비영어권 언어에서도 좋은 성능을 보임.
Qwen2.5-7B
- 알리바바 클라우드에서 개발한 모델로, Qwen 시리즈의 최신 버전 - 자연어 처리, 코딩, 수학 문제 해결 등 다양한 작업에서 우수한 성능을 보임
Llama3.1-8B
- Meta AI에서 개발한 모델.
- 이전 버전인 Llama2에 비해 다양한 벤치마크에서 향상된 성능을 보여줌
- 현재 Llama3.2 버전이 출시 되었지만 비슷한 크기의 파라미터를 가진 모델이 출시되지 않아 해당 모델로 테스트
데이터셋
1. MMLU
- MMLU는 다양한 언어적 작업에서 모델의 이해 능력을 평가할 수 있도록 설계된 대규모 벤치마크 데이터셋입니다. 역사, 수학, 과학, 사회학 등의 주제를 포함하여, 모델의 지식과 추론 능력을 종합적으로 테스트합니다.
- 평가 방법: 각 주제별 정답률을 측정해 모델의 다방면적 이해도를 평가합니다.
- 예시
2. KMMLU (Korean Massive Multitask Language Understanding)
- KMMLU는 MMLU의 한국어 버전으로, 한국어로 구성된 다양한 주제를 다루고 있어 한국어 모델 평가에 적합합니다. 한국어 기반 모델의 문맥 이해와 추론 능력을 평가할 수 있습니다.
- 평가 방법: 한국어로 된 질문의 정답률을 통해 모델의 한국어에 대한 성능을 정밀하게 측정합니다
- 예시
양자화 결과 분석
Gemma2-9B
양자화 기법 | MMLU | KMMLU | GPU 사용량 |
---|---|---|---|
기본 모델 | 72.4 | 57.58 | 18155MB |
Bitsandbytes | 71.1 | 56.55 | 6689MB |
AWQ | 71.6 | 56.71 | 6721MB |
GPTQ | 71.2 | 56.57 | 6737MB |
Gemma2-9B는 양자화 후에도 성능 저하가 미미하며, 효율성을 유지합니다.
Llama3.1-8B
양자화 기법 | MMLU | KMMLU | GPU 사용량 |
---|---|---|---|
기본 모델 | 68.0 | 45.82 | 15973MB |
Bitsandbytes | 62.3 | 41.98 | 6143MB |
AWQ | 66.1 | 42.27 | 5991MB |
GPTQ | 62.1 | 43.90 | 5995MB |
Llama3.1-8B는 성능 저하가 상대적으로 크며, 양자화의 실효성 검토가 필요합니다.
Qwen2.5-7B
양자화 기법 | MMLU | KMMLU | GPU 사용량 |
---|---|---|---|
기본 모델 | 74.1 | 55.54 | 15225MB |
Bitsandbytes | 72.5 | 53.97 | 5997MB |
AWQ | 73.4 | 54.08 | 5935MB |
GPTQ | 72.8 | 54.20 | 5935MB |
Qwen2.5-7B는 양자화 후에도 높은 성능을 유지하며, 효율성 면에서 우수합니다.
결론
본 테스트를 통해 양자화 기법이 GPU 메모리 사용량을 대폭 줄이면서도 성능 저하를 최소화하는 것을 확인했습니다.
Qwen2.5와 Gemma2 모델은 양자화에 가장 적합한 성능을 보이며, GPU 메모리 사용량 감소와 성능 유지 측면에서 우수한 효율성을 나타냈습니다.
반면, Llama3.1 모델은 양자화로 인해 상대적으로 큰 성능 저하를 보여, 모든 모델이 양자화에 적합하지 않을 수 있음을 시사합니다.
또한, 한국어 중심의 KMMLU 데이터셋에서는 모든 모델에서 성능 저하가 더 두드러지게 나타나, 한국어 성능을 향상시키기 위한 추가적인 연구와 최적화가 필요하다는 점도 확인되었습니다.
Reference
'딥러닝 > LLM' 카테고리의 다른 글
RoPE scaling for LLM (0) | 2024.11.03 |
---|---|
All you need to know about RAG (0) | 2024.10.09 |
RAG(Relevance-Augmented Generation): LLM의 한계를 넘는 새로운 접근 (0) | 2024.10.09 |
LLM을 활용한 지식 증류: sLLM 성능 최적화 실험 (3) | 2024.09.01 |
LLM의 양자화가 한국어에 미치는 영향 (0) | 2024.08.19 |