๐Ÿค— PEFT ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถœ์‹œ, ์–ต๋Œ€ ๊ทœ๋ชจ ๋ชจ๋ธ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ํšจ์œจ์  ํŒŒ์ธํŠœ๋‹ ๊ฐ€๋Šฅ

TL;DR

Hugging Face๊ฐ€ ๐Ÿค— PEFT ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถœ์‹œํ–ˆ์œผ๋ฉฐ, ๋Œ€ํ˜• ์–ธ์–ด ๋ชจ๋ธ์„ ๋ช‡ ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ ์ˆ˜์ค€์˜ ํ•™์Šต ๊ฐ€๋Šฅํ•œ ๊ฐ€์ค‘์น˜๋งŒ์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ํšจ์œจ์  ํŒŒ์ธํŠœ๋‹(PEFT)ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ, ์ผ๋ฐ˜ ์†Œ๋น„์ž์šฉ GPU์—์„œ๋„ ์–ต๋Œ€ ๊ทœ๋ชจ ๋ชจ๋ธ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋™๊ธฐ: PEFT๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ 

PEFT ๋ฐฉ๋ฒ•์€ ์‚ฌ์ „ ํ•™์Šต๋œ ๋ชจ๋ธ์˜ ๋Œ€๋ถ€๋ถ„์„ ๊ณ ์ •ํ•œ ์ฑ„ ์ถ”๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ ์†Œ๋Ÿ‰๋งŒ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์—ฐ์‚ฐ ๋ฐ ์ €์žฅ ๋น„์šฉ์„ ๋ชจ๋‘ ์ค„์ด๊ณ , ์žฌ์•™์  ๋ง๊ฐ์„ ๋ฐฉ์ง€ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์€ ์ƒํ™ฉ์—์„œ ์ „์ฒด ํŒŒ์ธํŠœ๋‹๋ณด๋‹ค ๋” ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ๋ฒ•์€ ํ…์ŠคํŠธ, ๋น„์ „, ์˜ค๋””์˜ค ๋“ฑ ๋‹ค์–‘ํ•œ ๋ชจ๋‹ฌ๋ฆฌํ‹ฐ์— ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ž‘์€ ์–ด๋Œ‘ํ„ฐ ์ฒดํฌํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ํ•˜๋‚˜์˜ ๊ธฐ๋ณธ ๋ชจ๋ธ์ด ์—ฌ๋Ÿฌ ๋‹ค์šด์ŠคํŠธ๋ฆผ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ง€์›๋˜๋Š” PEFT ๊ธฐ๋ฒ•

๐Ÿค— PEFT ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ˜„์žฌ ๋„๋ฆฌ ์ธ์šฉ๋˜๋Š” ๋„ค ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

  1. LoRA โ€“ ๋Œ€ํ˜• ์–ธ์–ด ๋ชจ๋ธ์˜ ์ €๋žญํฌ ์ ์‘ (Hu et al., 2021).
  2. Prefix Tuning โ€“ Pโ€‘Tuning v2, ๊ฐ ํŠธ๋žœ์Šคํฌ๋จธ ๋ ˆ์ด์–ด ์•ž์— ํ•™์Šต ๊ฐ€๋Šฅํ•œ ๋ฒกํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  3. Prompt Tuning โ€“ ์ž‘์—… ์ „๋ฐ˜์— ๊ฑธ์ณ ํ”„๋กฌํ”„ํŠธ ๊ธฐ๋ฐ˜ ์ ์‘์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
  4. Pโ€‘Tuning โ€“ GPT ์Šคํƒ€์ผ ๋ชจ๋ธ์„ ์œ„ํ•œ ์—ฐ์† ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ง์ ‘ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ๋ฐฉ๋ฒ•๋“ค์€ ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ ์ œ๊ณต๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€

  • ๋…ธํŠธ๋ถ GPU(11โ€ฏGB RAM)์—์„œ 3โ€ฏB ํŒŒ๋ผ๋ฏธํ„ฐ T0 ๋ชจ๋ธ ํŒŒ์ธํŠœ๋‹ โ€“ LoRA์™€ ๐Ÿค— Accelerate์˜ DeepSpeed ํ†ตํ•ฉ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ ์Šคํฌ๋ฆฝํŠธ peft_lora_seq2seq_accelerate_ds_zero3_offload.py๋Š” Googleย Colab์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • Colab์—์„œ bitsandbytes ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•œ OPTโ€‘6.7B์˜ INT8 LoRA ํŠœ๋‹ โ€“ 8๋น„ํŠธ ์–‘์žํ™”์™€ PEFT๋ฅผ ๊ฒฐํ•ฉํ•˜๋ฉด ์ œํ•œ๋œ GPU ๋ฉ”๋ชจ๋ฆฌ์—์„œ๋„ ๋™์ž‘ํ•จ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • ์†Œ๋น„์ž์šฉ GPU(RTXโ€ฏ2080โ€ฏTi, RTXโ€ฏ3080)์—์„œ LoRA๋ฅผ ์ด์šฉํ•œ Stable Diffusion DreamBooth โ€“ T4(16โ€ฏGB) ์ธ์Šคํ„ด์Šค์—์„œ ์‹คํ–‰๋˜๋Š” ๊ณต๊ฐœ Gradio ๋ฐ๋ชจ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

์ด ์˜ˆ์‹œ๋“ค์€ ์ด์ „์— ์ˆ˜์‹ญ GB์˜ VRAM์ด ํ•„์š”ํ–ˆ๋˜ ๋ชจ๋ธ๋“ค์„ ์ด์ œ ๋Œ€๋ถ€๋ถ„์˜ ์‹ค๋ฌด์ž๊ฐ€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํ•˜๋“œ์›จ์–ด์—์„œ ์ ์‘์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋น ๋ฅธ ์‹œ์ž‘: LoRA๋กœ bigscience/mt0-large ํŒŒ์ธํŠœ๋‹

from transformers import AutoModelForSeq2SeqLM
from peft import get_peft_model, LoraConfig, TaskType

model_name = "bigscience/mt0-large"
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)

peft_cfg = LoraConfig(
    task_type=TaskType.SEQ_2_SEQ_LM,
    inference_mode=False,
    r=8,
    lora_alpha=32,
    lora_dropout=0.1,
)
model = get_peft_model(model, peft_cfg)
model.print_trainable_parameters()
# โ†’ trainable params: 2,359,296 | all params: 1,231,940,608 | trainableโ€ฏ%: 0.19

ํ•™์Šต ๋ฃจํ”„์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•™์Šต์ด ๋๋‚œ ํ›„์—๋Š” ์–ด๋Œ‘ํ„ฐ ํŒŒ์ผ๋งŒ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค:

model.save_pretrained("output_dir")  # creates adapter_config.json + adapter_model.bin (~19โ€ฏMB)

์ถ”๋ก ์„ ์œ„ํ•ด ๋กœ๋“œํ•˜๋ ค๋ฉด:

from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
from peft import PeftModel, PeftConfig

peft_id = "smangrul/twitter_complaints_bigscience_T0_3B_LORA_SEQ_2_SEQ_LM"
cfg = PeftConfig.from_pretrained(peft_id)
base = AutoModelForSeq2SeqLM.from_pretrained(cfg.base_model_name_or_path)
model = PeftModel.from_pretrained(base, peft_id)
 tokenizer = AutoTokenizer.from_pretrained(cfg.base_model_name_or_path)

model.eval().to("cuda")
inputs = tokenizer("Tweet text : @HondaCustSvc ...", return_tensors="pt")
with torch.no_grad():
    out = model.generate(inputs["input_ids"].to("cuda"), max_new_tokens=10)
    print(tokenizer.decode(out[0], skip_special_tokens=True))
# โ†’ "complaint"

์–ด๋Œ‘ํ„ฐ ์ฒดํฌํฌ์ธํŠธ๋Š” ๋ช‡ ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ์— ๋ถˆ๊ณผํ•˜์ง€๋งŒ, ์ „์ฒด ํŒŒ์ธํŠœ๋‹์— ํ•„์ ํ•˜๋Š” ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํ–ฅํ›„ ๋ฐฉํ–ฅ

Hugging Face๋Š” IAยณ ๋ฐ ๋ณ‘๋ชฉ ์–ด๋Œ‘ํ„ฐ์™€ ๊ฐ™์€ ์ถ”๊ฐ€ PEFT ๋ณ€ํ˜•์„ ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ํ–ฅํ›„ ์‚ฌ์šฉ ์‚ฌ๋ก€๋กœ๋Š” Colab์—์„œ whisper-large์˜ INT8 ํ•™์Šต๊ณผ RLHF ๊ตฌ์„ฑ ์š”์†Œ(์ •์ฑ… ๋ฐ ๋žญ์ปค ๋ชจ๋ธ)์— PEFT๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ์—ฌ๋Š” GitHub ์ €์žฅ์†Œ๋ฅผ ํ†ตํ•ด ์žฅ๋ ค๋ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

๐Ÿค— PEFT๋Š” ํ•˜๋“œ์›จ์–ด, ์—ฐ์‚ฐ ๋ฐ ์ €์žฅ ์žฅ๋ฒฝ์„ ํฌ๊ฒŒ ๋‚ฎ์ถ”๋ฉด์„œ ์ •ํ™•์„ฑ์„ ์œ ์ง€ํ•จ์œผ๋กœ์จ ์–ต๋Œ€ ๊ทœ๋ชจ ๋ชจ๋ธ์˜ ์ ์‘์„ ๋ฏผ์ฃผํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๐Ÿค— Transformers ๋ฐ ๐Ÿค— Accelerate์™€์˜ ์›ํ™œํ•œ ํ†ตํ•ฉ์„ ์ œ๊ณตํ•˜์—ฌ ๊ธฐ์กด ํŒŒ์ดํ”„๋ผ์ธ์— PEFT๋ฅผ ์‰ฝ๊ฒŒ ์ ์šฉํ•˜๊ณ  ์ž‘์—… ๊ฐ„์— ๊ฐ€๋ฒผ์šด ์–ด๋Œ‘ํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Sources