AI Engineering/실습

튜닝 방법론 PiSSA와 LoftQ

마늘냄새폴폴 2026. 10. 11. 22:14

안녕하세요! 여러분은 LoRA를 이용해서 많이들 튜닝하고 계신가요? 특히 제한된 컴퓨팅 용량으로 인해 QLoRA나 QDoRA를 많이들 사용하실 것 같습니다. 

 

이번 포스팅에서는 QLoRA와 QDoRA를 사용할 때 고려할 수 있는 방법론 두가지를 가져왔습니다. PiSSA와 LoftQ입니다. 이 둘다 LoRA, QLoRA를 이용해서 튜닝할 때 생기는 문제를 보완하기 위해 생긴 방법론입니다. 

 

지금 바로 시작해보죠!

 

LoRA란?

LoRA에 대해서 다시 짚고 넘어가도록 하겠습니다. LoRA는 Full Finetunning에서 생기는 문제에서 출발합니다. 

 

Full Finetunning은 학습에 모든 파라미터를 건드리기 때문에 굉장히 많은 컴퓨팅 용량이 필요했고 시간도 어마어마하게 많이 걸리는 문제가 있었습니다. 

 

만약 파라미터가 31B 즉, 310억개면 310억개에 해당하는 모든 파라미터를 건드려야하므로 310억 x 310억 이 되는데요. 일반적으로 사용하지도 않는 숫자 단위로 넘어가는 이 상황이 LoRA는 맘에 들지 않았습니다. 

 

LoRA의 출발점은

 

"학습에 모든 파라미터가 중요해?"

에서 시작합니다. 

 

여기에 LoRA는 rank라는 개념을 도입하고 베이스모델을 얼린 뒤 rank만큼 차원을 줄였다가 늘리고 그 차이인 ΔBA를 이용해서 기존 파라미터를 모두 건드리는 대신 크기와 방향을 살짝만 바꾸도록했습니다. 

 

LoRA는 베이스 모델이 올라갈 공간 + feature 들의 델타값이 들어가야하기에 만만치않은 VRAM이 필요했습니다. 기업이 아니라 개인이 100GB가 넘는 자원을 점유하기란 쉽지않았죠. 

 

그래서 QLoRA가 등장했습니다. 기존 모델을 BF4로 양자화하고 이 양자화된 모델에 대한 델타를 뽑고 다시 크기를 키워 보정하는 작업이 들어갔습니다. 

 

다만 LoRA에 비해 BF4로 양자화하는 과정에서 생기는 손실은 원래대로 돌아왔을 때 성능을 보장받지 못했습니다. 

 

PiSSA의 등장

LoRA는 학습할 때 문제가 하나 있었습니다. 

 

바로 학습을 진행할 때 0부터 시작해서 조금씩 값을 조정하면서 알맞는 값을 찾아간다는 것이었죠. epoch을 진행하면서 값을 찾아가는데 PiSSA를 연구한 사람들이 불만을 가졌습니다. 

 

"그냥 처음 학습할 때부터 좀 괜찮은 값으로 시작하면 안돼?"

 

PiSSA는 우선 rank에 해당하는 가장 높은 파라미터를 찾습니다. 그리고 베이스 모델의 가중치에서 값을 최적화해서 초기화합니다. 

 

미리 최적의 값으로 세팅하고 학습을 진행하면 생기는 이점이 뭘까요?

 

  1. 시간이 단축된다
  2. 최대 2 x rank 만큼의 학습 효율이 높아진다

중요한건 두번째인데요. 

 

왜 2배만큼 학습 효율이 높아지는지 수식이 있지만 수식은 빼고... 만약 rank가 8이었다면 최대 16으로 돌린 효과가 나온다는 것입니다. 

 

하지만 rank의 효율이 높아진다고 같은 것은 아닙니다. GPU 자원은 rank 8로 적용되지만 효율이 좋아진다는 의미인데요. PiSSA의 원논문에서는 LoRA에 비해 5%정도 높은 성능을 보였다고 주장했습니다. 

 

애게.. 겨우 5%? 하실  수 있지만 이게 양자화되는 QPiSSA로 들어가면 살짝 얘기가 달라집니다. 

 

QLoRA에서 문제가 양자화 된 만큼 손실이 일어날 수 있다는 점이 문제였었죠? PiSSA는 양자화한 상태에서의 최적값을 찾아 초기화하기 때문에 양자화로 인한 손실이 줄어든다는 것이 연구진들의 주장입니다. 

 

LoftQ란?

LoftQ는 QLoRA에서 생기는 양자화로 인한 손실 그 자체에 중점을 둔 방식입니다. 기본적으로 LoRA는 베이스 가중치인 W에 ΔBA만큼을 움직이는 과정이었죠? 

 

여기에 LoftQ는 베이스 가중치 W도 다시 둘로 나눕니다. 베이스 가중치 W와 양자화로 인한 손실을 보정하죠. 

 

PiSSA는 LoRA의 성능을 올리고 rank의 효율을 높이기 위해 설계된 방법론이라면 LoftQ는 오롯이 QLoRA 시 발생하는 손실을 최소화하기 위함이었습니다. 

 

LoftQ의 장점은 이것만 있는 것은 아니었는데요. rank 만큼 주요 파라미터들의 최적값을 계산해야하는 PiSSA와 다르게 양자화로 발생하는 손실만 계산해서 보정하는 LoftQ는 구현하기도 굉장히 간단했습니다. 

 

그래서 QLoRA + LoftQ 조합으로 사람들에게 많은 사랑을 받게 되었습니다. 

 

또한, QLoRA보다 높은 성능을 자랑하는 QDoRA와 호환도 나름 준수해서 많은 사람들이 사용하는 방법론이 되었습니다. 

 

QDoRA와 PiSSA는 상극

사람들이 QDoRA + QPiSSA 조합도 시도를 해봤지만 그리 쉽지는 않았습니다. 

 

단순히 양자화의 손실만큼을 베이스 가중치에 보정하는 LoftQ와 다르게 최적의 파라미터로 초기화하는 PiSSA는 안그래도 magnitude를 따로 계산해야하는 DoRA와 극상성이었기 때문입니다. 

 

DoRA의 철학은 크기와 방향이 모두 바뀌는 LoRA 대신 방향은 LoRA로, 크기는 magnitude로 따로 학습하자. 라는 개념입니다. 이때 QDoRA를 적용하면 양자화로 발생하는 손실까지 magnitude에 반영되어야 했기 때문에 QDoRA 자체도 QLoRA에 비해 신경써야하는 부분이 있었는데 여기에 파라미터를 최적화하는 QPiSSA까지 적용하려니 쉽지 않았던 것이죠. 

 

그래서 정리하자면 PiSSA와 LoftQ는 이런 복잡도를 가지고 있습니다. 

 

  1. QLoRA + LoftQ : 쉬움
  2. QDoRA + LoftQ : 중간
  3. QLoRA + PiSSA : 중간
  4. QDoRA + PiSSA : 어려움

이때문에 QDoRA는 PiSSA와 어울리지 않고 PiSSA가 LoftQ에 비해 구현 난이도가 있고 rank의 효율이 높아진다는 말은 과적합의 위험성도 같이 커진다는 의미이기 때문에 개발자들은 데이터가 많아 rank를 높여도 문제없는 상황에서는 PiSSA를 사용하더라도 대부분의 경우 사용하지 않는 것 같습니다. 

 

마치며

이번 포스팅에서는 LoRA를 도입할 때 같이 사용하면 괜찮은 방법론 PiSSA와 LoftQ에 대해서 알아봤습니다. 저도 QDoRA + LoftQ 조합을 많이 쓰는데 QDoRA에서의 양자화 손실을 LoftQ가 어느정도는 방어한다지만 드라마틱한 차이는 없는 것 같습니다. 

 

다만 디테일한 부분에서 LoftQ의 방어가 눈에 보이는데 이건 QDoRA를 단독으로 사용하는 경우와 LoftQ를 같이 얹었을 때의 결과를 보면 보이는데 사람들이 많이 쓰는데는 이유가 있더군요. 

 

우선 구현이 쉽다는게 장점이고 양자화로 손실이 무너지는걸 막아주는게 눈에 띄니까 선호하게 되는 것 같습니다. 

 

이번 포스팅은 여기서 마치도록 하겠습니다. 긴 글 읽어주셔서 감사합니다! 오늘도 즐거운 하루 되세요!