/K-G-OAT

IA3방식으로 LLM모델 fine tuning

Primary LanguageJupyter Notebook

K(G)OAT 🐐

IA3 icon


  • IA3방식으로 KoAlpaca를 fine tuning한 한국어 LLM모델

  • 요즘 LLM은 대부분 LoRA방식으로 훈련이 진행되고 있으며, 최근은 양자화 방식을 도입한 QLORA방식으로 많이 훈련되고 있습니다.

  • KOAT base모델인 KoAlpaca 또한, QLORA방식으로 메모리를 효율적으로 활용하는 방법을 소개하고 있습니다.

  • 본 연구는 (주)마커와 (주)미디어그룹사람과숲의 오픈소스 LLM 연구 컨소시엄에서 진행되었습니다.

  • 빠른 훈련방식과 더 효율적인 방법론으로 소개된 IA3(T-Few) 방식으로 fine-tuning진행하여, 더 적은 파라미터로 더 효율적인 훈련방식을 도입하였습니다.

  • K(G)OAT5.8b 는 더 적은 파라미터로도 polyglot5.8b와 ko-Alpaca5.8b를 Fewshot평가에서 프롬프트1의 경우0.712, 프롬프트2의 경우 0.810 의 성능을 보여주었습니다.

    • PEFT에서는 현재 IA3방식을 implement할 수 있으나, 주의할점은 Casual LM task에서는 라이브러리 코드를 수정해야 합니다.

      이것 관련하여서는, 제가 task에 맞춰 코드가 돌아갈 수 있게, peft라이브러리를 직접 수정하여 제 개인 repo에 업로드 하여 놓았습니다.😎

      코드상에서 수정된 라이브러리를 다운받고 돌리실 수 있도록, 수정된 라이브러리를 다운받는 코드 추가하였으니, 혹시나 기존의 환경에 peft 라이브러리를 uninstall 하시고 시도하시기를 바랍니다!

    • 질문사항은 이슈에 남겨주시면 답변하도록 하겠습니다!

    • Hugging Face에 업로드한 모델은 여기 서 확인 바랍니다..!

    • 현재 Huggingface에 모델가중치를 업로드하였고, 로드하는 방식또한 확인하실 수 있게 코드를 업로드 하였습니다.

    • Fewshot 평가를 보여드릴 수 있도록 Load_and_Fewshot_test.ipynb에 Inference 및 모델 로드 하는 코드를 올려놓았습니다!

    • ipynb 포맷으로 IA3방식으로 finetuning하는 코드 완성하여 Training_IA3.ipynb로 업로드 하였습니다!


K(G)OAT의 훈련 방식 🖋️

  • baseline은 Beomi님의 KoAlpaca코드를 참조하였습니다.😃

  • 양자화 방식은 사용되지 않았습니다. -> Few shot learning 평가시, 모델을 비트 단위로 불러오게 되면, Fewshot러닝 평가가 되지 않는 이슈가 있습니다.

  • KoAlpaca 5.8b가 베이스 모델이며, Tokenizer는 Polyglot5.8b의 Tokenizer를 사용하였습니다.

  • IA3방식이란?

    • LoRA는 rank decomposition 행렬을 사전학습된 모델에 추가하여 중간마다 학습이 가능한 파라미터를 삽입한 방식입니다.

    • IA3는 Infused Adapter by Inhibiting and Amplifying Inner Activations의 약자로, LORA와 비슷하게 적은 파라미터를 사전학습된 모델에 추가하여 훈련하는 방법입니다.

    • LoRA와의 차이점은, LoRA는 hidden state에 새로운 값을 더해주는 기법이지만, IA3의는 Attention에 Query, Key, Value 값을 rescale해주는 벡터와 position-wise feed-forward network의 output을 rescale 하는 벡터를 추가해 훈련시키는 방식입니다.

    • IA3방식은 LoRA보다 적은 파라미터로 더 좋은 성능을 낸다는 방법론으로 도입 되었으며 저희는 K(G)OAT를 활용하여 훈련을 진행하였습니다.

  • K(G)OAT는 4epoch, maxstep 32,000 step으로 훈련이 되었으며, 총 소요된 시간은 226min 소요되었습니다.(최적화 steo은 15930입니다 😀)

  • 같은 방식으로 비트단위로 훈련시키지 않은 LORA방식을 적용한 KoAlpaca는 203 min이 소요되었습니다.

  • 훈련한 방식에 따른 파라미터 수와 훈련시간, Inference time은 다음과 같습니다.

  • 훈련 경과 표 ⏳

훈련방식 파라미터수 훈련 소요시간 Inference time
LoRA 3670016 203 min 2.1 sec
IA3 802816 226 min 1.7 sec
  • 하지만, 직접 훈련시간을 비교한 결과, 훈련에 소요된 시간이 예상보다 많았지만, 이러한 이유는, rescale 벡터를 추가하기 때문에, rescaling 과정에서 차이가 있는것으로 보입니다.

  • 대신 더 적은 parameter로 인해 Inference 시간은 더 단축되었습니다..!


Dataset 💾

훈련데이터셋 📚

  • 훈련에 Dataset은 기본적으로 KoAlpaca와 성능 비교를 위해 Beomi님의 KoAlpacav1.1 데이터셋을 활용하였습니다.

  • 하지만 프롬프트 구성에 대한 수정사항은 다음과 같습니다

# 기존의 코드
data = data.map(
    lambda x: {'text': f"### 질문: {x['instruction']}\n\n### 답변: {x['output']}<|endoftext|>" }
)

# 수정된 프롬프트 코드
data = data.map(
    lambda x: {'text': f"{x['instruction']}\n\n정답: {x['output']}<|endoftext|>"}
)

Fewshot Learning 평가 데이터셋 📕

  • 네이버 영화리뷰 데이터셋인 NSMC 데이터를 활용하였습니다.

  • 프롬프트는 beomi님의 평가 코드를 활용하였으며, 같은 설정을 통하여 성능 비교를 진행하였습니다.

    • 프롬프트 유형 1
def build_prompt_text(sent):
    return "문장: " + sent + '\n감정:'
  • 프롬프트 유형2
def build_prompt_text(sent):
    return '다음 문장은 긍정일까요 부정일까요?\n' + sent + '\n정답:'
  • 두 프롬프트의 차이점은, 프롬프트1의 경우 모델에게 프롬프트를 간략하게 전달하여 결과를 체크하는 것이며, 프롬프트 2의 경우는 더 세밀한 프롬프트를 통해 결과 값을 전달한다는 차이점이 있습니다.

Fewshot Learning 평가 결과 📈

  • Fewshot Learning 평가 프롬프트별 정확도는 다음과 같습니다.
모델명 프롬프트1 프롬프트2
polyglot-5.8b 0.556 0.680
koalpaca-polyglot-5.8b 0.664 0.748
K(G)OAT-polyglot 0.712 0.810
  • polyglot-5.8b와 koalpaca는 huggingface에 로딩되어있는 모델 불러와 inference를 진행시킨 결과 값입니다.

  • K(G)OAT는 더적은 파라미터를 사용하여 훈련하였지만, 프롬프트1 유형과 프롬프트2 유형에서 매우 향상된 성능을 보여주었습니다.

  • 특히 더 적은 파라미터로도 기존의 벤치마크 모델보다 향상된 성능을 보여주었다는 점에서 더 적은 메모리로도 훈련이 가능하다는 점에서 인상깊다고 볼 수 있습니다.

  • 또한, 기존의 학습 모델들의 성능을 매우 크게 향상시킨 방법론으로, IA3가 CAUSAL_LM 테스크에서도 LoRA 방식보다 더 효율적이면서 더 좋은 성능을 보이고 있다는 것을 알 수 있었습니다..!

Acknowledgement

  • (주)마커와 (주)미디어그룹사람과숲의 컨소시엄에서 학술적인 목적으로 연구되었으며, 오픈소스 MIT License를 따릅니다.

  • K(G)OAT는 A5000 2장으로 훈련되었으며, 한동대학교 Xiaopeng Yang 교수님의 AIMV 연구실의 도움을 받아 훈련되었습니다.