끄적

QLoRA 논문 리뷰

uvumbu 2025. 1. 17. 11:24

 

1. Abstract

본 논문은 16비트 finetuning task 수행을 보존하면서도 65B 파라미터 모델을 48 GP GPU를 사용해서 효율적으로 finetuning할 수 있는 접근 법인 QLoRA를 제안한다.

QLoRA는 동결된 4비트 양자화된 사전 학습 언어 모델을 통해 LoRA로 역전파한다.

이 모델은 단일 GPU로 24시간의 finetuning만으로 이런 성과에 도달하면서도 성능을 희생하지 않고, 메모리를 절약할 수 있다.

 

아래가 QLoRA에서 메모리 절약을 위해 도입된 혁신 기술들이다.

  • 정규 분포 가중치에 대해 정보 이론적으로 최적인 새로운 데이터 유형, 4-bit NormalFloat(NF4),
  • 양자화 상수를 다시 양자화하여 평균 메모리 사용량을 줄이는 Double Quantization
  • memory spikes을 관리하기 위한 Paged Optimizers

 

2. Introduction

LLM을 finetuning하는 것은 성능을 높이는데 매우 효과적이지만, 매우 큰 모델을 finetuning하는 것은 엄두도 못 낼 만큼 비싸다는 단점이 있다. QLoRA는 새로운 기술들을 활용하여 사전 학습된 모델을 4비트 양자화한 뒤, 학습 가능한 LoRA 가중치를 추가하여 튜닝한다. 그런 다음 양자화된 가중치를 통해 Gradients를 역전파하여 어댑터 가중치를 조정하게 한다.

 

 

QLoRA는 성능 저하 없는 메모리 절약을 위해 크게 3가지의 방법을 도입하고 있다.

 

(1) NF4 (4-bit NormalFloat) :

  • 정규 분포 데이터를 위해 정보 이론적으로 최적화된 양자화 데이터,
  • 4비트 정수와 4비트 부동 소수점보다 더 나은 결과를 제공한다.

(2) 이중 양자화 (Double Quantization) :

  • 양자화 상수를 다시 양자화하는 방법으로, 파라미터당 평균 0.37비트를 절약한다.
  • 65B 모델 기준으로 약 3GB의 메모리를 줄일 수 있다.

(3) Paged Optimizers :

  • NVIDIA 통합 메모리를 활용하여, 긴 시퀀스 길이를 가진 미니 배치를 처리할 때, ‘gradient checkpointing memory spikes’를 방지한다.

 

이런 기술들을 결합하여 LoRA 방식을 개선하였으며, 네트워크의 모든 계층에 어댑터를 포함시켜 이전 연구에서 나타났던 손실을 피할 수 있도록 설계했다.

 

 

3. Background

(1) Block-wise k-bit Quantization

양자화는 더 많은 정보를 담고 있는 표현에서 더 작은 정보를 담고 있는 표현으로 입력 데이터를 이산화하는 과정이다.

 

낮은 비트 데이터 타입의 전체 범위를 효율적으로 사용하기 위해, 입력 데이터 타입은 일반적으로 입력 요소의 절댓값의 최댓값으로 정규화되어 대상 데이터 타입 범위에 맞게 재조정된다.

여기서 c는 양자화 상수 또는 양자화 스케일을 의미하며, 아래는 역양자화 과정이다.

 

문제점 :

  • 이상치 발생 시 양자화 구간이 잘 활용되지 않아 일부 구간에서는 거의 값이 양자화되지 않거나, 전혀 되지 않는 현상이 발생한다는 것이다.

해결 방법 :

  • 입력 텐서를 블록으로 나눠 각 블록을 독립적으로 양자화하고, 각 블록에 고유한 양자화 상수 c를 사용하는 것이다.

 

(2) Low-rank Adapters

훈련 중 메모리 요구 사항을 줄이기 위한 방법이다. 이는 전체 모델 파라미터는 업데이트되지 않고, 고정된 상태로 유지하되, Stochastic Gradient Descent을 하는 동안 Gradient 는 고정된 사전 학습 모델 가중치를 통해 어댑터로 전달되며, 이 어댑터가 손실 함수에 최적화되도록 업데이트된다.

LoRA는 linear projection에 fatorized projection을 추가하여 이를 보완한다.

 

(3) Memory Requirement of Parameter-Efficient Finetuning

 

3. QLORAFinetuning

QLoRA는 논문에서 제안한 두 기술인 NF4 양자화와 이중 양자화를 통해 고품질의 4비트 파인튜닝을 달성한다. 거기에 gradient checkpointing memory spikes 를 방지하기 위해 Paged Optimizers를 도입했다. 이는 기존에 single machine에서 대규모 모델을 finetuning하기 어렵게 만들었던 문제를 해결한다.

QLoRA는 하나의 low-precision storage data type(보통 4비트)과 하나의 계산 데이터 타입(보통 BFloat16)을 사용한다. 실질적으로 이는 QLoRA 가중치 텐서가 사용될 때마다, 텐서를 BFloat16으로 역양자화를 한 뒤, 16비트에서 행렬 곱셈을 수행한다.

 

이제 QLoRA의 구성 요소와 공식적인 정의를 다뤄보자.

 

4-bit NormalFloat Quantization

NF 데이터 타입은 Quantile Quantization에 기반으로 둔 정보 이론적으로 최적화된 데이터 타입이다. 이 방식은 입력 텐서에서 각 양자화 구간이 동일한 개수의 값을 할당 받도록 보장한다. Quantile quantization은 입력 텐서의 경험적 누적 분포 함수(empirical cumulative distribution function)를 통해 Quantile 를 수행한다.

 

Quantile Quantization의 주요 한계는 Quantile 추정 과정이 비싸다는 것이다. 이를 해결하기 위해 quantile approximation algorithms(SRAM과 같은)이 사용된다. 하지만 이 quantile approximation algorithms은 근삿값을 기반으로 작동하므로 이상치에 대해 큰 양자화 오류를 발생시키는 경우가 많다.

 

비용이 많이 드는 quantile estimates와 근사 오류는 입력 텐서가 특정 양자화 상수에 의해 고정된 분포를 따를 경우 피할 수 있다. 이런 경우, 입력 텐서는 동일한 quantiles을 가지므로, 정확한 quantile estimation을 계산적으로 수행하는 것이 가능해진다.

 

사전 학습 신경망 가중치들은 표준 편차σ 를 가지는 0을 중심으로 한 정규 분포를 따른다. 때문에 모든 가중치들을 하나의 고정 분포로 변환할 수 있다. 이때 σ를 조정하여 해당 분포가 데이터 타입의 범위에 정확히 들어맞도록 한다.

 

논문에서의 데이터 타입에서는 범위를 [-1, 1]로 설정한다. 따라서 데이터 타입의 quantile 와 신경망 가중치는 모두 이 범위에 맞게 정규화되어야 한다.

 

0을 평균으로 하고, 임의의 표준 편차를 가지며 [-1, 1] 범위에 속하는 정규 분포에 대해 정보 이론적으로 최적화된 데이터 타입은 다음과 같은 과정을 통해 계산된다.

 

  • 2^{k}+1 개의 quantiles
    • 이론적인 N(0,1) 분포에서 2^{k} 개의 quantiles를 추정해, 정규 분포를 위한 k 비트 양자화 데이터 타입을 생성
  • 이런 데이터 타입을 갖고, [-1, 1] 범위로 정규화
  • 입력 가중치 텐서를 절댓값의 최댓값을 기준으로 [-1,1] 범위로 정규화하여 양자화

가중치 텐서의 범위와 데이터 타입의 범위가 일치하면, 일반적인 방식으로 양자화를 할 수 있다.

단계 (3)은 가중치 텐서의 표준 편차를 k 비트 데이터 타입의 표준 편차와 일치하도록 재조정하는 것과 동일하다.

 

 

여기서 Q_X ( ) 는 표준 정규 분포 N(0, 1)의 quantile 함수다. 문제는 대칭적인 k 비트 양자화에서는 이 방식이 정확히 0을 표현하지 못한다는 점이다. 0은 패딩이나 0 값 요소를 오류 없이 양자화하는데 중요한 속성이므로 이를 해결해야 한다.

 

0을 표현하는 이산적 제로 포인트를 보장하고, k 비트 데이터 타입의 모든 2^{k}를 활용하기 위해, 다음과 같은 비대칭 데이터 타입을 생성한다.

 

(1) 2개의 범위에 대한 quantile, q_{i}를 추정한다.

  • 음수 : 2^{k-1}
  • 양수 : 2^{k-1}+1

(2) 이렇게 얻어진 q_{i} 세트를 통합한 후, 양쪽 세트에 중복된 두 개의 0 중 하나를 제거한다.

 

결과적으로 양자화 구간에 포함된 값의 기대 개수가 동일하게 분포된 데이터 타입을 생성한다. 이 타입을 k 비트 NomalFLoat (NFk)라고 부르며, 이는 0을 중심으로한 정규 분포 데이터에 대해 정보 이론적으로 최적화된 데이터 타입이다.

 

Double Quantization

추가적인 메모리 절약을 위해 양자화 상수를 다시 양자화하는 과정이다. 정밀한 4비트 양자화를 위해서는 작은 블록 크기가 필요하지만, 이는 상당한 메모리 부담을 초래할 수 있다. 예를 들어 W에 대해 블록 크기를 64로 설정하고, 32비트 상수를 사용하면, 양자화 상수는 평균적으로 파라미터당 32/64 = 0.5 비트를 추가로 차지하게 된다. 이중 양자화는 이런 메모리 부담을 줄이는데 도움이 된다.

 

좀 더 구체적으로, 이중 양자화는 1차 양자화의 양자화 상수 c_{2}^{FP32}를 2차 양자화의 입력으로 처리한다. 2차 양자화에서는 양자화된 양자화 상수 c_{2}^{FP32}와 2차 양자화 상수 c_{1}^{FP32}를 생성한다.

  • 8비트 부동 소수점을 사용하며, 블록 크기는 256으로 설정한다. 이는 Dettmers 와 Zettlemoyer 의 결과와 일치하게, 8비트 양자화에서 성능 저하가 관찰되지 않았기 때문이다.
  • c_{2}^{FP32} 는 항상 양수 값을 가지므로, 양자화 전에 평균을 빼서 값을 0에 중심화한 후, 대칭 양자화(symmetric quantization)를 사용한다.

블록 크기가 64인 경우:

  • 기존 메모리 사용량 : 32 / 64 = 0.5 비트 (파라미터 당)
  • 이중 양자화 후, 메모리 사용량: 8 / 64 + 32 / (64 * 26) = 0.127 비트 (파라미터당)
  • 결과적으로, 파라미터당 memory footprint 가 0.373비트 감소한다.

이 방식은 성능 손실 없이 양자화 상수의 메모리 사용량을 크게 줄이는데 기여한다.

 

Paged Optimizers

NVIDIA의 통합 메모리 기능을 활용하며, 이 기능은 GPU가 메모리 부족 상황에 놓일 경우, CPU와 GPU 간 페이지 간 전송을 자동으로 처리하여 GPU 처리에서 오류를 방지한다. 이 기능은 CPU RAM과 디스크 간의 일반적인 메모리 페이징과 유사하게 작동한다.

이 기능을 사용하여 optimizer states에 대한 페이징 메모리를 할당한다. GPU 메모리가 부족한 경우, Optimizer 상태는 자동으로 CPU RAM으로 이동되며, Optimizer 업데이트 단계에서 메모리가 필요할 때, GPU 메모리로 페이징된다.

이를 통해 GPU 메모리 제한이 있는 상황에서도 효율적이고 안정적인 모델 학습이 가능하다.

 

요약

  • CPU와 GPU간 페이지 단위 전송을 자동 수행함으로써 GPU 메모리가 부족하더라도 효율적이고 안정적인 모델 학습이 가능하게 한다.

QLoRA

앞서 언급한 요소들을 통해, 본 논문은 다음과 같은 하나의 LoRA 어댑터 선형 레이어를 정의한다.

 

 

여기서 doubleDequant는 다음과 같이 정의된다.

 

우리는 W에 대해 NF4를 사용하고, c_{2}에 대해 FP8을 사용한다. W는 더 높은 양자화 정밀도를 위해 64 크기의 블록 크기를 사용하며, c_{2}는 메모리 절약하기 위해 256 크기의 블록 크기를 사용한다.

파라미터 업데이트 시, 어댑터 가중치 L_{i}에 대한 오류의 gradient인 \frac{\partial E}{\partial L_{i}} 만 필요하며, 4 비트 가중치 W에 대한 gradient \frac{\partial E}{\partial W}는 필요하지 않다. 그러나 \frac{\partial E}{\partial L_{i}} 의 계산에는 \frac{\partial X}{\partial W}의 계산이 포함된다. 이는 저장된 W^{NF4}를 역양자화하여 계산 데이터 타입 W^{BF16}로 변환한 다음, BFloat16 정밀도로 \frac{\partial X}{\partial W} 를 계산하는 방식으로 진행된다.

 

(부득이하게 라텍스 코드를 그대로 넣었습니다.)

 

요약하자면, QLoRA는 하나의 저장 데이터 타입과 하나의 계산 데이터 타입을 가진다. 본 논문에서는 저장 데이터 타입을 역양자화하여 계산 데이터 타입으로 변환한 후, forward 및 backward 연산을 수행한다. 그러나 가중치 gradient는 16-bit BrainFloat 을 사용하는 LoRA 파라미터에 대해서만 계산된다.