QLoRA : Efficient Finetuning of Quantize LLMs
🔗 https://arxiv.org/abs/2305.14314
기업 해커톤에 필요한 내용을 도출하기 위해 논문의 전문을 꼼꼼하게 보지는 못하고, 핵심 부분만 빠르게 정리하였다. 생략된 내용이 있을 수 있으니 참고 바람
QLoRA : LoRA 와 nf4로 양자화 한 pretrained language model 을 사용하는 방식
QLoRA 의 방법론 :
- NF4
- Double quantization
- Paged Optimization
아래부터 QLoRA 를 위한 기본 지식부터 방법론에 대해서 설명하려 한다.
Quantization :
연산과 저장에 필요한 정밀도를 낮추어 모델의 메모리 사용량과 계산 효율을 높이는 기술
Quantization 종류 :
- Post-training Quantization (PTQ)
- 모델 학습 후 양자화 수행
- 비교적 구현이 쉽다는 장점이 존재한다.
- 정확도 손실 가능성 존재
- Quantization-Aware training (QAT)
- 학습 중 양자화를 고려
- 정확도 손실이 적지만 구현 복잡도가 높음
- Dynamic Quantization / Static Quantization
- Dynamic : 추론 중에 양자화
- Static : 사전에 양자화 된 값 사용
PTQ 정수 양자화 방식 예시 :
- absmax(X[fp32]) : fp32의 X에서 절댓값이 가장 큰 친구를 뽑는다
- 127/ [1번결과] : 8 bit tensor의 max abs 값인 127에 나눈다 → quantization constant (양자화 상수) $
- 나온 값을 x 에 다 곱해줌, 그리고 반올림
- quantile quantization : 각 양자화 구간에 할당되는 데이터 수가 균등한 양자화
- 정규분포 전제 하에 양자화 구간을 만들고, 이를 [-1,1] 사이로 스케일링 된 가중치 텐서를 양자화 구간에 맵핑한다. 16개로 양자화 구간도 나눠주는데 이는 4bit 양자화여서 16개 (nf4)
NF4 (NormalFloat 4-bit)
1. 문제
→ “분포” 를 고려한 양자화의 필요성
일반적으로, 양자화(Quantization) 은 다음 두 가지를 모두 고려해야 한다.
- 정밀도 손실 최소화
- 연산 및 메모리 효율
이 때, Quantile Quantization 은 정보 이론적으로 “각 양자화 구간 (bin)” 에 할당되는 데이터 수가 균등” 하도록 설정한다. 즉, 데이터가 어떤 분포를 가지고 있더라도, 모든 bin 에 같은 갯수의 값이 있도록 경계를 설정하는 방식이다.
ex : 데이터가 0 근처에 몰려 있으면, 구간을 더 촘촘하게 쪼개서 0 부근의 정밀도를 높이고, 데이터가 거의 없는 극단 영역(아웃라이어)에는 구간을 넓게 할당함.
문제는 이 ‘분포를 직접 추정하는 과정(quantile estimation)’이 비싸고(계산량 많고), 아웃라이어가 있으면 오차가 커진다는 것.
2. 딥러닝 모델 가중치 (weights) 는 “정규분포” 에 가깝다.
key idea : 이미 학습된 신경망의 가중치는 대체로 0을 중심으로 하는 정규분포에 가깝다.
즉 “학습된 가중치가 보통 ± 몇 표준편차(σ) 안에 몰려있다” 는 통계적 성질을 이용하자는 것.
→ “아예 표준 정규분포에 대해서 이론적으로 최적인 양자화 구간을 미리 고정해버리자” 라는 전략이다.
→ 한마디로, 매번 가중치의 분위수를 새로 추정할 필요 없이, “표준 정규분포용으로 미리 계산해둔 구간 경계”를 활용하면 된다는 것.
( 여기서 NFk 양자화 아이디어를 얻을 수 있다. )
3. NormalFloat(NFk) 아이디어 :
0 평균, σ(표준편차) 가 일정한 정규분포에 맞춰서 미리 양자화 구간을 만든 뒤, 가중치 텐서가 실제로는 다른 표준 편차를 가질 수 있으니, 이를 [-1, 1] 범위로 정규화 (스케일링) 해 매핑한다.
→ 정규분포 전제 하에 양자화 구간을 만들고, 이를 [-1,1] 사이로 스케일링 된 가중치 텐서를 양자화 구간에 맵핑한다. 16개로 양자화 구간도 나눠주는데 이는 4bit 양자화여서 16개
간단히 설명 :
[-1,1] 사이에 4bit 의 16간격으로 쪼개서 그 안에 있는 값을 가까운 거로 바꾸기
(단순 균등까지는 아니고 ”정규분포의 분위수” 를 고려해 최적화된 지점을 찾기)
- [-1, 1] 구간을 16개로 나눈다 (k=4비트 → 16개 bin)
- 정확히는 단순 균등 간격이 아니라, “정규분포의 분위수”를 고려해 최적화된 지점을 찾음 (논문에서는 이론적 최적이라 함).
- FP32 값(실제 가중치)을 해당 구간에서 가장 가까운 대표값(구간의 중앙값 등)으로 매핑
- 예: 0.71 → 0.7333 구간에 해당하면, “0.7333”으로
- 이때 그 대표값(혹은 구간)에 해당하는 인덱스(예: 14번 bin)를 저장
- 메모리에 14라는 “4비트” 숫자만 저장하면, 역으로 복원할 때 14→0.7333 정도로 다시 확장 가능.
NF4 정리
- “딥러닝 가중치는 (거의) $ N(0,σ^2) $ 분포를 따른다”는 점을 적극 활용!!
- “정규분포에 최적인 양자화 구간”을 고정(precomputed)해두고,
- 정규분포를 기반으로 양자화 된 구간을 고정해두기 때문에 추가 계산이 불필요
- quantile quantization 으로 하면 매번 계산을 해줘야 돼서 계산 cost 가 상당함
- “가중치를 [-1,1]로 매핑” 만 해주면 손쉽게 4비트 양자화를 적용할 수 있게 해주는 방법입니다.
- [-1,1] 사이로 스케일링 된 가중치를 정규분포에 최적인 양자화 구간에 맵핑 해주기
- 학습된 가중치 텐서를 [-1,1] 범위로 스케일링하면, 미리 정의된 정규분포 기반 양자화 구간 (16 bin) 에 바로 맵핑 가능
- 성능을 유지할 수 있는 이유는 양자화 구간이 사전학습된 가중치의 정규분포의 특성에 맞게 설계되었으므로, 가중치의 중심부에 더 촘촘한 구간이 배치되어 정밀도를 유지할 수 있다.
QLoRA 에서는 nf4 양자화를 통해서 PLM을 quantization 시킨다.
Double Quantization
Quantization Constant : 양자화 상수
양자화는 데이터를 압축하지만, 데이터 범위 (ex : min, max) 를 기록해야 원본 데이터를 복원할 수 있다. 이 때, 각 블록의 absmax 등을 저장한 것이 바로 양자화 상수이다.
4비트 양자화는 메모리를 크게 줄여주지만, 양자화 상수 자체는 여전히 fp32로 저장된다.
- 각 블록의 크기를 64로 설정하면, 양자화 상수는 64개의 파라미터 당 32비트를 차지한다.
이는 4bit 효율성을 저하 시킴. 이를 해결하기 위해서 , QLoRA 는 double quantization을 도입하여 양자화 상수를 8bit 로 추가 양자화하여 메모리 사용량을 더 줄인다.
Double Quantization 의 동작 원리
1. 1차 양자화
- 모델 가중치를 4비트로 양자화하며, 각 블록에 대해 양자화 상수 $ c_{FP32}^{(2)} 를 생성한다.
2. 2차 양자화
- 1차 양자화 상수 $ c_{FP32}^{(2)} 를 추가로 양자화 하여 fp8로 변환한다.$ c_{FP8}^{(2)}=Quantize(c_{FP32}^{(2)}) $
- 이 과정에서, FP32 양자화 상수의 평균값을 빼서 대칭적 양자화를 수행한다. (양자화 범위를 더 효율적으로 활용하기 위해 평균값을 뺀다고 한다.
3. 양자화 상수의 양자화 상수
- 2차 양자화의 결과인 를 복원하기 위해 또 다른 양자화 상수 가 필요하다.
Page Optimization
Paged Optimization은 GPU VRAM의 용량을 초과하는 대규모 모델을 실행할 때, VRAM과 CPU RAM을 동적으로 활용하여 OOM(Out-of-Memory) 에러를 방지하는 기술이다. 모델의 일부 파라미터나 중간 연산 결과를 VRAM에서 RAM으로 옮겨 저장하고, 필요할 때 다시 VRAM으로 가져오는 방식으로 작동한다. 이를 통해 VRAM 사용량을 최적화하고, 제한된 하드웨어 환경에서도 대규모 모델을 효율적으로 실행할 수 있다.
즉, QLoRA 의 핵심은 PLM Optimization 으로 인해 발생하는 오차를 LoRA 가 학습하여 보정하는 것이다.
QLoRA의 핵심 원리:
- 양자화된 모델 동결:
- QLoRA는 4비트로 양자화된 베이스 모델의 가중치를 frozen 한다.
- 즉, 베이스 모델의 가중치는 학습되지 않으며, optimization 상태 그대로 유지
- LoRA 어댑터를 통해 보정:
- optimization 된 PLM이 표현하지 못하는 정보(=양자화 오차)를 LoRA 어댑터가 학습한다. ( LoRA 어댑터는 low-rank matrix로 구성되어 있으며, 모델의 특정 선형 계층(Linear Layer)에 추가된다. )
- LoRA 학습 과정:
- 학습 중, 모델 출력과 실제 정답 사이의 오차를 기반으로 LoRA 어댑터의 파라미터만 업데이트 된다.
- LoRA 어댑터는 양자화된 모델의 출력을 보정하여, 양자화로 인한 성능 손실을 최소화한다.
'Paper Review' 카테고리의 다른 글
[Paper Review] LLM-Pruner: On the Structural Pruning of Large Language Model (0) | 2025.01.27 |
---|---|
[Paper Review] Compact Language Models via Pruning and Knowledge Distillation (0) | 2025.01.26 |