저번 글을 통해 LORA(Low Rank Adaptation)에 대한 원리와 공식 Github를 통해 사용법을 알아봤습니다. 이번에는 LORA를 쉽게 사용할 수 있게 해주는 PEFT (Parameter-Efficient Fine-Tuning of Billion-Scale Models on Low-Resource Hardware)에 대해 알아보겠습니다. PEFT는 LORA뿐만 아니라 P-tuning, Prompt Tuning 등의 파인튜닝을 도와주는 Huggingface에서 만든 라이브러리입니다.
PEFT에서 사용가능한 파인튜닝 방법들
- LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
- Prefix Tuning: Prefix-Tuning: Optimizing Continuous Prompts for Generation, P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks
- P-Tuning: GPT Understands, Too
- Prompt Tuning: The Power of Scale for Parameter-Efficient Prompt Tuning
- AdaLoRA: Adaptive Budget Allocation for Parameter-Efficient Fine-Tuning
1. 모델 불러오기
from transformers import AutoTokenizer, AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
"bigscience/bloom-7b1",
load_in_8bit=True,
device_map='auto',
)
tokenizer = AutoTokenizer.from_pretrained("bigscience/bloom-7b1")
다목적 언어모델인 bloom모델의 파라미터 7 billion짜리를 파인튜닝한다고 가정합시다. 용량은 15GB 정도 되지만 load_in_8bit=True를 사용하여 메모리 요구 사항을 절반으로 줄여 모델을 불러올 수 있습니다.
2. Config 만들기
from peft import LoraConfig, get_peft_model
config = LoraConfig(
r=16, #attention heads
lora_alpha=32, #alpha scaling
# target_modules=["q_proj", "v_proj"], #if you know the
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM" # set this for CLM or Seq2Seq
)
model = get_peft_model(model, config)
LORA는 기본적으로 트랜스포머 아키텍처를 갖는 모델에는 모두 적용이 가능합니다. 따라서 모델의 레이어들 중에서 LORA Adapters를 붙여줄 모듈들(q, k, v, Wq, Wk, Wv, q_proj, k_proj, v_poj...)을 확인한 후 target_modules에 리스트로 넣어줘도 되고 아니면 안 적어도 됩니다. 그 후 get_peft_model를 사용하여 Huggingface 모델과 config만 넣어주면 됩니다. 나머지 학습과정은 일반 모델을 학습하는 과정과 똑같습니다.
3. Output 출력
LORA를 사용해 파인튜닝을 하면 adapter_config.json, adapter_model.bin 이 두 가지가 나오게 되는데 일반적으로 19MB 정도밖에 되지 않습니다. 여러 개의 다운스트림 태스크를 위해서는 각각의 태스크를 위한 파인튜닝을 해야 돼서 용량이 큰 여러 개의 모델을 관리해야 되는 부담이 있었는데 이제는 태스크별로 19MB 정도밖에 되지 않는 어댑터 레이어만 관리하면 되니까 추론 시에도 시간이 많이 개선되는 것 같습니다.
4. 추론
저장한 모델을 이용해 추론을 하려면 다음과 같이 사용하면 됩니다.
batch = tokenizer('input data')
with torch.cuda.amp.autocast():
output_tokens = model.generate(**batch, max_new_tokens=50)
print('\n\n', tokenizer.decode(output_tokens[0], skip_special_tokens=True))
그 외의 사용례
- PEFT LORA와 deepspeed를 사용해 bioscience/t0_3B모델을 RTX 2080이나 RTX 3080에서 파인튜닝하기 (코랩으로도 가능!) (링크)
- PEFT LORA와 bitsandbytes를 이용해 OPT-6.7b 모델의 INT8 튜닝을 통해 1번 예제에서 한 단계 업그레이드 (링크)
- PEFT를 통해 rtx 2080, rtx 3080로 개인이 stable diffusion dream booth 이용하기 (링크)
정리
LLM의 사이즈가 커지면서 일반인들은 사용하기에는 꿈도 못 꿀 것 같았지만 거기에 맞는 기술들이 나와서 이제는 개인도 자기만의 언어모델을 가질 수 있을 것 같습니다. 한국어가 학습된 Polyglot-KO, KoAlpaca가 있으니 여기에 적용해서 직접 사용해 보는 것도 좋을 것 같습니다.
https://huggingface.co/blog/peft
'Python' 카테고리의 다른 글
[Python] 프로파일링으로 병목 찾기 (line_profiler) (1) | 2023.10.09 |
---|---|
[Python] 언어모델의 출력을 스트리밍 방식으로 출력하기 (1) | 2023.06.11 |
[Python] Folium으로 지도에 행정구역 경계 표시하기 (0) | 2023.02.26 |
[Python] selenium 사용 시 chromedriver 자동 업데이트하기 (0) | 2023.02.12 |
[Python] Faiss, 효율적인 유사도 검색 엔진 (1) | 2022.09.30 |