PyTorch와 Hugging Face를 활용한 NLP 모델 파인튜닝 예제

honeychicc·2024년 10월 31일

1. 데이터셋 로딩

먼저 데이터셋을 로딩하는 과정입니다. JSON, CSV, 판다스를 사용한 다양한 방법을 통해 데이터셋을 불러올 수 있으며, 여기서는 DatasetDict.from_json 메서드를 사용해 JSON 형식의 데이터셋을 DatasetDict 객체로 불러옵니다. 이외에도 from_csv, from_pandas 등 다른 형식의 데이터셋 로딩 방법도 제공됩니다.

dataset = DatasetDict.from_json({'train': path_json_dataset})

2. 데이터셋 토큰화 및 전처리

다음으로, 데이터셋의 텍스트를 토큰화하여 모델이 학습할 수 있도록 전처리합니다. 각 문서를 토큰화하여 길이 제한(max_length=512) 안에 맞추고, 패딩 처리를 추가로 수행합니다. 토큰화된 텍스트 외 다른 컬럼들은 삭제합니다.

dataset = dataset.map(lambda x: tokenizer(x['text'], truncation=True, padding=True, max_length=512), 
                      batched=True, 
                      remove_columns=dataset["train"].column_names)
                      
#dataset ['train'] = dataset ['train'].add_column(' labels', dataset ['train'][' input_ids' ])

텍스트 컬럼 변경 가능성: text 컬럼이 아닌 다른 컬럼명을 사용할 경우, 데이터를 확인해 적절히 변경할 수 있습니다.
seq2seq 문제: seq2seq 작업이 필요한 경우, labels 컬럼에 input_ids를 추가하는 방식으로 데이터셋을 구성할 수 있습니다.

3. Collator 생성

모델이 데이터를 처리하는 방식을 조정하기 위해 DataCollatorForLanguageModeling을 사용합니다. 여기서는 mlm=False로 설정하여 Masked Language Modeling 없이 일반적인 언어 모델링 학습을 진행하도록 설정했습니다.

data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False, return_tensors='pt')
#DataCollatorForSeq2Seq(tokenizer=tokenizer, model=model, return_tensors='pt')
sample = [dataset['train'][i] for i in range(1)]

DataCollatorForSeq2Seq: Seq2Seq 작업의 경우, DataCollatorForSeq2Seq를 사용하여 데이터 형식을 변경할 수 있습니다.

4. 학습 인자 설정

모델 학습을 위한 다양한 파라미터를 TrainingArguments를 통해 지정합니다. 출력 디렉토리, 학습률, 에포크 수, 배치 크기, CPU 사용 여부 등을 설정할 수 있습니다.

training_args = TrainingArguments(
    output_dir='out',
    learning_rate=7e-4,
    do_train=True,
    do_eval=False,
    num_train_epochs=100,
    per_device_train_batch_size=4,
    use_cpu=True,
    save_strategy="no"
)

에포크 및 학습률: num_train_epochs와 learning_rate를 통해 학습 횟수와 학습 속도를 조정할 수 있습니다.
저장 전략: save_strategy는 학습 결과를 얼마나 자주 저장할지 결정합니다.

5. Trainer 설정 및 모델 학습

학습을 위해 Trainer 객체를 생성하고 학습을 수행한 후, 학습된 모델을 저장합니다. 데이터셋, 학습 인자, collator를 Trainer에 전달하여 최적화된 학습 환경을 구축합니다.

trainer = Trainer(model, train_dataset=dataset['train'], args=training_args, data_collator=data_collator)
trainer.train()
trainer.save_model(path_finetuned_model)

0개의 댓글