🤗 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

관련

  • 프로젝트
  • Dispatch
  • Dispatch
  • Dispatch
  • Dispatch