[Python] PEFT 라이브러리 알아보기

2023. 5. 29. 21:30·Python

 저번 글을 통해 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

 

Parameter-Efficient Fine-Tuning using 🤗 PEFT

🤗 PEFT: Parameter-Efficient Fine-Tuning of Billion-Scale Models on Low-Resource Hardware Motivation Large Language Models (LLMs) based on the transformer architecture, like GPT, T5, and BERT have achieved state-of-the-art results in various Natural Lang

huggingface.co

 

 

 

'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
'Python' 카테고리의 다른 글
  • [Python] 프로파일링으로 병목 찾기 (line_profiler)
  • [Python] 언어모델의 출력을 스트리밍 방식으로 출력하기
  • [Python] Folium으로 지도에 행정구역 경계 표시하기
  • [Python] selenium 사용 시 chromedriver 자동 업데이트하기
gunuuu
gunuuu
주로 AI, ML에 관한 글을 씁니다.
  • gunuuu
    gunuuu
    gunuuu
  • 전체
    오늘
    어제
    • 분류 전체보기 (40)
      • AI/ML (11)
        • NLP (8)
        • RAG (1)
      • Pytorch (5)
      • Python (11)
      • SQL (2)
      • Causal Inference (3)
        • DoWhy (1)
      • 일상 (3)
      • 책 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    window function
    모델경량화
    TAPT
    PEFT
    대규모언어모델
    bm25
    Tree of Thought
    DetectGPT
    Chain of Thought
    onnx
    미니어처 라이프 서울
    크레마S
    cython
    sparse vector
    line_profiler
    Hybrid search
    DataDistributedParallel
    SQL
    KoAlpaca
    DoWhy
    DAPT
    벡터 db
    FAISS
    인과추론
    itertuples
    인과 추론
    TALLRec
    허깅페이스
    Low-Rank Adaptation
    nlp
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gunuuu
[Python] PEFT 라이브러리 알아보기
상단으로

티스토리툴바