Topic. LLaMA 2 모델 NousResearch/Llama-2-13b-chat-hf 을 LoRA 방식으로 미세조정해봅시다.
1. 실습환경 구성
아래 글을 참조하여 실습환경을 구성합니다.
[실습] A.I. Pre-trained Model Fine-tuning 을 위한 환경설정(Linux Ubuntu)
2. Pretrained Model, Datasets Information
model_pretrained_name | NousResearch/Llama-2-13b-chat-hf https://huggingface.co/NousResearch/Llama-2-13b-chat-hf |
data_path | b-mc2/sql-create-context https://huggingface.co/datasets/b-mc2/sql-create-context |
3. 실습
1. 필요한 라이브러리 import
import transformers
from datasets import load_dataset
from peft import (
prepare_model_for_int8_training,
LoraConfig,
get_peft_model,
get_peft_model_state_dict,
)
from transformers import LlamaForCausalLM, LlamaTokenizer
2. Generate_Prompt 함수 정의
def generate_prompt(data_point):
# sorry about the formatting disaster gotta move fast
if data_point["context"]:
return f"""
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:
{data_point["question"]}
### Input:
{data_point["context"]}
### Response:
{data_point["answer"]}"""
else:
return f"""Below is an instruction that describes a task. Write a response that appropriately completes the request.
### Instruction:
{data_point["question"]}
### Response:
{data_point["answer"]}
"""
* LLM 과 같은 생성형 AI Model은 주어진 문장 뒤에 어떤 내용이 올지 유추하여 주어진 문자열 뒤에 붙입니다. 따라서 AI Model 에게 문자열을 어떻게 주느냐에 따라 답변의 퀄리티는 달라집니다. 충분히 AI에게 힌트를 주면서 성능을 테스트 하는것이 중요합니다.
3. Tokenize 함수 정의
CUTOFF_LEN = 256
def tokenize(prompt, tokenizer):
# there's probably a way to do this with the tokenizer settings
# but again, gotta move fast
result = tokenizer(
prompt,
truncation=True,
max_length=CUTOFF_LEN + 1,
padding="max_length",
)
return {
"input_ids": result["input_ids"][:-1],
"attention_mask": result["attention_mask"][:-1],
}
** 중요 **
CUTOFF_LEN 변수는 토크나이저의 max_length 를 정의합니다.
이 값이 너무 작으면 학습할 데이터가 잘릴 수 있고
너무 크면 학습이 너무 오래걸리거나 불가할 수 있으니
데이터셋의 학습 내용을 토큰화했을때의 최대길이를 구하여 적절히 적용하시기 바랍니다.
4. Model, Tokenizer, dataset 로드
model_pretrained_name = 'NousResearch/Llama-2-13b-chat-hf'
data_path = 'b-mc2/sql-create-context'
model = LlamaForCausalLM.from_pretrained(
model_pretrained_name,
load_in_8bit=True,
# load_in_4bit=True, 양자화(quantization) 학습속도 증가
device_map="auto",
)
tokenizer = LlamaTokenizer.from_pretrained(
model_pretrained_name, add_eos_token=True,
)
tokenizer.pad_token_id = 0
data = load_dataset(data_path)
* 베이스 모델과 해당 모델의 토크나이저를 가져옵니다.
* load_in_4 or 8 bit 옵션은 모델을 몇 bit 로 가져올지 설정합니다.
* 4bit 가 가장 작은 단위이며 학습속도가 증가하지만 모델의 품질은 검증이 필요합니다.
* 또 학습을 시킬 데이터를 가져옵니다.
[참고] AutoModelForCausalLM, AutoTokenizer 를 사용하면
모델과 함께 명시되어있는 토크나이저를 자동으로 가져올 수 있습니다.
5. 16비트 정밀도로 훈련 준비
model = prepare_model_for_int8_training(model)
prepare_model_for_int8_training은 Hugging Face Transformers 라이브러리의 함수로, 32비트 정밀도로 훈련된 모델을 16비트 정밀도로 훈련하기 위해 준비하는 함수입니다. 이 함수는 모델의 가중치와 바이어스를 16비트로 변환하고, 활성화 함수의 계산을 16비트로 조정합니다.
6. LoRA Hyperparameter 정의
# hyperparams
LORA_R = 8
LORA_ALPHA = 16
LORA_DROPOUT = 0.05
TARGET_MODULES = [
"q_proj",
"v_proj",
]
config = LoraConfig(
r=LORA_R,
lora_alpha=LORA_ALPHA,
target_modules=TARGET_MODULES,
lora_dropout=LORA_DROPOUT,
bias="none",
task_type="CAUSAL_LM",
)
LoRA Hyperparameter 는 아래 글을 참조하십시오.
[이론] LoRA Fine-tuning
Topic. LoRA(Low-Rank Adaptation) 에 대해 알아봅니다. 1. LoRA 란? Low-Rank Adaptation 약어로 Huggingface 에서 개발한 Parameter-Efficient Fine-Tuning (PEFT) 방식중에 하나입니다. 파이썬의 peft 라이브러리를 사용하여 쉽
x2bee.tistory.com
7. 저사양 하드웨어에서 학습하기 위한 준비
model = get_peft_model(model, config)
get_peft_model은 Hugging Face Transformers 라이브러리의 함수로, PEFT(Parameter-Efficient Fine-Tuning) 모델을 생성합니다. PEFT는 대규모 언어 모델을 저사양 하드웨어에서 효율적으로 학습하기 위해 고안된 방법입니다.
8. 학습용데이터와 검증용데이터 분리 및 토큰화
VAL_SET_SIZE = 2000
train_val = data["train"].train_test_split(
test_size=VAL_SET_SIZE, shuffle=True, seed=42
)
train_data = train_val["train"]
val_data = train_val["test"]
train_data = train_data.shuffle().map(lambda x: tokenize(generate_prompt(x), tokenizer))
val_data = val_data.shuffle().map(lambda x: tokenize(generate_prompt(x), tokenizer))
9. TrainingArguments Parameter 설정
trainer = transformers.Trainer(
model=model,
train_dataset=train_data,
eval_dataset=val_data,
args=transformers.TrainingArguments(
per_device_train_batch_size = 8,
gradient_accumulation_steps = 128,
warmup_steps = 100,
num_train_epochs = 3,
learning_rate = 2e-4,
fp16 = False,
bf16 = False,
logging_steps = 20,
evaluation_strategy = "steps",
save_strategy = "steps",
eval_steps = 20,
save_steps = 20,
output_dir = "output/llama2-text2sql-case01",
report_to = "none",
save_total_limit = 3,
load_best_model_at_end = True,
),
data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),
)
* TrainingArguments 파라미터에 관한 설명은 아래 글을 참조하십시오.
[A.I.(인공지능) & M.L.(머신러닝)/딥러닝] - [이론] Hugging Face Trainer.TrainingArguments
10. model state_dict 갱신 (삭제)
model.config.use_cache = False
old_state_dict = model.state_dict
model.state_dict = (
lambda self, *_, **__: get_peft_model_state_dict(self, old_state_dict())
).__get__(model, type(model))
use_cache 는 디코더에서 이전 계산 결과를 재사용하여 속도를 높이는 기능입니다.LoRA Fine-tuning 과정에서는 이 기능이 필요하지 않으므로 False로 설정합니다.state_dict 는 모델의 모든 훈련 가능한 매개변수 값을 포함하는 딕셔너리입니다.이 코드는 모델의 상태 사전을 새로운 함수로 대체합니다.새로운 함수는 get_peft_model_state_dict 함수를 호출하여 모델의 상태 사전을 가져옵니다.get_peft_model_state_dict 함수는 LoRA Fine-tuning 과정에 필요한 특정 형식의 상태 사전을 생성합니다.
이 코드가 필요한 이유는 LoRA Fine-tuning 과정에서는 모델의 모든 매개변수를 업데이트하는 대신 저 순위 행렬을 사용하여 모델을 업데이트합니다. 따라서 모델의 상태 사전을 get_peft_model_state_dict 함수를 활용하여 LoRA Fine-tuning 과정에 필요한 특정 형식으로 변환해야 합니다. get_peft_model_state_dict 함수는 peft 라이브러리에서 제공하는 함수입니다.
11. 학습시작 및 모델 저장
trainer.train(resume_from_checkpoint = False)
model.save_pretrained(output_dir, safe_serialization = False)
- resume_from_checkpoint 옵션은 TrainingArguments 에서 설정한 output_dir 에서 최종적으로 저장된 checkpoint 를 가져올지 여부를 지정합니다. 학습 도중 프로그램이 종료가 된 경우 checkpoint부터 이어서 학습할 수 있습니다.
output_dir 에 저장된 checkpoint 없는경우 output_dir 에 checkpoint를 찾을수 없다는 오류가 발생합니다. - safe_serialization 옵션은 최종적으로 학습된 모델을 safetensors 형태로 저장할것인지 여부를 설정합니다.
* 실행
정상적으로 학습이 진행되는 중입니다.
torch1.x 에서 55시간 이상 소요되었던 학습시간이 torch2.0 으로 학습을 진행하니 약 21시간 정도로 줄어들었습니다.
'A.I.(인공지능) & M.L.(머신러닝) > 딥러닝' 카테고리의 다른 글
PyTorch(used GPU) 코드를 독립 실행파일로 패키징 (3) | 2024.12.27 |
---|---|
Neural Prophet 삼성전자 주가 예측 (2) | 2024.12.25 |
[이론] Hugging Face Trainer.TrainingArguments (0) | 2023.12.18 |