[Daily morning study] LoRA์™€ PEFT (Parameter-Efficient Fine-Tuning)

#daily morning study

Image


์™œ PEFT๊ฐ€ ํ•„์š”ํ•œ๊ฐ€

LLM์„ ํŠน์ • ๋„๋ฉ”์ธ์— ๋งž๊ฒŒ ํŒŒ์ธํŠœ๋‹ํ•˜๋ ค๋ฉด ์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค. GPT-3๋Š” 175B, LLaMA-2๋Š” 70B ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ด ๋ชจ๋ธ๋“ค์„ Full Fine-Tuningํ•˜๋ฉด ์—„์ฒญ๋‚œ GPU ๋ฉ”๋ชจ๋ฆฌ์™€ ์‹œ๊ฐ„์ด ์†Œ๋ชจ๋œ๋‹ค.

PEFT(Parameter-Efficient Fine-Tuning)๋Š” ๋ชจ๋ธ ์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ ์ค‘ ๊ทนํžˆ ์ผ๋ถ€๋งŒ ํ•™์Šตํ•ด์„œ Full Fine-Tuning์— ์ค€ํ•˜๋Š” ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค์˜ ์ด์นญ์ด๋‹ค.


LoRA (Low-Rank Adaptation)

ํ•ต์‹ฌ ์•„์ด๋””์–ด

2021๋…„ Microsoft๊ฐ€ ๋ฐœํ‘œํ•œ ๋…ผ๋ฌธ์—์„œ ์ œ์•ˆํ•œ ๋ฐฉ๋ฒ•. ํ•ต์‹ฌ ๊ฐ€์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์‚ฌ์ „ํ•™์Šต๋œ ๋ชจ๋ธ์˜ ๊ฐ€์ค‘์น˜ ํ–‰๋ ฌ์€ ๋‚ฎ์€ ๋‚ด์žฌ์  ์ฐจ์›(low intrinsic dimension)์„ ๊ฐ€์ง„๋‹ค. ์ฆ‰, ํŒŒ์ธํŠœ๋‹ ๊ณผ์ •์—์„œ ์‹ค์ œ๋กœ ๋ณ€ํ™”ํ•˜๋Š” ์ •๋ณด๋Ÿ‰์€ ์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜์— ๋น„ํ•ด ํ›จ์”ฌ ์ž‘๋‹ค.

์ด ๊ฐ€์ • ์•„๋ž˜, ๊ฐ€์ค‘์น˜ ๋ณ€ํ™”๋Ÿ‰ ฮ”W๋ฅผ ๋‘ ๊ฐœ์˜ ์ €๋žญํฌ ํ–‰๋ ฌ๋กœ ๋ถ„ํ•ดํ•œ๋‹ค.

W' = W + ฮ”W = W + B ร— A
  • W: ์›๋ž˜ ์‚ฌ์ „ํ•™์Šต ๊ฐ€์ค‘์น˜ (๊ณ ์ •, ํ•™์Šต ์•ˆ ํ•จ)
  • A: shape (r, d_in) โ€” ๋žœ๋ค ๊ฐ€์šฐ์‹œ์•ˆ์œผ๋กœ ์ดˆ๊ธฐํ™”
  • B: shape (d_out, r) โ€” 0์œผ๋กœ ์ดˆ๊ธฐํ™”
  • r: rank (ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ, ๋ณดํ†ต 4~64)

์ดˆ๊ธฐํ™”ํ•  ๋•Œ B=0์ด๋ฏ€๋กœ ํ•™์Šต ์‹œ์ž‘ ์‹œ ฮ”W=0์ด ๋ณด์žฅ๋œ๋‹ค. ์ฆ‰, ํ•™์Šต ์ดˆ๊ธฐ์—๋Š” ์›๋ž˜ ๋ชจ๋ธ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ ์ ˆ๊ฐ ํšจ๊ณผ

์›๋ž˜ ๊ฐ€์ค‘์น˜ ํ–‰๋ ฌ์ด d ร— k ํฌ๊ธฐ๋ผ๋ฉด:

๋ฐฉ์‹ํ•™์Šต ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜
Full Fine-Tuningd ร— k
LoRA (rank r)r ร— (d + k)

์˜ˆ: d=4096, k=4096, r=8 ์ด๋ฉด

  • Full: 16,777,216๊ฐœ
  • LoRA: 65,536๊ฐœ โ†’ ์•ฝ 256๋ฐฐ ๊ฐ์†Œ

์ถ”๋ก  ์‹œ ์˜ค๋ฒ„ํ—ค๋“œ ์—†์Œ

ํ•™์Šต์ด ๋๋‚˜๋ฉด W + Bร—A๋ฅผ ๋ฏธ๋ฆฌ ํ•ฉ์ณ์„œ W์— ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ถ”๋ก  ๋‹จ๊ณ„์—์„œ๋Š” ์ถ”๊ฐ€ ์—ฐ์‚ฐ์ด ์ „ํ˜€ ์—†๋‹ค.

# ํ•™์Šต ํ›„ ๊ฐ€์ค‘์น˜ ๋ณ‘ํ•ฉ ์˜ˆ์‹œ
merged_weight = pretrained_W + lora_B @ lora_A

์ฃผ์š” PEFT ๊ธฐ๋ฒ• ๋น„๊ต

1. Adapter

Transformer์˜ ๊ฐ ๋ ˆ์ด์–ด์— ์ž‘์€ ๋ณ‘๋ชฉ(bottleneck) ๋ ˆ์ด์–ด๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค. ์˜ค์ง ์ด ์–ด๋Œ‘ํ„ฐ ๋ ˆ์ด์–ด๋งŒ ํ•™์Šตํ•œ๋‹ค.

[๊ธฐ์กด ๋ ˆ์ด์–ด] โ†’ [Down-projection] โ†’ [Non-linear] โ†’ [Up-projection] โ†’ [๊ธฐ์กด ๋ ˆ์ด์–ด ์ถœ๋ ฅ์— ๋”ํ•จ]
  • ์žฅ์ : ๊ตฌํ˜„์ด ์ง๊ด€์ 
  • ๋‹จ์ : ์ถ”๋ก  ์‹œ ์–ด๋Œ‘ํ„ฐ ์—ฐ์‚ฐ์ด ์ง๋ ฌ๋กœ ์ถ”๊ฐ€๋˜์–ด ๋ ˆ์ดํ„ด์‹œ ์ฆ๊ฐ€

2. Prefix Tuning

์ž…๋ ฅ ์‹œํ€€์Šค ์•ž์— ํ•™์Šต ๊ฐ€๋Šฅํ•œ โ€œ๊ฐ€์ƒ ํ† ํฐ(prefix)โ€์„ ๋ถ™์—ฌ ๋ชจ๋ธ ๋™์ž‘์„ ์œ ๋„ํ•œ๋‹ค. ํ”„๋กฌํ”„ํŠธ ํŠœ๋‹๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋ชจ๋“  ๋ ˆ์ด์–ด์— prefix๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

[PREFIX ํ† ํฐ๋“ค] + [์‹ค์ œ ์ž…๋ ฅ ํ† ํฐ๋“ค] โ†’ Transformer
  • ์žฅ์ : ๋ชจ๋ธ ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์—†์Œ
  • ๋‹จ์ : ์‹œํ€€์Šค ๊ธธ์ด๊ฐ€ ๋Š˜์–ด๋‚˜ ์ปจํ…์ŠคํŠธ ์ฐฝ ์†Œ๋ชจ

3. Prompt Tuning

Prefix Tuning์˜ ๋‹จ์ˆœํ™” ๋ฒ„์ „. ์ž…๋ ฅ ์ž„๋ฒ ๋”ฉ ๋ ˆ์ด์–ด์—๋งŒ ํ•™์Šต ๊ฐ€๋Šฅํ•œ soft prompt๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • ์žฅ์ : ๊ฐ€์žฅ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜๊ฐ€ ์ ์Œ
  • ๋‹จ์ : ๋ชจ๋ธ์ด ํด์ˆ˜๋ก ์„ฑ๋Šฅ์ด ์ข‹๊ณ , ์ž‘์€ ๋ชจ๋ธ์—์„œ๋Š” Full Fine-Tuning ๋Œ€๋น„ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ํผ

4. IAยณ (Infused Adapter by Inhibiting and Amplifying Inner Activations)

์–ดํ…์…˜์˜ ํ‚ค(K), ๊ฐ’(V), ํ”ผ๋“œํฌ์›Œ๋“œ ๋ ˆ์ด์–ด์˜ ํ™œ์„ฑํ™”์— ํ•™์Šต ๊ฐ€๋Šฅํ•œ ์Šค์ผ€์ผ๋ง ๋ฒกํ„ฐ๋ฅผ ๊ณฑํ•˜๋Š” ๋ฐฉ์‹. LoRA๋ณด๋‹ค ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜๊ฐ€ ํ›จ์”ฌ ์ ๋‹ค.


๊ธฐ๋ฒ• ๋น„๊ต ์š”์•ฝ

๊ธฐ๋ฒ•์ถ”๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ์ถ”๋ก  ์˜ค๋ฒ„ํ—ค๋“œ๊ตฌํ˜„ ๋ณต์žก๋„
Full Fine-Tuning์ „์ฒด์—†์Œ๋‚ฎ์Œ
Adapter์ ์Œ์žˆ์Œ (์ง๋ ฌ)๋ณดํ†ต
Prefix Tuning์ ์Œ์žˆ์Œ (์ปจํ…์ŠคํŠธ)๋ณดํ†ต
Prompt Tuning๋งค์šฐ ์ ์Œ์žˆ์Œ (์ปจํ…์ŠคํŠธ)๋‚ฎ์Œ
LoRA์ ์Œ์—†์Œ (๋ณ‘ํ•ฉ ๊ฐ€๋Šฅ)๋‚ฎ์Œ
IAยณ๋งค์šฐ ์ ์Œ์—†์Œ๋‚ฎ์Œ

QLoRA

QLoRA๋Š” LoRA์— 4๋น„ํŠธ ์–‘์žํ™”(Quantization)๋ฅผ ๊ฒฐํ•ฉํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. 2023๋…„ ๋ฐœํ‘œ๋˜์—ˆ์œผ๋ฉฐ, ๋‹จ์ผ 48GB GPU์—์„œ 65B ํŒŒ๋ผ๋ฏธํ„ฐ ๋ชจ๋ธ์„ ํŒŒ์ธํŠœ๋‹ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คฌ๋‹ค.

ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ:

  • NF4 (NormalFloat4): ์ •๊ทœ๋ถ„ํฌ๋ฅผ ๊ฐ€์ •ํ•œ 4๋น„ํŠธ ๋ฐ์ดํ„ฐ ํƒ€์ž…
  • Double Quantization: ์–‘์žํ™” ์ƒ์ˆ˜๋ฅผ ๋‹ค์‹œ ์–‘์žํ™”ํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ์ ˆ์•ฝ
  • Paged Optimizers: GPU OOM ๋ฐœ์ƒ ์‹œ CPU ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ž๋™ ์˜คํ”„๋กœ๋“œ
# QLoRA ์‚ฌ์šฉ ์˜ˆ์‹œ (Hugging Face + PEFT ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_use_double_quant=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16
)

model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    quantization_config=bnb_config,
    device_map="auto"
)

lora_config = LoraConfig(
    r=8,               # rank
    lora_alpha=32,     # ์Šค์ผ€์ผ๋ง ๊ณ„์ˆ˜
    target_modules=["q_proj", "v_proj"],  # ์ ์šฉํ•  ๋ ˆ์ด์–ด
    lora_dropout=0.1,
    bias="none"
)

model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# ์ถœ๋ ฅ ์˜ˆ: trainable params: 4,194,304 || all params: 6,742,609,920 || trainable%: 0.0622

LoRA์˜ ์ฃผ์š” ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ

ํŒŒ๋ผ๋ฏธํ„ฐ์˜๋ฏธ๋ณดํ†ต ๊ฐ’
r (rank)์ €๋žญํฌ ํ–‰๋ ฌ์˜ ์ฐจ์›. ํด์ˆ˜๋ก ํ‘œํ˜„๋ ฅโ†‘, ๋ฉ”๋ชจ๋ฆฌโ†‘4, 8, 16, 64
lora_alpha์Šค์ผ€์ผ๋ง ๊ณ„์ˆ˜. ์‹ค์ œ ์Šค์ผ€์ผ์€ alpha/r16, 32
target_modulesLoRA๋ฅผ ์ ์šฉํ•  ๋ ˆ์ด์–ด ์ด๋ฆ„q_proj, v_proj ๋“ฑ
lora_dropout๊ณผ์ ํ•ฉ ๋ฐฉ์ง€ ๋“œ๋กญ์•„์›ƒ ๋น„์œจ0.05~0.1

lora_alpha/r ๋น„์œจ์ด ์‹ค์งˆ์ ์ธ ํ•™์Šต๋ฅ  ์Šค์ผ€์ผ์ฒ˜๋Ÿผ ์ž‘๋™ํ•œ๋‹ค. alpha=r์ผ ๋•Œ ์Šค์ผ€์ผ 1.0์ด๋‹ค.


์–ด๋–ค ๋ ˆ์ด์–ด์— LoRA๋ฅผ ์ ์šฉํ• ๊นŒ

Transformer์˜ Attention ๊ฐ€์ค‘์น˜์— ์ฃผ๋กœ ์ ์šฉํ•œ๋‹ค:

  • q_proj (Query ํ–‰๋ ฌ)
  • v_proj (Value ํ–‰๋ ฌ)
  • k_proj (Key ํ–‰๋ ฌ)
  • o_proj (Output ํ–‰๋ ฌ)
  • ํ”ผ๋“œํฌ์›Œ๋“œ ๋ ˆ์ด์–ด: gate_proj, up_proj, down_proj

๋…ผ๋ฌธ์—์„œ๋Š” Q์™€ V์—๋งŒ ์ ์šฉํ•ด๋„ ์ถฉ๋ถ„ํ•œ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ณด๊ณ ํ•œ๋‹ค. ๋ชจ๋“  ๋ ˆ์ด์–ด์— ์ ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์€ ๋” ์ข‹์ง€๋งŒ ๊ทธ๋งŒํผ ํ•™์Šต ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค.


LoRA ๋ณ€ํ˜•๋“ค

  • LoRA+: A์™€ B์˜ ํ•™์Šต๋ฅ ์„ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•ด ๋” ํšจ์œจ์ ์ธ ํ•™์Šต
  • DoRA (Weight-Decomposition LoRA): ๊ฐ€์ค‘์น˜๋ฅผ ํฌ๊ธฐ(magnitude)์™€ ๋ฐฉํ–ฅ(direction)์œผ๋กœ ๋ถ„ํ•ดํ•ด LoRA ์ ์šฉ
  • AdaLoRA: ๋ ˆ์ด์–ด๋ณ„๋กœ rank๋ฅผ ์ค‘์š”๋„์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์กฐ์ ˆ
  • LoftQ: ์–‘์žํ™”์™€ LoRA ์ดˆ๊ธฐํ™”๋ฅผ ํ•จ๊ป˜ ์ตœ์ ํ™”

์‹ค๋ฌด ์„ ํƒ ๊ธฐ์ค€

  • ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋„‰๋„‰ํ•˜๊ณ  ์„ฑ๋Šฅ์ด ์ค‘์š” โ†’ Full Fine-Tuning
  • GPU ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ œํ•œ์ ์ด๊ณ  ์ถ”๋ก  ์†๋„๊ฐ€ ์ค‘์š” โ†’ LoRA
  • ๊ทน๋‹จ์ ์œผ๋กœ ์ ์€ ๋ฉ”๋ชจ๋ฆฌ, ๋Œ€ํ˜• ๋ชจ๋ธ โ†’ QLoRA
  • ํƒœ์Šคํฌ ๊ฐ„ ์ „ํ™˜์ด ์žฆ์Œ(๋ฉ€ํ‹ฐํƒœ์Šคํฌ) โ†’ Adapter ๋˜๋Š” LoRA (๊ฐ ํƒœ์Šคํฌ๋งˆ๋‹ค ์–ด๋Œ‘ํ„ฐ ๊ต์ฒด)
  • ํ”„๋กฌํ”„ํŠธ๋งŒ์œผ๋กœ ๊ฐ„๋‹จํžˆ ์ ์šฉ โ†’ Prompt Tuning

LoRA๋Š” ํ˜„์žฌ ๊ฐ€์žฅ ๋„๋ฆฌ ์“ฐ์ด๋Š” PEFT ๊ธฐ๋ฒ•์ด๋‹ค. HuggingFace์˜ peft ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋ช‡ ์ค„๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ํ•™์Šต ํ›„ ๊ฐ€์ค‘์น˜๋ฅผ ๋ณ‘ํ•ฉํ•˜๋ฉด ์ถ”๋ก  ์˜ค๋ฒ„ํ—ค๋“œ๋„ ์—†๋‹ค. ์‹ค์ œ ํ”„๋กœ๋•์…˜์—์„œ ๋„๋ฉ”์ธ ํŠนํ™” ๋ชจ๋ธ์„ ๋งŒ๋“ค ๋•Œ QLoRA + LoRA ์กฐํ•ฉ์ด ์‚ฌ์‹ค์ƒ ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ์žก์•˜๋‹ค.