거대 언어 모델 튜닝을 위한 미니멀리스트 접근법: 1부 - PEFT 알아보기

2024. 4. 29.Tech

들어가며

 

안녕하세요. 케이뱅크 데이터서비스팀에서 AI 업무를 하고 있는 김하영입니다. 

 

이번 포스팅에서는 LLM(Large Language Model)이라 불리는 거대 언어 모델을 최소한의 비용과 인프라로 내 입맛에 맞게 조정하는 방법 중 하나인 PEFT(Parameter Efficient Fine-tuning)에 대해 다루어보려 합니다.

 

본 포스팅은 총 2부로 구성되어 있습니다. 1부에서는 LLM을 조정하는 여러가지 방법들을 소개합니다. 그리고 2부에서는 PEFT 방법 중에서도 가장 핵심이 되는 QLoRA에 대해 실제코드까지 자세히 살펴보겠습니다. 

 

 

 

'Large' 언어 모델, 만능인가?

점점 더 커져가고 있는 LLM 모델들

 

최근 메타에서 오픈소스 거대 언어 모델인 Llama 3를 공개했습니다. 8B 및 70B 라인업이며, 오는 7월에는 약 1,400억 개의 파라미터로 구성된 140B 모델도 선보일 예정입니다. 오픈AI의 GPT-3.5(175B, 1,750억 개)를 시작으로 GPT-4는 약 1조 7천억 개가 넘는 파라미터가 있다고 알려져 있고, 구글의 PaLM(540B, 5,400억 개), PaLM2(340B, 3,400억 개) 역시 파라미터 개수가 수천억을 가볍게(?) 넘고 있습니다. 이처럼, 글로벌 빅테크 기업들은 방대한 파라미터 수로 구성된 'large' 파운데이션 모델을 개발하며 LLM 시장에서의 경쟁을 이어가고 있습니다. 

 

그렇다면, 모델의 크기(=파라미터 수)가 클수록 무조건 성능이 좋은 것일까요? 파라미터가 수가 많을수록 모델은 더 다양하고 방대한 데이터셋을 활용해 학습할 수 있으며, 이를 통해 데이터의 복잡한 언어 구조와 문맥적 관계, 언어 패턴들을 보다 정확하게 학습하고 재현할 수 있습니다. 또한, 더 많은 정보를 저장하고 처리할 수 있어, 단일 작업뿐만 아니라 다양한 유형의 작업들을 수행할 수 있게 됩니다. 그러므로 GPT-3.5 또는 GPT-4를 기반으로 한 ChatGPT가 콘텐츠 생성, 문서 요약, 질문 응답, 번역과 같은 다양한 작업에서 뛰어난 성능을 보여주는 것입니다.

 

그러나 이러한 대규모 모델들도 금융, 법률, 의학 등 특정 전문 분야에 대해 질문하면 때로는 부정확한 답변을 제공할 수 있습니다. 이는 거대 언어 모델이 일반적인 지식에는 강하지만, 특정 도메인에 대한 깊이 있는 전문성을 가지기는 어렵다는 한계를 보여줍니다.

 

그러므로 어떤 도메인이나 작업에 특화된 모델을 만들기 위해서는 기존의 사전 학습된 모델(Pre-trained Language Model(PLM), 파운데이션 모델, 베이스 모델이라고도 함)을 적절히 '조정'하여 사용해야 합니다. 모델 조정에는 대표적으로 다음과 같은 방법들이 있습니다.

  • In-context Learning : 프롬프트 입력 시 관련 예시를 함께 제공합니다. 이 방법에서는 모델의 파라미터(가중치, 편향)는 업데이트되지 않습니다.
  • Full Fine-tuning : 모델의 모든 파라미터를 재학습하여 업데이트합니다.
  • PEFT(Parameter Efficient Fine-tuning) : 선택된 일부 파라미터만 학습하여 업데이트합니다.

 

그럼 하나씩 살펴보겠습니다.

 

 

 

1. In-context Learning

 

앞서 말씀드린 것처럼, GPT-4와 같은 대규모 언어 모델은 광범위한 분야의 풍부한 데이터로 학습되어 사용자의 다양한 요청에 효과적으로 대응할 수 있습니다. 이러한 모델은 In-context Learning을 통해 학습 과정에서 접한 다양한 패턴들을 활용하여, 사용자가 제공하는 몇 가지 예제만으로도 기본적인 추론을 수행할 수 있는 능력을 갖추고 있습니다. 이 방법은 모델의 가중치를 업데이트하지 않고 프롬프트 엔지니어링만으로 문제를 해결할 수 있어 효율적입니다.

 

Zero-shot Learning

Zero-shot은 LLM에게 예시를 주지 않고 바로 질문을 던져 답을 얻는 방식입니다. 번역이나 요약과 같은 대부분의 NLP 작업은 추가 예시 없이도 zero-shot만으로 수행할 수 있습니다.

[프롬프트]
영어를 한국어로 번역하세요.
yellow tiger

[결과]
노란 호랑이

 

Few-shot Learning

Few-shot은 질문을 할 때 여러 예시를 제공하고 모델이 그 형식에 맞춰 답변하도록 요구하는 방식입니다. 이 방식은 주어진 문장을 특정 형태로 변환하거나 분류, 요약하는 작업에서 유용합니다. 

[프롬프트]
주어진 문장을 아래의 예시와 같이 한국어로 번역하세요.
yellow tiger -> yellow 호랑이
blue bird -> blue 새
chat vert -> green 고양이
chiot blanc

[결과]
white 강아지

 

위의 예시처럼, LLM 자체의 성능이 좋아지면서 zero-shot, few-shot만으로도 다양한 작업에서 원하는 결과를 충분히 얻을 수 있습니다. 그러나 강력한 효과를 보이는 이 방법에도 단점은 있습니다. 프롬프트 입력 시 매번 예시를 함께 제공해야 하므로 계산, 메모리, 저장 비용이 증가하게 되고, 속도가 더 느려질 수 있습니다. 또한, 수행 가능한 작업의 유형과 그에 맞는 자연어 예시의 한계로 인해 특정 작업에서는 제약을 받을 수 있습니다.

 

 

 

2. Full Fine-tuning

 

파인튜닝은 LLM의 범용적인 성능을 특정 작업이나 도메인에 특화되도록 최적화하는 학습 방법입니다. 이를 통해 모델은 특정 분야의 지식을 더 깊이 있고 세밀하게 이해하고, 그에 따라 정교한 답변을 할 수 있게 됩니다. 예를 들어, 금융 분야의 데이터로 파운데이션 모델을 파인튜닝할 경우, LLM은 다양한 금융 용어와 개념, 상황 등을 학습하여 전문가 수준의 답변을 제공할 수 있습니다.

 

일반 LLM과 도메인 특화 LLM의 답변 예시

 

전체 파인튜닝에서는 사전 학습된 모델(PLM)의 모든 파라미터를 재학습하여 모든 가중치를 업데이트하며, 이는 작은 데이터셋에서도 효과적으로 수행될 수 있습니다. 그렇다면 전체 파인튜닝은 어떤 장점이 있을까요?

 

장점 1 : 적은 데이터로도 효과적인 학습 가능

전체 파인튜닝은 이미 일반적인 언어 구조를 이해하는 PLM을 기반으로 하기 때문에, 상대적으로 작은 도메인 데이터셋으로도 도메인 특화 모델을 효과적으로 만들 수 있습니다. 

 

장점  2 : 정확도 향상

특정 도메인의 데이터셋으로 파인튜닝을 하면, LLM은 해당 분야의 전문 용어와 특성 등을 더 잘 이해하게 됩니다. 이는 금융이나 법률, 의학 등과 같이 전문적인 지식이 필요한 영역에서 특히 중요하며, 이를 통해 모델은 새로운 케이스의 질문이 입력되더라도 더 정확하고 관련성 높은 답변을 생성할 수 있습니다.

 

위와 같은 장점들 덕분에 전체 파인튜닝은 모델을 특정 작업이나 분야에 최적화하는 방법으로 많이 활용되고 있습니다. 그러나 이 방법에도 몇 가지 단점이 존재합니다.

 

단점 1 : 높은 계산 비용

전체 파인튜닝은 PLM의 모든 파라미터를 업데이트해야합니다. 적게는 수십억에서 많게는 수백억, 수천억 개에 이르는 파라미터를 가진 대규모 언어 모델을 학습시키는 데는 엄청난 계산이 필요합니다. 비록 파인튜닝에 사용되는 데이터셋이 상대적으로 작더라도, 처리해야 할 토큰의 수가 많고 이로 인해서 계산 비용이 많이 듭니다.

 

단점 2 : 엄청난 GPU 메모리 요구량

10억 개의 파라미터로 구성된 1B 크기의 LLM을 로드하고 학습하는 데 얼마나 많은 GPU 메모리가 필요한지 살펴봅시다. 32비트 정밀도에서 한 개의 파라미터는 4바이트로 표현됩니다. 따라서 10억 개의 파라미터를 32비트 정밀도로 GPU RAM에 로드하는 데는 4GB의 GPU 메모리가 필요합니다. 모델을 학습시키기 위해서는 이보다 훨씬 많은 메모리가 필요한데, 각 파라미터에 대해 관련 최적화 상태, 기울기, 활성화, 임시 메모리 등 추가로 약 12~20바이트가 필요합니다. 즉, 파라미터 하나당 16~24바이트가 필요하며, 1B짜리 모델을 로드하고 학습하는 데 최대 24GB 정도의 GPU 메모리가 필요합니다. 

모델 크기 (파라미터 수) 로드 시 GPU 메모리 학습 시 GPU 메모리 8비트 정밀도 양자화 시 GPU 메모리
1B 4 GB 16 ~ 24 GB 4 ~ 6GB
7B  28 GB 112 ~ 168 GB 28 ~ 42 GB
10B 40 GB 160 ~ 240 GB 40 ~ 60 GB
70B 280 GB 1120 ~ 1680 GB 280 ~ 420 GB
140B 560 GB 2240 ~ 3360 GB 560 ~ 840 GB

위 표와 같이, 파라미터 수가 증가함에 따라 필요한 GPU 메모리의 양도 기하급수적으로 증가합니다. 모델 가중치의 정밀도를 낮추는 양자화(Quantization) 기법을 통해 필요한 GPU 메모리 양을 32비트 정밀도의 절반 또는 그 이하로 줄일 수도 있습니다. 그럼에도 불구하고, 이러한 큰 규모의 모델은 개인은 물론이고 일반 기업들도 큰 투자 없이는 학습하기 어려운 수준입니다. LLM 학습에 많이 사용되는 GPU 제품인 NVIDIA의 A100 80GB와 H100 80GB의 경우, 각각의 가격은 1장당 약 2천만 원과 4천만 원으로 상당히 고가입니다. 이는 당연히 비용적인 측면에서도 큰 부담이 될 수 있습니다.

 

단점 3 : Catastrophic Forgetting

Catastrophic Forgetting은 '급격한 망각'으로도 번역되는데, 모델이 이전에 학습된 데이터와 다른 새로운 데이터로 학습될 때 기존에 학습했던 정보를 급격히 잊어버리는 현상을 나타냅니다. 즉, 모델이 과거의 학습을 유지하지 못하고 새로운 데이터에만 최적화되어 이전 데이터에 대한 성능이 크게 떨어지게 되는 것입니다. 이러한 현상은 모든 파라미터가 조정되는 전체 파인튜닝에서 특히 발생할 가능성이 높습니다. 

 

이러한 이유로 전체 파인튜닝은 특정 도메인이나 작업에 모델을 최적화하는 효과적인 방법이지만, 비용 및 시간, 리소스 관리 등의 측면에서 신중하게 고려되어야 합니다.

 

 

 

3. PEFT (Parameter Efficient Fine-tuning)

 

최근 몇 년 동안, 거대 언어 모델의 규모가 점점 커지면서 이를 파인튜닝하는 데 필요한 비용도 크게 증가했습니다. 이에 따라, 비용 효율적인 파인튜닝 방법이 많이 연구되었고, 그 결과로 PEFT(Parameter Efficient Fine-tuning)라는 접근 방법이 등장하게 되었습니다.

 

PEFT의 주요 목적은 거대 언어 모델을 효율적으로 조정하여 필요한 리소스와 비용을 대폭 줄이는 것입니다. 이 방법은 모델의 전체 파라미터 중 일부만을 선택적으로 조정함으로써, 모델의 핵심 구조를 유지하면서도 특정 기능이나 작업에 맞게 모델을 조정할 수 있습니다.

 

PEFT는 모델의 특정 부분에 작은 추가 파라미터 계층을 삽입하거나, 기존 파라미터 중 소수만 조정하는 방식으로 수행됩니다. 모델의 전체 파라미터를 업데이트하지 않기 때문에 많은 비용과 시간을 절약할 수 있습니다. 주로 사용되는 기술들은 다음과 같습니다.

  • Adapter Layers : 모델의 기존 아키텍처 사이에 작은 신경망 층을 추가합니다. 학습 시 기존 파라미터는 고정되고 Adapter 레이어의 파라미터만 학습하므로 계산량을 줄일 수 있습니다.
  • Prompt Tuning : 특정 입력에 대한 응답을 조정함으로써 모델이 새로운 작업을 수행할 수 있도록 합니다. 이 방법은 모델의 전체 가중치를 변경하지 않고 입력 프롬프트에 해당하는 파라미터만을 학습합니다. 프롬프트 파라미터는 모델 전체 파라미터에 비해 훨씬 작기 때문에 학습 시간이 단축됩니다.
  • LoRA(Low-rank Adaptation) : 모델의 가중치 행렬에 저차원 행렬을 적용하여, 원래의 가중치는 유지하면서 소수의 파라미터만 조정하는 방법입니다.

 

LoRA와 더 경량화된 방법인 QLoRA에 대해 더 자세히 설명드리겠습니다.

 

3.1. LoRA (Low-Rank Adaptation)

LoRA는 2023년 초에 Microsoft에서 발표한 PEFT 방법 중 하나로, 이후 가장 일반적으로 사용되고 있습니다. LoRA는 Adapter 유형에 속하는 방법으로, PLM의 기존 가중치는 고정 상태로 유지하면서 학습이 가능한 저차원의 가중치 행렬을 추가하여 모델을 조정합니다. 새로 추가된 가중치 행렬(LoRA 가중치)은 기존 가중치에 비해 훨씬 낮은 차원을 가지며, 파라미터 수를 크게 줄이면서도 모델의 성능을 유지하거나 향상시킬 수 있습니다.

 

LoRA의 구성 요소와 작동 원리를 자세히 살펴보겠습니다.

 

 왼쪽의 파란색 모듈은 모델의 원래 가중치이고, 오른쪽의 주황색 모듈은 학습하려는 LoRA 가중치를 나타냅니다. PLM의 원래 가중치(W)는 고정되어 학습 중에는 수정되지 않습니다. 대신 새로운 행렬인 A B 가 추가되며, 이 두 행렬은 다음과 같이 구성됩니다.

  • A : d x r 차원의 행렬로, 여기서 d 는 원래 가중치 행렬 W 의 차원, r  은 분해 순위를 나타냅니다.
  • B : r  x d 차원의 행렬로, A 와 곱해져 원래 가중치 행렬 W 와 같은 d x d 크기의 행렬을 형성합니다.

 

이 두 행렬 A B 의 곱은 원래 가중치 행렬 W 와 합산되어 최종 출력에 영향을 미치게 됩니다. 이 과정에서 r 의 크기는 매우 중요한데, r 이 작으면 학습되는 파라미터 수가 줄어들어 학습이 빠르고 비용 효율적이지만, 너무 작으면 모델의 성능이 제한될 수 있습니다. r 이 크면 더 복잡한 작업을 처리할 수 있지만, 학습 시간과 비용이 증가합니다.

 

3.2. QLoRA (Quantized LoRA) 

QLoRA는 LoRA의 확장된 형태로,  LoRA 기법에 새로운 형태의 양자화를 적용하여 메모리 사용과 계산량을 더욱 줄이는 방법입니다. 이 방법은 PLM의  가중치를 고정하고 LoRA 가중치만을 학습하는 점에서 LoRA와 동일하지만, PLM에 추가적인 양자화를 통해 모델을 더욱 경량화합니다.

 

QLoRA는 다음과 같이 3가지 기술을 통해 LoRA의 모델 크기를 줄입니다.

 

4-bit NormalFloat (NF4)

4-bit NormalFloat은 가중치 값을 4비트로 양자화하는 기법입니다. 일반적으로 사용되는 32비트 부동소수점(32bit floating point, FP32) 표현 대신 4비트를 사용함으로써 데이터를 표현하는 데 필요한 비트 수를 대폭 줄입니다. 

보통 컴퓨터에서 실수를 표현할 때 사용하는 데이터 타입은 FP32입니다. 이 포맷은 1비트의 부호(sign), 8비트의 지수(exponent), 23비트의 가수(mantissa)로 구성됩니다. 높은 정밀도를 제공하여 복잡한 계산과 민감한 데이터 처리에 적합하지만, 그만큼 메모리 사용량과 계산 요구량이 높습니다.
FP16은 2바이트로 표현되며 모델 경량화를 위해 가장 쉽게 사용할 수 있는 데이터 타입입니다. 이 포맷은 1비트의 부호, 5비트의 지수, 10비트의 가수로 구성됩니다. FP32에 비해 메모리 사용량과 계산 속도가 개선되어, 빠른 학습 및 추론이 가능합니다. 그러나 정밀도가 감소하므로, 일부 고정밀이 요구되는 계산에서는 부적합합니다.
BF16은 구글에서 개발한 16비트 부동소수점 포맷으로, FP32와 동일한 8비트의 지수를 사용하지만 가수는 7비트만을 사용합니다. 이 포맷은 FP32와 유사한 범위의 값을 표현할 수 있으며, FP16보다 더 높은 정밀도를 제공하면서도 메모리와 계산 효율성은 FP16 수준을 유지합니다. 그러나 NVIDIA A100 등 최신 하드웨어에서만 지원되므로 제품 확인이 필요합니다. 
INT8(8-bit integer) 8비트 정수 포맷으로, 부동소수점 대신 정수를 사용하여 데이터를 표현합니다. 메모리 요구량을 크게 줄이고 추론 속도를 빠르게 하지만, 낮은 정밀도를 제공하므로 일부 세밀한 정보가 손실될 수 있습니다.

 

NF4는 학습 시 고정되는 PLM 가중치에만 적용되고, 학습되는 LoRA 가중치는 BF16 포맷을 사용합니다. 그리고 학습이 완료되면 PLM과 LoRA의 출력을 합산할 때 PLM의 NF4는 BF16으로 역양자화됩니다.

 

Double Quantization

이중 양자화는 가중치를 양자화할 때 발생하는 양자화 상수와 같은 부가적인 파라미터를 한 번 더 양자화하는 기법입니다. NF4로 양자화된 가중치를 한 번 더 양자화하는 것은 아니고, 가중치를 양자화할 때 발생하는 양자화 상수를 대상으로 양자화 하여 메모리 공간을 더욱 줄이는 방법입니다.

 

Paged Optimization

Paged Optimization은 모델의 가중치를 페이지 단위로 분할하여 메모리를 최적화하는 기술입니다. 이 방식은 필요한 가중치만을 메모리에 동적으로 로딩하여 전체 메모리 사용량을 관리합니다. 특히 GPU 메모리가 부족할 경우 CPU RAM이나 디스크로 메모리 사용을 확장하여 GPU 메모리의 한계를 극복하고 OOM(Out of Memory) 상황을 방지할 수 있습니다.

 

 

 

마치며

이번 포스팅에서는 모델을 조정하는 여러 방법 중 PEFT 방법론에 대해 알아봤습니다. 특히 LoRA와 QLoRA는 리소스의 제약을 받는 환경에서도 뛰어난 모델 성능을 유지하도록 도와주는 중요한 기술로, PEFT 방법 중 가장 널리 사용되고 있습니다.

 

다음 포스팅에서는 이론적으로 다룬 QLoRA를 실제로 구현해보도록 하겠습니다. 

 

 

 

Reference

 

Inside language models (from GPT to Olympus)

Language model sizes Summary of current models Compute Context windows Achievements unlocked: Emergent abilities of LLMs Large language models: API or on-premise Increasing dataset sizes 2018-2023 GPT-3’s top 10 datasets by domain/source Contents of GPT-

lifearchitect.ai

 

LLM Training & GPU Memory Requirements: Examples - Analytics Yogi

LLM GPU Memory Requirements Explained with Examples, Distributed Clusters of GPUs, Quantization, NVIDIA GPU Example

vitalflux.com

 

Fine Tuning LLM: Parameter Efficient Fine Tuning (PEFT) — LoRA & QLoRA — Part 1

Parameter Efficient Fine Tuning — LoRA, QLoRA — Concepts

abvijaykumar.medium.com