학습 환경

하드웨어

  • 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()

+inline +inline


참고


NLPLLMDeepLearning