-
LLM 빠르게 추론하기 (1) - Quantization - 양자화 방법론과 원리 (PTQ, QWA, bitsandbytes, GPTQ, AWQ, SmoothQuant)AI/NLP 2025. 3. 23. 19:23728x90
LLM 빠르게 추론하기 (1) - Quantization - 양자화 방법론과 원리
(PTQ, QWA, bitsandbytes, GPTQ, AWQ, SmoothQuant)이전 포스트까지는 모델을 학습할 때 있어서의 효율을 확보하고자 하는 방법들이라면,
이번 포스트부터는 이렇게 학습한 모델들을 가지고 어떻게 하면 좀 더 빠르게 추론하고 서빙할 수 있을지에 대한 방법론들을 알아본다
오늘 살펴볼 양자화는 추론 효율은 극대화하나 성능이 저하된다는 본질적인 한계를 가지고 있다.
양자화란?
- 양자화란 부동소수점 데이터를 더 적은 메모리를 사용하는 정수 형식으로 변환해 GPU를 효율적으로 사용하는 방법을 말함
- 기본적으로 FP32 형식으로 모델 파라미터를 저장했다면, 최근엔 모델이 점점 커지면서 FP16를 사용하는 경우가 많다 (FP16, BP16)
- 수행하는 시점에 따라 2가지로 나뉜다
- Post Training Quantization (PTQ) - 학습 후 양자화
- 오차가 너무 큼
- 경우에 따라 Calibration 과정이 별도로 진행되어야 하기에 Calibration Data 필요함
- Quantization aware Training (QWA) - 양자화 학습
- 시간이 너무 많이 걸림 & 학습 비용이 비쌈
- Post Training Quantization (PTQ) - 학습 후 양자화
✅ Calibration이란?
INT8은 256단계(−128~127)의 정수만 표현 가능해서, 원래 FP32로 연산하던 값을 그대로 쓰면 정밀도 손실이 생김.
→ 그래서 각 layer의 최대값/최소값 범위 (Activation Range)를 측정해서 그 범위를 INT8에 맞게 스케일링(scale) 해줘야 함.
이걸 Calibration이라 부르고, 이때 사용하는 입력 데이터를 Calibration Dataset이라고 함
✅ Calibration Data는 어떤 형태야?
실제 추론에 들어갈 데이터의 축소본.
학습에 사용한 전체 데이터는 필요 없고, 보통 50개 ~ 수천 개 정도의 입력 샘플을 씀.아래서 살펴볼 양자화 방식은 모두 PTQ, 즉 학습 후 양자화에 해당된다
HuuggingFace에서는 2가지 quantization method를 제공하고 있다. 바로 BitsAndBytes와 GPTQ이다.
-> 두 quantization method가 어떤 장단점을 가지는지 직접 비교 및 분석을 진행한 HuggingFace의 블로그 포스트
1. bitsandbytes
- 8비트 및 4비트로 양자화하는 방법
- 8비트 행렬 연산 (https://huggingface.co/blog/hf-bitsandbytes-integration)
- 자세한 원리는 LLM.int8() 논문 참고! (https://arxiv.org/pdf/2208.07339)
- GPT-style 대형 언어모델을 위한 INT8 양자화 기법임
- HuggingFace Transformers에서는 load_in_8bit=True 로 쉽게 사용됨
- 핵심 목표
- 메모리 절약 (INT8로 weight 저장)
- 성능 유지 (LayerNorm 등 민감한 부분은 FP32 유지)
- 학습된 weight 그대로, 재학습 없이 빠르게 적용 가능 (PTQ 기반)
- 원리 : 단순하게 "Min-Max 클리핑 후 양자화"가 아니라, "Weight의 분포를 통계적으로 분석해서, 정보를 최대한 보존하면서 Round to Nearest로 정수에 매핑"하는 방식을 사용한다는 점 (https://huggingface.co/blog/assets/96_hf_bitsandbytes_integration/Mixed-int8.gif)
- Weight matrix를 column-wise로 나눔 (Group-wise Quantization) → 채널별로 스케일링
- 가장 정보 손실이 적은 위치로 Round to Nearest 적용
- Weight matrix를 column-wise로 나눔 (Group-wise Quantization) → 채널별로 스케일링
- 자세한 원리는 LLM.int8() 논문 참고! (https://arxiv.org/pdf/2208.07339)
- 4비트 정규 분포 양자화 방식 (https://huggingface.co/blog/4bit-transformers-bitsandbytes)
- 이렇게 변환된 4비트 모델에다가 adapter 학습하는 거 == QLoRA (https://arxiv.org/abs/2305.14314)
- 8비트 행렬 연산 (https://huggingface.co/blog/hf-bitsandbytes-integration)
1. 8비트 행렬 연산
✅ 그럼 "Round to Nearest"는 뭐야?
FP32 → INT8으로 바꿀 때, 소수점을 반올림해서 정수에 매핑하는 방식 (가장 간단한 양자화 방식이라고 할 수 있다)
우리는 이러한 값들을 int8 양자화해야 합니다. 아래는 그 과정입니다.
1. 이전 범위 = FP16 형식의 최대 가중치 값 - FP16 형식의 최소 가중치 값 = 0.932–0.0609 = 0.871
2. 새로운 범위 = Int8은 -128부터 127까지의 숫자를 가집니다. 따라서 범위 = 127-(-128) = 255
3. 스케일 = 새로운 범위의 최대 값 / 이전 범위의 최대 값 = 127 / 0.932 = 136.24724986904138
4. 양자화된 값 = (스케일 * 원래 값)을 반올림한 값
5. 역 양자화된 값 = 양자화된 값 / 스케일반올림 오차 - 여기서 주목할 중요한 점은 역 양자화를 다시 FP16 형식으로 수행할 때 숫자가 완전히 동일하지 않다는 것입니다. 첫 번째 요소인 0.5415는 0.543이 됩니다. 대부분의 요소에서 동일한 문제를 확인할 수 있습니다. 이것이 양자화 - 역 양자화 과정의 결과인 오차입니다.양자화된 값
역 양자화된 값
2. GPTQ
- 특징
- PTQ 방법론의 가중치의 양자화 오차를 최소화 하고자 하는 목표.
- 3~4 비트로 양자화하여도 손실 거의 없음 (low bit Quantization 성능)
- 2 비트에서도 안정적인 성능을 보임 (lower bit Quantization 성능)
- 수백억개의 초대규모 모델도 4시간 내에 PPL 증가 없이 양자화 가능 (학습 효율성)
- 등장 과정
- OBS -> OBQ -> GPTQ
- 따라서 GPTQ를 이해하기 위해선 OBS와 OBQ를 이해해야 한다
- OBS -> OBQ -> GPTQ
- layer-wise quantization
- layer-wise quantization은 말 그대로 레이어 별로 퀀타이제이션을 하는 것을 의미
- 여러 개의 layer들 별로 양자화 해주겠다는 것
- quantization된 weight matrix를 W̃라고 할 때, 원래의 WX와 W̃X를 최소화하는 W̃를 찾는 것이 objective! (=즉, 원래의 WX와 W̃X를 최소화하는 W̃를 찾는것이 목표)
- OBS란 ? (=Optimal Brain Suggestion)
- 가장 중요도가 낮은 가중치를 가지치기 하는 기법
- layerwise quatization을 위해서 구해놓은 식을 loss function이라고 하고, 이를 hessian matrix의 함수로 쓴다.
- 순서
- 중요도가 낮은 가중치 찾기
- 가지치기 후, 오차 보정하기
- OBQ란 ? (=Optimal Brain Quantization)
- 가장 중요도가 낮은 가중치 부터 순차적으로 양자화 하는 기법
- 순서
- 중요도가 낮은 가중치 찾기
- 양자화 (RTN)
- 오차 보정하기
- 오차 업데이트할 때, 양자화된 가중치 제외하고, 같은 레이어의 나머지 가중치들에게 오차를 전파함
- 또한 다음 가중치를 업데이트 할 땐, 양자화한 가중치는 제외하고 업데이트를 한다
- GPTQ란?
- OBQ의 속도 개선 버전
- OBQ 시에 중요도 낮은 가중치를 찾기 위한 계산이 들기 때문에, 굳이 찾지 말고 고정된 순서(왼 -> 오)로 양자화할게, 그래도 성능 괜찮더라
- GPTQ는 Round to Nearest 대신 Error-Minimizing Quantization 사용
- 순서
- 고정된 순서, 그룹단위의 양자화 (RTN)
- 동일 순서로 지우면, 해시안 역행렬 계산 횟수를 많이 줄일 수 있음
- 양자화 후, 오차 보정하는법
- 고정된 순서, 그룹단위의 양자화 (RTN)
- OBQ의 속도 개선 버전
!pip install auto_gptq import torch from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig from transformers import TextGenerationPipeline from transformers import AutoTokenizer pretrained_model_name = "bigscience/bloom-3b" quantize_config = BaseQuantizeConfig(bits=4, group_size=128) # Tensors of bloom are of float16. Hence, torch_dtype=torch.float16. Do not leave torch_dtype as "auto" as this leads to a warning of implicit dtype conversion model = AutoGPTQForCausalLM.from_pretrained(pretrained_model_name, quantize_config, trust_remote_code=False, device_map="auto", torch_dtype=torch.float16) # changing device map to "cuda" does not have any impact on T4 GPU mem usage. tokenizer = AutoTokenizer.from_pretrained(pretrained_model_name) # Calibration examples = [ tokenizer( "Automated machine learning is the process of automating the tasks of applying machine learning to real-world problems. AutoML potentially includes every stage from beginning with a raw dataset to building a machine learning model ready for deployment." ) ] # giving only 1 example here for testing. In an real world scenario, you might want to give 500-1000 samples. model.quantize(examples) quantized_model_dir = "bloom3b_q4b_gs128" model.save_quantized(quantized_model_dir) # Inference with quantized model device = "cuda:0" # make use of GPU for inference. model = AutoGPTQForCausalLM.from_quantized(quantized_model_dir, device=device, torch_dtype=torch.float16) pipeline = TextGenerationPipeline(model=model, tokenizer=tokenizer, max_new_tokens=50) print(pipeline("Automated machine learning is")[0]["generated_text"])
🆚 Pros & Cons Analysis(bitsandbytes, GPTQ)
The benefits & rooms of improvements of bitsandbytes
Benefits
1. easy 😙: bitsandbytes는 모델 로드 시에 모든 것을 수행하므로 어떠한 후처리 또는 준비 스텝을 거치지 않아도 됨.
2. cross-modality interoperability 🧰: 어떠한 modality라고 해도 quantization이 가능함. 따라서 범용성이 넓음.
3. 0 performance degradation when merging adapters ✅: 학습된 adapter를 base model 또는 dequantized model에 어떠한 성능 저하 없이 합칠 수 있음. merging은 GPTQ에서는 지원되지 않음.
Rooms of Improvements
1. slower than GPTQ for text generation 🐢: bitsandbytes의 4-bit model은 inference 시에 GPTQ보다 느린 속도를 보여줌.
2. 4-bit weights are nor serializable 😓: 현재로서는 4-bit model을 직렬화할 수 없음.
The benefits & rooms of improvements of GPTQ
Benefits
1. fast for text generation ⏩: text generation 측면에서 GPTQ quantized model은 bitsandbytes quantized model보다 빠른 속도를 보여줌.
2. n-bit support 🔢: GPTQ 알고리즘은 2bit 이상으로 모델을 양자화할 수 있음. 하지만, 추천되는 bit의 수는 4임.
3. easily serializable 😊: GPTQ model은 어떤 수의 bit든 직렬화를 지원함.
4. AMD Support 💽: Nvidia GPU 뿐만 아니라 AMD GPU도 지원됨.
Rooms of Improvements
1. calibration dataset 😓: GPTQ를 위해서는 calibration dataset이 필요한데, 이로 인해 GPTQ를 사용하려는 사용자들이 줄어듦. 게다가 model을 quantize 하기 위해서는 조금 많은 시간이 소요됨.
2. works only for language models 😢: GPTQ는 오직 language model을 위해서만 만들어졌음.Suggestion of Blog (HuggingFace의 블로그 포스트에서는 각 quantization method의 비교를 하고 마지막 부분에 이를 토대로 다음과 같이 quantization을 진행하는 것이 가장 효율적이라는 것을 주장하였다)
1. bitsandbytes를 사용해서 base model을 양자화함
2. adapter를 추가하고 fine-tuning
3. base model 또는 dequantized model의 위에 학습된 adapter를 merge 함
4. GPTQ를 사용해서 merged model을 quantize 하고, 이를 이용해서 inference를 진행
그리고 이를 증명하는 프로젝트를 진행하신 블로그 글이 있음.3. AWQ
- 모든 가중치가 동일한 중요도를 가지고 있지 않다 -더 중요한 가중치를 float16, 안좋은건 4/8bit 보존한다면 더 좋은 성능
- 더 중요한 가중치 : activation 값이 더 높은 채널
- 어떻게 보존 : 그 값을 양자화하기 전에 Scaling
AWQ는 비선형 스케일 기반으로, Soft Clipping + Round 사용
결국 양자화는 더 적은 메모리를 사용하면서 모델 성능 최대한 유지하는 것이 필요
→ 그렇다면, 모든 모델 파라미터가 정보를 고르게 가지고 있을까? 라는 의문
그렇다면, 어떻게 중요한 모델 파라미터를 찾을 수 있을까? 세 개의 방법 중 실험적으로 검증- 모델의 파라미터 값이 클 것 (그렇다면 연산 과정에서도 큰 영향 있을 것)
- 입력 데이터의 Activation 값이 큰 채널의 파라미터가 중요
- Random으로 선택
→ 이런 (1) 모델 파라미터 자체와, (2) 활성화 값을 기준으로 상위 1%에 해당하는 모델 파라미터를 찾고, 해당 파라미터는 FP16 유지 & 그외 나머지는 모두 양자화하는 실험 수행
결과적으로 (1)만 했을 땐 성능 저하가 있었고, (2)를 했을 땐 성능 저하 거의 없었음
따라서 아래의 주요 특징을 가지게 됨- Activation을 제외하고 weight만 양자화
- 중요한 weight channel은 activation 크기 기준으로 선택합니다.
- 중요한 weight channel을 보호하기 위해 중요한 weight channel에 대한 적절한 값(s)을 찾아 scaling합니다. - 1%만 남기고 양자화!!!
- Per-Channerl Scaling이라는 간단한 기법! salient channel을 scaling factor로 돕란 뒤에 양자화하고 실제 activation 계산시 다시 scaling factor로 나눠주는 깁버
→ Why 3번? : 양자화하면서 중요한 채널의 값의 정보가 소실 될 수 있어서, 중요한 채널에만 따로 1보다 큰 값(=Scaling factor) 곱해주는 방식(이때 곱해주는 값을 스케일러=원본 대비 양자화 오류 비율의 역수라고 함)으로 해결
- Per-Channerl Scaling이라는 간단한 기법! salient channel을 scaling factor로 돕란 뒤에 양자화하고 실제 activation 계산시 다시 scaling factor로 나눠주는 깁버
- 사실 아이디어 내고 실험으로 통해서 입/검증하는 방식, RTN이나 GPTQ보다 우리가 더 좋았다
- AWQ는 Calib. Data가 적어도 양자화 잘하고, 덜 민감함
4. SmoothQuant
Reference.
# 양자화
https://huggingface.co/blog/overview-quantization-transformers
Overview of natively supported quantization schemes in 🤗 Transformers
huggingface.co
https://huggingface.co/blog/merve/quantization
Introduction to Quantization cooked in 🤗 with 💗🧑🍳
Introduction to Quantization cooked in 🤗 with 💗🧑🍳 Quantization is set of techniques to reduce the precision, make the model smaller and training faster in deep learning models. If you didn't understand this sentence, don't worry, you will at
huggingface.co
https://data-newbie.tistory.com/992
LLM) Quantization 방법론 알아보기 (GPTQ | QAT | AWQ | GGUF | GGML | PTQ)
양자화 기술은 모델을 압축하여 빠르고 효율적으로 만드는 기술입니다. 모델의 가중치와 활성화 값을 줄여 메모리를 절약하고 연산 속도를 높입니다. 이 글은 여러 양자화 기술
data-newbie.tistory.com
어떻게 Quantization을 진행하는 것이 효과적일까? 🤔
Which quantization method is efficient & effective? 🧐 날이 지나면 지날수록 점점 사이즈가 커져가는 LLM의 판도에서 이들을 손쉽게 효율적 및 효과적으로 사용할 수 있는 방법에는 무엇이 있을까? 요즘에
cartinoe5930.tistory.com
https://julie-tech.tistory.com/142
Quantization
Quantization은 LLM이 화제가 되기 전에도 이미 모델의 complexity 나 cost를 줄이고자 하는 노력의 일환으로 연구가 되어왔던 분야이다. 물론 더 가벼운/저렴한 모델을 만들 때 quantization만이 유일한 대
julie-tech.tistory.com
# bitsandbytes
- bitsandbytes 4-bit quantization blogpost: 4-bit 양자와와 효율적인 fine-tuning 방식인 QLoRA에 대해서 설명함.
- bitsandbytes 8-bit quantization blogpost: bitsandbytes를 활용했을 때 8-bit quantization이 어떻게 되는지 설명함.
- Basic usage Google Colab notebook for bitsandbytes: 4-bit model을 활용해서 어떻게 추론할 수 있는지 보여줌. 그리고 GPT-neo-X를 Google Colab Free GPU에서 사용하는 방법을 알려줌.
# GPTQ
- GPTQ blogpost: GPTQ quantization method에 대한 전체적인 개요를 알려주고 사용 방법에 대해 알려줌.
- Basic usage Google Colab notebook for GPTQ: GPTQ method를 활용하여 어떻게 Transformers 모델을 양자화하고, 추론하는지 등을 알려줌. 그리고 quantized model을 활용하여 어떻게 fine-tuning 하는지 알려줌.
[paper review] GPTQ: ACCURATE POST-TRAINING QUANTIZATION FOR GENERATIVE PRE-TRAINED TRANSFORMERS
정말 정말 힘들었다..사실 아직도 이해 못했는데최대한 이해한 부분이라도 써보겠다 (기억상실을 방지하기 위함)low bitwidth quantization or model pruning은 억만개의 파라미터에 대해 비용이 많이 드는
velog.io
# AWQ
https://devocean.sk.com/blog/techBoardDetail.do?ID=166224&boardType=techBlog
Activation-aware Weight Quantization
devocean.sk.com
728x90'AI > NLP' 카테고리의 다른 글
- 양자화란 부동소수점 데이터를 더 적은 메모리를 사용하는 정수 형식으로 변환해 GPU를 효율적으로 사용하는 방법을 말함