학습 환경
하드웨어
- Ubuntu 22.04 LTS
- AMD EPYC 7302 16-Core Processor x 2
- Tesla A100 40G x 3
- CUDA: CUDA Toolkit 11.8, cuDNN 8.9
필수 라이브러리
- Anaconda Python 3.8
torch==2.0.1+cu118
transformers==4.29.2
peft==0.6.0.dev0
accelerate==0.21.0
datasets==2.14.4
bitsandbytes==0.41.1
커스텀 학습 및 추론
학습
- 프로젝트 폴더를 만들고 폴더 내 데이터셋과 학습모델을 위치함
- my_train.py
## 라이브러리 호출
import datasets
import transformers
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
## 학습가능한 파라미터 계산 함수 정의
def print_trainable_parameters(model):
"""
Prints the number of trainable parameters in the model.
"""
trainable_params = 0
all_param = 0
for _, param in model.named_parameters():
all_param += param.numel()
if param.requires_grad:
trainable_params += param.numel()
print(
f"trainable params: {trainable_params} || all params: {all_param} || trainable%: {100 * trainable_params / all_param}"
)
## 데이터셋 불러오기
# 로컬 데이터셋 로드
dataset = datasets.load_dataset('json', data_files='saved_0.8.json')
# 데이터셋 리포맷
data = dataset.map(lambda x: {'text': f"### 질문: {x['paragraphs']}\n\n### 답변: {x['answer']}<|endoftext|>"})
print(data)
## 모델 불러오기
# low bit 모델 세팅 (필요에 따라 사용)
bnb_config = BitsAndBytesConfig(
load_in_8bit=True,
# bnb_8bit_use_double_quant=True,
# bnb_8bit_quant_type="nf8",
# bnb_8bit_compute_dtype=torch.bfloat16
)
model = None
# 모델 로드
model = AutoModelForCausalLM.from_pretrained("polyglot-ko-12.8b", device_map="auto")
# 토크나이저 로드
tokenizer = AutoTokenizer.from_pretrained("polyglot-ko-12.8b")
# 데이터셋 토근화
data = data.map(lambda samples: tokenizer(samples["text"]), batched=True)
print(data)
## 학습준비
from peft import prepare_model_for_kbit_training
from peft import LoraConfig, get_peft_model
# GPU에 한 번에 안 올라가는 모델을 학습하기 위한 테크닉
# (연산 시간이 25% 가량 늘어나는 대신 메모리 사용량이 60% 가량 감소)
model.gradient_checkpointing_enable()
model = prepare_model_for_kbit_training(model)
config = LoraConfig(
r= 2048,
lora_alpha=32,
target_modules=["query_key_value"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, config)
print_trainable_parameters(model)
## 학습!
# needed for gpt-neo-x tokenizer
tokenizer.pad_token = tokenizer.eos_token
trainer = transformers.Trainer(
model=model,
train_dataset=data["train"],
args=transformers.TrainingArguments(
per_device_train_batch_size=1,
gradient_accumulation_steps=2,
max_steps=500, ##
learning_rate=1e-4,
fp16=True,
logging_steps=10,
output_dir="outputs",
#optim="paged_adamw_8bit"
),
data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),
)
model.config.use_cache = False # silence the warnings. Please re-enable for inference!
trainer.train()