ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LLM 기법 (1)
    Internship_LLM 2024. 2. 1. 17:47
    728x90

    ※ PEFT

    - Parameter Efficient Fine-Tuning의 줄임말이다.

    - 모델이 점점 커지면서 단일 GPU로 모델 전체를 파인튜닝하는 것이 불가능해져가고 있다. 파인튜닝된 모델을 저장하고 사용하는 것도 굉장한 비용이 드는 일이다. 이러한 문제들을 해결하기 위한 방식으로 PEFT가 등장하게 되었다.

    - 대부분의 파라미터는 유지하면서 일부 파라미터만을 효율적으로 파인튜닝함으로써 저장공간과 계산 시간을 줄이는 기법

    - 적은 데이터 체제나 도메인 밖의 데이터를 일반화할 때 더욱 좋은 성능을 보여준다.

    - 전체 파인튜닝에서 만들어지는 큰 크기의 체크포인트 파일과 달리 작은 체크포인트 파일을 얻을 수 있어 저장 공간 관리에도 도움이 된다.

     

    PEFT를 통해 학습된 적은 양의 가중치는 pre-trained LLM 모델 layer의 가장 윗부분에 위치하게 된다. 그래서 모델 전체를 대체할 필요없이 조금의 가중치만 추가하는 작업으로 여러 작업을 수행할 수 있게 되는 것이다. PEFT를 통해 적은 수의 파라미터를 학습하는 것만으로 모델 전체를 파인튜닝하는 것과 유사한 정도의 효과를 누릴 수 있도록 할 수 있다.

     

    1. LoRA

    2. Prefix Tuning

    3. Prompt Tuning

    4. P-Tuning

     

    등이 현재 사용 가능한 PEFT 방법이다.

    # PEFT로 LoRA를 사용하는 방식
    
    from peft import LoraConfig, get_peft_model
    from transformers import AutoModelForCausalLM
    
    base_model = AutoModelForCausalLM.from_pretrained(...)
    lora_config = LoraConfig(..., init_lora_weights="loftq", loftq_config=loftq_config)
    peft_model = get_peft_model(base_model, lora_config)

     

    - LoraConfig : LoRA 관련 매개변수를 정의하는 구성들을 생성

    - get_peft_model : 기본 모델을 래핑하여 학습 가능한 모델로 만들어주는 역할.

     

    위 코드를 사용하여, LoRA를 model에 적용시키고, transformers의 TrainArgument, Trainer를 사용하여 모델을 훈련시킨다.

    huggingface/peft: 🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning. (github.com)

     

    GitHub - huggingface/peft: 🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning.

    🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning. - GitHub - huggingface/peft: 🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning.

    github.com

     

    ※ LoRA

    - 기존 Fine-tuning 과정에서 model은 downstream task를 위해 매번 전체 모델과 같은 크기의 학습을 하기 때문에 엄청난 cost가 발생하게 된다. -> 반면, LoRA 방식으로 fine-tuning을 실시할 경우, 모델 전체 크기가 아니라 일부 layer들을 찾아내는 방식을 취하기 때문에 계산과 메모리 운영이 효율적이다. 전체 모델에서 거의 0.01%까지 작아질 수 있다.

     

    ※ QLoRA

    - LLM의 관점에서 볼 때, NLP와 관련된 AI 모델의 효율성과 효과성을 향상시키는 데 중요한 기술.

    - 모델의 크기와 계산 복잡성을 줄이면서 성능을 유지하거나 개선하기 위해 양자화를 이용하는 기법

     

    Quantization(양자화) : 모델의 가중치나 활성화 함수를 더 낮은 비트 표현으로 변환하는 과정. 모델의 메모리 사용량을 줄이고, 추론 속도를 향상시키고, 모델을 더욱 간단한 하드웨어에서도 실행할 수 있게 한다. 전체적인 모델 크기를 줄이는데 효과적이며, 이 과정에서 발생하는 성능 손실을 최소화할 수 있다.

     

    LLM의 크기와 계산 요구 사항을 효과적으로 줄이는 데 사용될 수 있다. 제한된 compute 리소스를 가진 환경에서의 AI 모델 배포에 매우 중요하고, 모델의 성능을 크게 저하시키지 않으면서도 모델의 효율성을 향상시킬 수 있는 기법이다.

     

    1. 추론 속도 향상 : 양자화를 통해 모델 연산 부담을 줄이고, LoRA 적용을 통해 필요한 계산량을 감소시킨다.

    2. 메모리 요구 사항 감소 : 모델 크기가 줄어들면, 메모리 사용량이 감소해서 더 적은 리소스로 모델을 실행할 수 있다.

    3. 에너지 효율성 증가 : 모바일 기기와 같이 에너지 사용을 최소화하는 것이 중요한 경우, QLoRA를 통해 모델을 더욱 효율적으로 만들게 된다.

     

    ■ 적용기법

    1. 4-bit NormalFloat Quantization(NF4)

    2. Double Quantization

    3. Paged Optimizers

     

    QLoRA는 33B 모델과 65B 모델을 single professional GPU를 통해 fine-tuning하는데 성공하게 된다.

     

    어떤 모델을 Quantization 시켜주고, Quantization된 모델에 LoRA를 적용시킨다고 이해할 수 있다.

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

     

    일반적으로 Quantization 시키는 방법으로 transformers의 BitsAndBytesConfig를 사용할 수 있다.

    artidoro/qlora: QLoRA: Efficient Finetuning of Quantized LLMs (github.com)

     

    GitHub - artidoro/qlora: QLoRA: Efficient Finetuning of Quantized LLMs

    QLoRA: Efficient Finetuning of Quantized LLMs. Contribute to artidoro/qlora development by creating an account on GitHub.

    github.com

     

     

    ※ [Prompt Engineering 기법] RAG

    - Retrieval-Augmented Generation의 줄임말이다.

    - ChatGPT의 hallucination을 없애고, 최신의 지식 정보를 기준으로 정확한 답변을 전달해야 하는 경우, LLM을 재학습시키지 않고, RAG를 사용해서 언어 모델이 정확한 응답을 하게 할 수 있다. 또한, 특정 주제에 대한 심층적인 질문이나, 일반적인 지식 베이스만으로는 해결하기 어려운 문제에 대한 답변을 생성할 때 효과적이다.

    - 사용자 질문에 해당되는 응답 정보의 문서 정보를 미리 저장한 vector score에서 검색하고, 검색 결과에 해당되는 본문을 LLM에 전달하여, LLM이 생성한 본문의 요약된 결과를 사용자에게 응답하는 방식이다. -> 정보 검색과 문서 생성을 결합하여 더 정확하고 유용한 답변을 생성하는 데 사용된다.

     

    1. Retrieval(검색) : 사용자의 질문이나 프롬프트를 바탕으로 관련 정보를 검색한다. 검색 엔진을 통해서 대규모 문서 집합에서 질문과 관련된 문서나 데이터를 찾아내며, 이 단계에서는 BM25, TF-IDF, 또는 최근에는 더 정교한 임베딩 방식을 사용해서 문서를 검색한다.

     

    2. Generation(생성) : 검색 단계에서 찾아낸 정보를 바탕으로, 생성 모델(GPT, BERT)이 사용자에게 가장 적합한 답변을 생성한다.

     

    파인튜닝과 RAG를 선택하는 것에 있어 고민이 많을 수 있는데, 고려해야 할 점들이 몇 가지 있다.

    1) 애플리케이션이 모델 외부 데이터 리소스 접근이 가능한가?

    - 파인튜닝 모델은 특정 시점까지의 데이터만 학습이 되기 때문에, 모델 외부 데이터에 대한 상시적 접근이 필요할 때는 RAG가 유리하다.

    2) 할루시네이션 방지

    - 파인튜닝에서는 할루시네이션 방지를 위해서 새로운 데이터를 끊임없이 학습시켜야 하지만, RAG 에서는 모든 답변을 근거를 가지고 생성하기 때문에 할루시네이션 방지에 효과적이다.

    3) 데이터의 dynamic을 고려

    - 데이터가 static인지 dynamic 한지에 따라 선택이 달라질 수 있다. 데이터의 dynamic이 크다면 RAG가 훨씬 유리한데, vector DB를 갱신하는 일이 모델 학습 보다는 훨씬 간편하기 때문이다.

    728x90

    'Internship_LLM' 카테고리의 다른 글

    LLM 기법(3) - Llama-index  (2) 2024.02.06
    LLM 기법(2) - Langchain  (0) 2024.02.05
    LLaMA 논문 리뷰  (2) 2024.01.31
    LLM Parameters  (0) 2024.01.26
    Instruction finetuning & Self-Instruct  (0) 2024.01.26
Designed by Tistory.