티스토리 뷰
들어가며
국민대 산학협력 프로젝트 토픽 별 감정 분석 / 평점 분석 진행을 위해 라마2를 활용하기로 했다. 따라서 이를 활용하여 파인튜닝 시험 해 보았다. 본 예제는 dlpc라는 특수한 환경에서 진행하여 많은 이들에게 도움이 되지 않을 수 있다.
llama2 다운로드 방법
허깅페이스는 신청만 하고 허깅페이스로 연동만 하면 자동으로 다운 받아진다.
1. 다운로드 URL 신청
https://ai.meta.com/resources/models-and-libraries/llama-downloads/
위 링크에 접속해서 자신의 정보를 입력하고 맨 아래로 내려가 Accept and Continue 버튼을 누른다.
그러면 Get started with Llama 2라는 제목으로 기입한 이메일 주소에 메타로부터 메일이 날아온다. 여기서 2번의 긴 링크를 복사해 둔다.
2. 모델 다운로드
환경은 리눅스, 주피터 노트북이다.
https://github.com/facebookresearch/llama의 깃허브를 클론한다.
!git clone <https://github.com/facebookresearch/llama.git>
%cd llama
셋업을 해 준다.
!pip install -e .
download.sh을 실행해주면 되는데, 그 전에 소유자에 권한을 부여해주고 실행해야한다.
!chmod 755 download.sh
!./download.sh
실행을 하면 다음과 같이 URL을 입력하라고 하는데, 여기에 아까 이메일에서 복사해 두었던 링크를 입력해주면 된다. 그리고 다운 받을 모델을 입력하면 된다.
그러나 코랩의 경우 잘 입력되지만 dlpc는 왜인지 모르겠지만 입력이 안된다. 따라서 download.sh 파일을 수정하고 실행했다. read 명령어 라인은 주석 처리하고 입력받는 변수 PRESIGNED_URL, MODEL_SIZE에다가 각각 메일로 받은 URL과 다운 받을 모델 입력하면 된다. 주의할 점은 대입 연산자와 변수 사이에 공백을 넣으면 안된다.
MODEL_SIZE = "7B-chat” X → MODEL_SIZE="7B-chat” O
이렇게만 하면 모델 다운로드는 끝이다.
llama2 파인튜닝
파인튜닝 관련 방법들이 너무 많아서 무엇으로 실험할지 고민하다가 다음의 블로그에서 제시한 방법을 해 보았다. 이 방법은 허깅 페이스를 이용한다. 허깅 페이스를 이용하면 데이터 생성과 학습 모두 정말 간단하게 진행이 가능하다.
https://ukey.co/blog/finetune-llama-2-peft-qlora-huggingface/
PEFT QLoRA 설명
QLoRA에 대해서도 2023년에 나온 논문임에도 최근 LLM 모듈에 적극 적용 돼 있는 것을 보고 공부해 볼 필요가 있다고 생각해 조사해 보았다. (아직은 남들이 리뷰한 것을 둘러보았을 뿐, 여유가 된다면 직접 읽어봐야 할 것 같다)
LoRA
우선 LoRA에 대한 설명이다. https://velog.io/@nellcome/NLP2
아래 정리한 내용보다 더 좋은 내용을 발견해 추후 수정
LoRA (Low Rank Adapters)를 활용하면 모델의 아주 작은 부분만 학습 가능하기 때문에 학습 파라미터와 학습 모델 자체의 크기도 급격히 줄어든다1). 저장된 모델은 7B 모델(float16에선 15GB)에서 단 65MB이다.
1) 원문에선 the size of the trained artifact are dramatically reduced라고 했는데, artifact가 학습 중 나오는 출력문이라고 하여 학습하는 모델의 크기를 의미하는 것이 아닌가 생각했음
이 과정에 대해 더 자세히 설명하면, 목표 학습 모듈(어텐션 모듈의 query / key 레이어)이 정해진 후 작은 학습 가능한 선형 레이어가 이 모듈과 결합된다. 아래 그림처럼 은닉 상태가 어탭터(여기선 작은 학습 가능한 선형 레이어)가 원래 모델의 상태와 더해져 최종 은닉 상태를 얻는다.
The output activations original (frozen) pretrained weights (left) are augmented by a low rank adapter comprised of weight matrices A and B (right).
이렇게 학습하면 원래 모델은 파라미터가 고정 돼 있기 때문에 전체 모델을 저장할 필요가 없으며 어댑터 모델은 int8이든 fp4, fp16이든 임의의 데이터 타입으로 유지할 수 있다.
QLoRA
다음은 QLoRA이다. https://velog.io/@nellcome/QLoRA란
— 아직 이해가 미흡하여 다시 읽고 정리하겠습니다. —
데이터셋
위 포스트에선 Instruction fine-tuning을 진행하고 데이터 유형은 다음과 같다.
Below is an instruction that describes a sentiment analysis task...
### Instruction:Analyze the following comment and classify the tone as...
### Input:I love reading your articles...
### Response:friendly & constructive
허깅페이스에선 이런 데이터셋을 간단하게 사용할 수 있도록 한다. 보통 jsonl 이라는 형태로 저장된다. 이런 데이터셋은 허깅페이스의 Datasets 라이브러리로 손쉽게 가공할 수 있다.
※ jsonl은 json line의 약어로 JSON 내부에 한 줄씩 JSON을 저장할 수 있는 구조화된 데이터 형식
{"id":"a","title":"안녕","genre":"드라마"}
{"id":"b","title":"바보","genre":"액션"}
{ "text": "Below is an instruction ... ### Instruction: Analyze the... ### Input: I love... ### Response: friendly" },
{ "text": "Below is an instruction ... ### Instruction: ..." }
jsonl은 다음의 규칙을 지닌다
1. UTF-8 의 인코딩이어야 한다.
2. 각 행들은 모두 JSON 형태여야 한다.
3. 각각의 줄은 \\n으로 구분되어야 한다.
이렇게 생성된 커스텀 데이터셋은 다음 링크에서 허깅 페이스에 업로드 할 수 있다.
https://huggingface.co/docs/hub/datasets-adding
위 경우는 커스텀 데이터셋을 만드는 경우였고 여기서는 다음 데이터셋을 이용해 보았다.
https://huggingface.co/datasets/AdiOO7/llama-2-finance
Instruction Fine-tuning 데이터셋 형식
조사한 바에 따르면 이 데이터셋 형식으로 파인튜닝을 처음 진행한 것은 GPT-3.5, 즉 InstructGPT에서 처음 제안되고 학습되었지만 형식 자체에 대해서는 비공개로 있다가 스탠포드의 Alpaca로 공개된 오픈소스에서 나온 것을 원형으로 삼는 것 같다. 해당 깃허브에서 설명한 내용에 따르면 다음과 같다.
※ 이해할 때 알아두어야 하는 점은 OpenAI에선 사람이 전부 output을 작성한 instruct fine tuning이지만 Alpaca는 다른 언어 모델이 이 output을 생성하도록 한 self-instruct fine tuning이다.
데이터셋은 json 파일로 구성되며 이 json 파일은 딕셔너리의 리스트이고 다음의 영역을 포함한다.
instruction : str, 모델이 수행해야 하는 task를 묘사, 각 딕셔너리의 instruction은 고유하다.
input : str, 선택 사항으로 task의 맥락이나 입력을 의미한다. ex) instruction이 “글을 요약하라”라면, 이 입력은 그 글을 의미한다.
output : str, 모델이 사람이 생성한 instruction에 대한 답변
input이 있을 때의 예시
Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.
### Instruction:
{instruction}
### Input:
{input}
### Response:
input이 없을 때의 예시
Below is an instruction that describes a task. Write a response that appropriately completes the request.
### Instruction:
{instruction}
### Response:
필요 라이브러리 다운
학습 실습을 진행하기 전 필요한 라이브러리를 다운받아준다. dlpc 기준으로 주피터 노트북 내에서 다운받지 말고 반드시 커널에서 가상환경 내에서 다운로드 해 주어야 한다. 가상환경은 클래식 모드를 통해서 들어갈 수 있다.
가상환경 만드는 법은 기본적으로 dlpc에선 아나콘다가 깔려있기 때문에 명령어만 입력해주면 된다. 여기서 실행한 환경에선 파이썬 파라미터는 생략해주어 기본 설정 버전(3.11.4)대로 설치했다.
conda create -n 이름 python=버전
conda activate 이름
conda install 라이브러리
토치는 아마 최신버전(작성일 기준 토치 버전 2.0.1)으로 노트북을 생성하면 왜인지는 모르겠으나 아마 깔려있지 않을 것인데, 따라서 파이토치를 따로 설치해 주어야 한다. 파이토치 공식 다운로드 링크에는 쿠다 11.8 이후로는 없을 것인데, 이후 버전이더라도 11.8 버전 다운받아주면 정상적으로 작동한다.
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
추가로 다운받아야 할 것은 다음과 같다.
pip install -q huggingface_hub
pip install -q -U trl transformers accelerate peft
pip install -q -U datasets bitsandbytes einops wandb
# install new features that support latest models like Llama 2
pip install git+https://github.com/huggingface/peft.git
pip install git+https://github.com/huggingface/transformers.git
pip install scipy
학습 준비
실행에 앞서 위의 다운로드 내용에서 허깅페이스를 통해 라마2 액세스 승인을 얻었는지 다시한번 확인하면 좋을 것 같다.
다음 코드를 실행했을 때 토큰을 입력하라고 나온다. 글을 잘 읽어보고 시키는 대로 하면 된다.
from huggingface_hub import notebook_login
notebook_login()
필요 라이브러리를 import 한다.
from datasets import load_dataset
import torch
from transformers import AutoModelForCausalLM, BitsAndBytesConfig, AutoTokenizer, TrainingArguments
from peft import LoraConfig
from trl import SFTTrainer
데이터셋을 로드하고 모델도 지정한다.
dataset_name = "AdiOO7/llama-2-finance"
dataset = load_dataset(dataset_name, split="train")
base_model_name = "meta-llama/Llama-2-7b-hf"
다음 코드로 데이터셋을 확인해볼 수 있다.
dataset['text'][0]
다음은 본격적인 학습 준비이다. 7B 모델의 경우 약 10GB정도 한다. 여기서 나오는 라이브러리와 용어들에 대해 간략하게 설명하겠다.
PEFT는 위에서 설명했듯 Parameter-Efficient Fine-Tuning의 약자로 QLoRA(4-bit quantization을 씀)와 같은 효율적인 LLM 파인튜닝을 위한 라이브러리이다.
TRL(Transformer Reinforcement Learning)은 강화학습을 통해 언어 모델을 학습하는 라이브러리이다. 이 라이브러리는 SFT (Supervised Fine-tuning)을 지원하며 모델에 커스텀 데이터를 학습하기 쉽게 한다.
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
)
device_map = {"": 0}
base_model = AutoModelForCausalLM.from_pretrained(
base_model_name,
quantization_config=bnb_config,
device_map=device_map,
trust_remote_code=True,
use_auth_token=True
)
base_model.config.use_cache = False
# More info: <https://github.com/huggingface/transformers/pull/24906>
base_model.config.pretraining_tp = 1
peft_config = LoraConfig(
lora_alpha=16,
lora_dropout=0.1,
r=64,
bias="none",
task_type="CAUSAL_LM",
)
tokenizer = AutoTokenizer.from_pretrained(base_model_name, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
output_dir = "./results"
training_args = TrainingArguments(
output_dir=output_dir,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-4,
logging_steps=10,
max_steps=500
)
학습
다음 명령어를 통해 아주 간편하게 학습을 할 수 있다. 주의사항으론 학습을 돌리고 WanDB 인증키 입력하는 것을 잊지 말자.
max_seq_length = 512
trainer = SFTTrainer(
model=base_model,
train_dataset=dataset,
peft_config=peft_config,
dataset_text_field="text",
max_seq_length=max_seq_length,
tokenizer=tokenizer,
args=training_args,
)
trainer.train()
import os
output_dir = os.path.join(output_dir, "final_checkpoint")
trainer.model.save_pretrained(output_dir)
추가로 uncensored Llama2
기본적으로 라마2는 오픈소스이므로 메타에서 열심히 출력 결과를 검열하였다. 그런데 이 모델을 wizard_vicuna_70k_unfiltered라는 검열되지 않은 데이터셋에서 파인 튜닝 하였다는 모델이 있다고 하여 이를 통해 실험을 진행하면 또 완전히 다른 예상치 못한 결과가 나올 수 있다고 생각해 공유차 가져와 보았다.
파인튜닝한 모델 링크 : https://huggingface.co/georgesung/llama2_7b_chat_uncensored
이 글을 처음 접한 레딧 링크 : https://www.reddit.com/r/LocalLLaMA/comments/154rqay/llama2_7b_uncensored_qlora_finetune_on_wizard/?rdt=57011
'공부한 내용 정리 > 인공지능' 카테고리의 다른 글
[논문 리뷰]TinyTL: Reduce Activations, Not Trainable Parameters for Efficient On-Device Learning (0) | 2023.11.08 |
---|---|
SetFit 조사 및 distilbert와 sentiment analysis 성능 비교 (1) | 2023.08.19 |
LLM 조사 (0) | 2023.08.07 |
텍스트 분석 - 텍스트 전처리 (0) | 2023.06.27 |
[논문 리뷰]Hierarchical Attention Prototypical Networks for Few-Shot Text Classification (0) | 2023.05.19 |