밥풀의 개발일지
허깅페이스를 이용한 데이터셋 로드및 훈련(w/lora) 본문
1. 환경 설정
pip install transformers datasets peft
2. 데이터셋 로드
from datasets import load_dataset
# SQuAD 데이터셋 로드
dataset = load_dataset("squad")
3. 모델 로드
from transformers import AutoModelForQuestionAnswering, AutoTokenizer
model_name = "bert-base-uncased"
model = AutoModelForQuestionAnswering.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
4. LoRA 적용
from peft import LoRAConfig, get_peft_model
# LoRA 설정
lora_config = LoRAConfig(
r=8, # 저랭크의 크기
lora_alpha=32, # LoRA의 alpha 값
target_modules=["query", "value"], # LoRA를 적용할 모듈 (Transformer의 Query, Value 부분)
lora_dropout=0.1, # 드롭아웃 비율
bias="none" # 바이오스 적용 방법
)
# LoRA 적용된 모델 생성
lora_model = get_peft_model(model, lora_config)
5. 데이터셋 준비 및 토크나이징
def preprocess_function(examples):
return tokenizer(examples['question'], examples['context'], truncation=True)
encoded_dataset = dataset.map(preprocess_function, batched=True)
Q. 데이터셋을 전처리하는 로그에서 훈련 샘플과 검증 데이터셋의 샘플이 뭐야
- 훈련 샘플은 모델을 학습시키기 위해 사용하는 데이터이다.
- 검증 샘플은 모델의 성능을 평가하기 위해서 사용하는 데이터
- Q. 데이터셋을 구성할 때 훈련 샘플뿐만 아니라 검증 샘플도 필요한거야?
- 검증 샘플이 필요한 이유는 3가지가 있습니다.
- 과적합 방지: 모델이 훈련 샘플에 너무 잘 맞게 학습되는 것을 방지하고 일반화 성능을 높이기 위해 검증 샘플을 사용합니다.
- 모델 평가: 훈련 중간에 검증 데이터에서 성능을 확인하기 훈련을 조기에 종료 가능
- 하이퍼파라미터 튜닝: 학습률, 배치 크기 등의 하이퍼파라미터를 최적화하는 과정에서 검즘 샘플을 사용하여, 어떤 설정이 가장 좋은 성능을 내는지 판단할 수 있음
- Q. 하이퍼파라미터가 뭐야
- 크게 2가지로 나눌 수 있습니다.
- 모델 하이퍼 파라미터
- 모델의 구조와 관련된 하이퍼파라미터
- 신경망의 레이어 수
- 각 레이어의 뉴런 수
- 활성화 함수
- 모델의 구조와 관련된 하이퍼파라미터
- 학습 파라미터
- 모델 학습 과정에 영향을 미치는 파라미터
- 학습률: 가중치 업데이트의 크기를 조정하는 값, 학습률이 너무 크면 불안정해지고 너무 작으면 학습이 느려질 수 있습니다.
- 배치 크기(batch size): 한 번의 업데이트에 사용하는 데이터 샘플의 개수. 작은 배치 크기는 학습의 변동성을 높이고, 큰 배치의 크기는 더 안정적인 학습을 제공
- 에포크(epoch): 전체 훈련 데이터를 몇 번 반복하여 학습할지를 결정하는 값
- 드롭아웃 비율(dropout rate): 학습 과정에서 무작위로 뉴런을 비활성화하는 비율
- 하이퍼파라미터 튜닝을 위한 방법으로 주요하게 3가지 있음
- 그리드 서치(Grid Search)
- 랜덤 서치(Random Search)
- 베이지안 최적화(Bayesian Optimization)
- 이전 시도의 결과를 바탕으로 다음 시도를 결정하는 방법으로, 효율적으로 최적의 하이퍼파라미터를 찾을 수 있습니다.
- 모델 학습 과정에 영향을 미치는 파라미터
- 검증 샘플이 필요한 이유는 3가지가 있습니다.
6. 훈련 준비
from transformers import TrainingArguments, Trainer
# 훈련 인자 설정
training_args = TrainingArguments(
output_dir="./results", # 출력 디렉토리
evaluation_strategy="epoch", # 에포크마다 평가
learning_rate=2e-5, # 학습률
per_device_train_batch_size=16, # 훈련 배치 크기
per_device_eval_batch_size=16, # 평가 배치 크기
num_train_epochs=3, # 훈련 에포크 수
weight_decay=0.01, # 가중치 감쇠 (정규화)
)
# 트레이너 설정
trainer = Trainer(
model=lora_model, # LoRA가 적용된 모델
args=training_args, # 훈련 인자
train_dataset=encoded_dataset["train"], # 훈련 데이터셋
eval_dataset=encoded_dataset["validation"], # 검증 데이터셋
)
- evaluation_strategy
- 검증 데이터를 사용하여 훈련 중에 모델을 평가하는 전략을 설정합니다.
- learning_rate
- 학습률로 가중치를 업데이트할 때 적용되는 스텝의 크기로 너무 크면 학습이 불안정해지고 너무 작으면 학습이 느려질 수 있습니다.
- per_device_eval_batch_size
- 훈련 시 각 디바이스에서 처리하는 배치의 크기입니다. 배치 크기가 크면 더 많은 메모리가 필요하지만, 더 안정적인 학습이 가능합니다.
- per_device_eval_batch_size
- 평가 시 각 디바이스에서 처리하는 배치의 크기입니다. 훈련 배치 크기와 동일하게 설정하는 경우가 많지만, 경우에 따라 다르게 설정할 수 있습니다.
- num_train_epochs
- 훈련 데이터셋을 몇 번 반복해서 학습할지를 설정합니다. 에포크 수가 너무 적으면 모델이 충분히 학습되지 않을 수 있습니다. 너무 많으면 과적합이 될 수 있습니다.
- weight_decay
- 가중치 감쇠는 L2 정규화 기법의 일종으로, 모델의 복잡도를 줄이고 과적합을 방지하기 위해 가중치 값을 점진적으로 감소시킵니다.
- save_steps
- 체크포인트를 저장하는 스텝 간격을 설정합니다.
- save_total_limit
- 저장할 체크포인트의 최대 개수를 설정합니다. 이 값을 초과하면 오래된 체크포인트부터 삭제합니다.
Q. 스텝이 뭐지
- 모델 훈련 과정의 기본 단위를 의미합니다. 스텝은 모델이 한 번의 가중치 업데이트를 수행하는 과정을 나타냅니다.
- 스텝의 구체적인 의미
- 배치(batch): 훈련 데이터셋을 작은 그룹으로 나눈 것
- 스텝(step): 모델이 한 번의 배치를 처리하고 가중치를 업데이트하는 과정, 즉 배치가 처리될 때마다 한 스텝이 진행됩니다.
- 에포크(epoch): 전체 훈련 데이터셋을 한 번 모두 사용하여 학습을 완료하는 과정
- 스텝이 중요한 이유
- 모델이 한 스텝을 수행할 때마다 배치에 있는 샘플들의 손실(Loss)를 계산하고, 이 손실을 줄이기 위해 가중치가 업데이트 됩니다.
Q. 체크포인트가 뭐지
- 모델 훈련이 중단되었을 경우 마지막으로 저장된 체크포인트에서 훈련을 다시 시작할 수 있습니다.
- 체크포인트이 구성요소
- 모델 가중치
- 옵티마이저 상태: 옵티마이저의 파라미터(예: 학습률, 모멘텀, SGD)
- 모델의 가중치를 업데이트하는 알고리즘
- 학습률 스케줄러: 학습률 조정을 위한 스케줄러의 상태
- 학습률 스케줄러는 훈련 과정에서 학습률을 동적으로 조정하는 역할을 합니다. 가령 초기 학습률은 훈련 초기에는 높게 설정하고 훈련이 진행됨에 따라 점점 낮추는 방식이 일반적입니다.
- 훈련 상태: 현재 에포크 수, 스텝 수, 손실 값 등
7. 모델 훈련
trainer.train()
Trainer 객체를 사용하여 설정된 데이터셋과 하이퍼파라미터로 모델을 훈련시킵니다.
'개발' 카테고리의 다른 글
| OpenCV + opencv_contrib 직접 빌드 및 Python 바인딩 오류 정리 (feat. SURF 사용) (0) | 2025.06.02 |
|---|---|
| Finetuning 공부 (4) | 2024.11.28 |
| [오류 해결] The list of sources could not be read. (0) | 2024.11.28 |
| GPU가속을 위한 nvidia graphic driver, cuda,cuDNN 설치 (0) | 2024.11.28 |
| 컨테이너에 모델 올리기(miniGPT-4) (0) | 2024.11.28 |