AI/자연어처리(NLP)

[Fine Tuning] PEFT(Parameter-Efficient Fine-Tuning) : LoRA, QLoRA

CSE 2025. 11. 11. 11:13

어떤 LLM등을 원하는 목적에 맞게 튜닝할 때, 이 모델이 가지고 있는 파라미터를 업데이트해야한다.

그러나 요즘 LLM들은 수십억개 수준의 매우 많은 파라미터를 가지고 있어 이 조정과정이 매우 오래걸린다.

이는 개인적으로, 또는 소규모 그룹에서 진행하기에 매우 어렵고 매우 큰 VRAM과 비용이 요구된다.

 

위에서 얘기한 모든 파라미터를 조정하는 것을 Full Fine-tuning 이라고 한다.

 

예를 들어 1억개의 파라미터를 가지는 모델을 생각해보자.

이 1억개의 파라미터가 들어있는 행렬을 $W_0$라고 하면 이는 10000*10000의 크기를 가질 것이다.

$W_{tuned} = W_0 + \Delta W$

이런 식으로 기존값에 일정량의 보정치를 더해 값을 수정할텐데 여기서 $\Delta W$도 10000*10000의 크기가 된다.

이 full Fine-tuning은 따라서 총 1억개의 파라미터를 모두 학습시키는 것이다.

 

하지만 PEFT(Parameter-Efficient Fine-Tuning, 파라미터 효율적 미세조정)라는 기술이 막대한 비용으로 인해 불가능했던 위 작업을 가능하게 만들었다.

PEFT의 기술 중 하나인 LoRA에 대해 먼저 알아보자.


LoRA

$W_{tuned} = W_0 + \Delta W$

출처 : IBM, 기호는 약간 다르지만 의미는 같다

LoRA는 위 식의 $\Delta W$부분을 rank가 휠씬 작은 행렬로 근사시키는 방법이다.

$W_0$부분은 값이 고정된다.

즉 모든 변화는 뒤에서 일어나고 1억개의 기존 파라미터의 값들은 변하지 않는다.

$\Delta W$를 두개의 작은 행렬의 곱($B\bullet A$)으로 근사한다.

이 행렬의 곱 부분을 어댑터 라고도 한다.

 

예를 들어 $A,B$를

$A$ : 10000*8

$B$ : 8*10000

의 크기를 갖는 작은 행렬이라고 하자.

여기서 8은 사용자가 지정하는 값이고 당연히 늘리거나 줄일 수 있다.

만약 늘린다면 성능이 좋아지지만 그만큼 사용하는 자원도 늘어나게 된다.

 

이렇게 되면 파라미터 수는 1억개 → 16만개 로 줄어든다.

1퍼센트도 안되게 줄어든 것이다.

 

<초기화>

$A$행렬은 무작위의 값으로 초기화된다.

$B$행렬은 영행렬로 초기화된다.

 

따라서 전체 $\Delta W$는 영행렬이 되고,

따라서 처음에는 값의 업데이트가 이루어지지 않는다.

 

학습이 진행되며 두 행렬의 값이 바뀌게 된다.

 


QLoRA

위의 LoRA는 학습해야할 파라미터를 1퍼센트 보다도 더 적게 줄였다는 점에서 매우 맘에 들어보인다.

하지만 문제점이 있는데, 바로 기본 행렬의 저장공간은 full Fine-tuning과 비교해도 똑같다는 것이다.

즉, $W_0$의 1억개 파라미터를 모두 저장해놓아야한다.

 

이 부분이 VRAM을 잡아먹는 부분이다.

많이 쓰는 Llama 3 8B 모델은 16-bit 정밀도로 약 16GB를 차지한다. colab등에서 기본으로 사용할 수 있는 T4 GPU의 경우에는 이를 전부 로드할 수도 없다.

QLoRA는 이 문제도 해결하였다.

 

먼저 $W_0$를 16비트가 아닌 4비트 정밀도로 압축해 VRAM에 저장한다.

이 부분이 양자화 Quantization라고 부르는 작업이고 QLoRA의 Q가 이것을 의미한다.

그 이후는 LoRA와 같다.

 

위의 Llama 3 8B 모델의 경우 양자화를 적용하면 16GB에서 5~6GB 대로 줄어든다.

 


추가 장점

이런 튜닝은 연구 시에 좋은 점이 있는데,

만약 full fine-tuning을 해서 모델을 학습 시켰다면 그 모델의 전체 파라미터를 어딘가에 저장해놓아야 나중에 다시 사용할 수 있다.

다른 방향으로 학습을 여러번 시킨다면 용량이 큰 파일들이 여러개 생기게 된다.

 

하지만 LoRA와 같은 방식을 사용하면 어댑터 부분만 따로 저장가능하다.

기존 $W_0$행렬은 바뀌지 않았으므로 한번만 저장을 해놓고 여러 어댑터를 갈아끼면서 사용할 수 있다.

 

이는 GB단위에서 MB단위로 저장 단위를 바꿀 정도의 효과를 가져온다.

 


이론을 정리할 목적의 글이므로 관련 코드는 작성하지 않았다.