이번 포스팅에서는 PEFT 방법 중 가장 핵심이 되는 QLoRA에 대해 실제코드를 살펴보고 학습 결과를 확인해 보겠습니다.
1부 되짚어 보기
지난 포스팅에서는 거대 언어 모델(LLM)을 조정하는 세 가지 방법에 대해 살펴보았습니다.
https://hyundoil.tistory.com/400
In-context Learning은
프롬프트 입력 시 연관된 예시를 함께 제공하여 모델의 가중치를 업데이트하지 않고 프롬프트 엔지니어링만으로 문제를 해결하는 방법입니다. 사용자가 제공하는 예시의 수에 따라 Zero-shot 또는 Few-shot Learning 등으로 구분됩니다.
RAG도 이 부분에 속할 수 있겠네요. 그리고 Teddy note 위키독스에서도 프롬프트와 LLM을 Langchain으로 chain을 걸어주는 실습 코드가 있습니다.
Full Fine-tuning은
사전 학습된 모델(Pre-trained Model, PLM)의 모든 파라미터를 재학습하여 가중치를 업데이트하는 방식으로, LLM의 범용적인 성능을 특정 작업이나 도메인에 최적화하는 방법입니다.
PEFT(Paramter Efficient Fine-tuning)는
모델의 전체 파라미터 중 일부만을 선택적으로 조정함으로써, 모델의 핵심 구조를 유지하면서도 특정 기능이나 작업에 맞게 모델을 조정하는 방법입니다.
PEFT의 대표적인 방법으로는 LoRA(Low-rank Adaptation) 및 LoRA에 4비트 양자화를 적용하여 더욱 경량화한 QLoRA(Quantized LoRA)가 있습니다.
본 포스팅에서 QLoRA 학습 목표
우리는 이번 실습에서 한국어로 학습된 베이스 모델을 Llama 3.1로 선정하고 QLoRA를 통해 튜닝하여, 질문에 답변하는 모델을 만들어 보겠습니다.
우리는 데이콘에서 개최한 재정정보 AI 검색 알고리즘 경진대회의 Task와 데이터를 사용합니다.
https://dacon.io/competitions/official/236295/overview/description
베이스 모델로는 'sh2orc/Llama-3.1-Korean-8B-Instruct'를 사용합니다.
실습 환경은 Google Colab이며, Colab Pro 요금제를 통해 NVIDIA A100(40GB) GPU를 사용합니다.
만약 더 낮은 사양의 GPU를 선택할 경우, 학습이 불가능할 수 있으므로 참고하시기 바랍니다.
정리하면 아래와 같습니다.
- 베이스 모델 : sh2orc/Llama-3.1-Korean-8B-Instruct
- 학습 목표 : 사용자의 질문에 답변하는 형식의 모델 만들기 (데이콘)
- 실행 환경 : Google Colab - A100 40GB
0. 준비하기
데이콘 재정정보 AI 검색 알고리즘 경진대회에 접속하여 '데이터' 탭을 누르고 '다운로드' 버튼을 누르세요.
프로젝트 폴더안에 open 폴더를 아래와 같이 둡니다.
project/
│
├── open/
│ ├── test_source
│ ├── train_source
│ ├── sample_submission.csv
│ ├── test.csv
│ └── train.csv
│
├── 00.check.ipynb
├── 01.build_db.ipynb
├── .env
00.check.ipynb 파일을 만들고 데이터들을 확인해봅니다.
import pandas as pd
df = pd.read_csv('./open/train.csv')
df.head()
질문과 질문에 대한 정답 대답이 존재합니다. 이제 이것을 훈련데이터셋으로 사용하여 QLoRA로 LLM Fine-Tuning을 진행해봅니다.
1. 훈련 데이터셋 만들기
이제 01.build_db.ipynb 파일을 만들고 열어봅시다.
import pandas as pd
df = pd.read_csv('./open/train.csv')
qa_pair = []
for _, row in df.iterrows():
qa_pair.append({
"QUESTION": row['Question'],
"ANSWER": row['Answer']
})
qa_pair
import json
with open('qa_pair.jsonl', 'w', encoding='utf-8') as f:
for qa in qa_pair:
qa_modified = {
"instruction": qa['QUESTION'],
"input": "",
'output': qa['ANSWER'],
}
f.write(json.dumps(qa_modified, ensure_ascii=False) + '\n')
Huggingface dataset에 데이터 올리기
!pip install datasets
huggingface dataset 형식의 dataset으로 변환
from datasets import load_dataset
jsonl_file = 'qa_pair.jsonl'
dataset = load_dataset('json', data_files=jsonl_file)
허깅페이스 클라우드에 데이터 올리기
허깅페이스 가입하고 -> 우측 상단 내 프로필 아이콘 클릭 -> Access Tokens -> + Create new token 반드시 Write로 세팅
+ New dataset 클릭해서 위와 같이 aris라는 이름으로 데이터셋 레파지토리 만들기
from huggingface_hub import HfApi
# HfApi 인스턴스 생성
api = HfApi()
# 데이터셋을 업로드할 레파지토리 이름
repo_name = "HueyWoo/aris"
# 데이터셋을 허브에 푸시
dataset.push_to_hub(repo_name, token='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')
내 프로필 클릭하면 아래와 같이 나오고 위에서 Datasets가 보일것이다. 거기서 자기이름/aris가 있다.
잘 올라온것을 볼수 있다.
2. 훈련하기
깃헙 02.My_LLM_fine_tuning02.ipynb 수행
https://github.com/khw11044/Dacon_RAG_compe
3. 훈련 이후 Ollama
https://hyundoil.tistory.com/324