cleanUrl: "/Finetuning_Llama"
floatFirstTOC: right

RAG와 파인튜닝

초거대언어모델은 일반적인 과제를 잘 처리하는 장점이 있다. 우리가 ChatGPT에 열광하는 이유 역시 일반적인 지식 질문이나 추론에 대해 필요한 답변을 훌륭하게 생성하기 때문이라고 생각한다. 하지만 실생활에서 대규모 언어모델이 유의미하게 사용되려면 개인 또는 조직 단위로 특수한 데이터를 학습해야 할 필요가 있다. 이번 아티클에서는 RAG와 파인튜닝의 두 가지 방법론을 다룬다. 두 접근 방식은 모두 초거대 언어 모델을 기반으로 개인화하는 방법이지만, 비용과 성능 대비 차이가 있다.

먼저, 언어 모델을 커스텀하게 사용하는 방법으로 파인튜닝이 있다. 사전 학습된 초거대 언어 모델(Large language model, LLM)에 작은 데이터 세트에 대해 추가로 학습시켜 특정한 작업에 맞게 미세하게 조정하고 성능을 개선하는 방법이다. 전통적으로 파인튜닝은 거대한 단위의 웹 데이터를 사전 학습하고 작은 분야의 과제에 따라 튜닝을 진행하는 방법이었다. 그런데 모델의 파라미터 수가 점점 커지면서 기업이나 연구자가 모델 전체를 파인튜닝하는 것이 힘들어졌고 파인튜닝한 모델의 저장과 사용 비용 또한 매우 커졌다. 이 외에도 새로운 정보를 학습할 때 이전에 학습한 정보를 갑자기 급격하게 잊어버리는 현상, 즉, 파괴적 망각(Catastrophic forgetting)으로 불리는 현상 역시 해결에 어려움이 있었다.

ChatGPT등의 LLM 모델이 산업적으로 대두되기 시작한지 이제 막 1년이 지나면서, 각 기업들이 찾은 비용 효율적인 대안이 RAG라고 할 수 있다. RAG 기법은 LLM의 강력한 텍스트 생성력을 기반으로, 사용자 쿼리에 맞는 필요한 문서 스니펫을 적절하게 가져와서 모델에 프롬프트를 통해 제공하여 응답하는 방법이다. LlamaIndex와 Langchain과 같은 개발자 도구나 unstructured.io와 같은 전처리 SDK, 그리고 Milvus와 같은 여러 상업용의 벡터 서치 DB가 최근 1년 동안 유치한 투자 금액과 밸류에이션을 보면 산업계에서의 RAG 기법에 대한 관심도는 쉽게 유추할 수 있을 것이다.

사진 출처: OpenAI - A Survey of Techniques for Maximizing LLM Performance https://youtu.be/ahnGLM-RC1Y

사진 출처: OpenAI - A Survey of Techniques for Maximizing LLM Performance https://youtu.be/ahnGLM-RC1Y

하지만 모델의 목적 자체를 더욱 자유롭게 바꾸어낼 수 있다는 점에서 파인튜닝이 가지는 매력도 무시하기 어렵다. 모델이 응답하는 스타일이나 톤앤매너, 포맷과 같이 어떤 질적인 면모를 바꾸거나, 원하는 형태의 아웃풋이 잘 나올 것이라는 어떤 신빙성을 더욱 보장하거나, Text를 SQL로 바꾼다는 등의 프롬프트만으로는 설명하기 어려운 특정한 작업에 특화되어야 할 때에는 파인튜닝이 유리한 경우도 있겠다.

OpenAI는 지난 DevDay에서 파인튜닝과 RAG가 필요한 경우를 2개의 축으로 정리해서 소개했다. 모델의 지식적인 측면을 수정하고자 하는 경우에는 RAG를, 모델이 어떻게 답변하고 추론하는 지를 수정하고자 하는 경우에는 파인튜닝이 적합하다고 소개했다.

과거에는 쉽지만은 않았던 베이스 모델의 파인튜닝이 두 가지 측면에서 점점 일반 개발자들에게 접근 가능한 형태로 다가오고 있다고 생각한다. 하나는 상용화된 모델의 클라우드 서비스로서의 파인튜닝 API를 제공하는 것과, 또 하나는 파인튜닝 과정 전반에서의 난이도가 낮아짐으로서 약간의 지식만 갖춘다면 공개 모델을 이용하여 나만의 데이터셋을 가지고 Private한 환경에서 파인튜닝을 진행할 수 있게 된 것이다. 이번 아티클 시리즈를 통해서는 이와 같이 나만의 데이터셋으로 파인튜닝하는 과정을 실습할 것이다.

  1. 오픈소스 기반의 거대 언어 모델을 바탕으로, 나만의 Private한 데이터셋을 통해 모델을 파인튜닝한다.
  2. 해당 모델의 인퍼런스를 WebGPU를 활용하여 로컬에서 수행함으로써 민감한 나의 정보를 외부로 노출시키지 않고도 로컬에서 나만의 LLM을 구동할 수 있다.

이번 아티클을 통해서는 Meta AI에서 공개한 LLaMA 7B Chat 모델을 바탕으로 QLoRA 기법을 활용하여 나만의 데이터셋을 파인튜닝하여 허깅페이스 (Hugging Face) 에 배포해보도록 하겠다.

경제적인 파인튜닝을 위한 PEFT와 QLoRA 기법

개인이나 회사의 비공개 데이터셋을 사용하는데 민감한 데이터를 외부로 반출하지 않고도 나만의 모델을 지속적으로 튜닝하고 업데이트할 수 있다면, AI를 “최고로 길들이고 키울 수 있는” 방법이 될 것이다. 파인튜닝을 사용하는 방법 역시 다소 쉬워졌는데 먼저, GPU에 접근할 수 있는 하드웨어적인 보급도가 올라가면서 동시다발적으로 웹에서 GPU를 직접 접근할 수 있게 되어 일반 개발자들이 CUDA 프로그래밍에 대한 높은 이해가 없이도 웹에서 인퍼런스를 수행할 수 있게 되었다. 또한 파인튜닝을 진행할 때 모델 전체의 파라미터를 수정하지 않고도 일부 파라미터만 업데이트를 하더라도 전체 파라미터를 수정했을 때에 준하는 수준의 성능을 기대할 수 있을 정도로 간소화된 기법이 대중화되고 있다.

사진 출처: PyTorch Lightning (https://lightning.ai/pages/community/lora-insights/)

사진 출처: PyTorch Lightning (https://lightning.ai/pages/community/lora-insights/)

최근 들어 등장하고 있는 여러 파인튜닝 기법으로 체크포인트 기법이나 PEFT (Parameter Efficient Fine-tuning) 등이 대두되고 있다. PEFT는 모델 전체의 파라미터를 튜닝할 필요가 없이, 일부 파라미터를 튜닝하더라도 모델의 성능을 적은 자원으로 튜닝할 수 있도록 하는 방법을 의미한다. PEFT에는 LoRA (Low Rank Adapation) 기법이 주로 사용되고 있고, 최근에는 QLoRA 기법이 제시되고 있다. LoRA는 고정 가중치를 가지고 있는 Pretrained된 모델을 기반으로 추가 학습이 가능한 Rank Decomposition 행렬을 트랜스포머 아키텍처의 각 레이어에 붙인 것이다. 다시 말해 훈련 가능한 레이어를 추가해서 별도의 훈련을 통해 학습시킨 것이다.

사진 출처: https://lightning.ai/pages/community/lora-insights/

사진 출처: https://lightning.ai/pages/community/lora-insights/

LoRA는 Low Data Regime처럼 데이터가 적은 상황에서도 파인튜닝하기 용이하다는 장점이 있으며 도메인 외부의 데이터를 일반화할 때 좋은 성능을 보이는 것으로 알려져 있다. 우리가 LoRA를 통해 학습한 가중치는 작은 양이지만 사전 학습된 LLM 모델 레이어의 맨 윗 부분을 차지하게 되며, 다른 파라미터에 얼마나 영향을 줄 지 hyper parameter를 적절히 설정함으로서 모델의 성능을 결정할 수 있다.