[text-mining] GPT 미세 조정
GPT 미세 조정
Colab 런타임 유형 변경
- 메뉴: 런타임 → 런타임 유형 변경
- T4 GPU 선택
- 성능 비교: A100 GPU > L4 GPU > T4 GPU > CPU
허깅페이스 트랜스포머스 (Hugging Face Transformers)
- 최신의 사전 학습된(pre-trained) 머신러닝 모형을 간편하게 사용할 수 있는 Python 라이브러리입니다.
- 모델 구축과 학습 과정을 건너뛰고 바로 사용해볼 수 있습니다.
- 자신의 데이터에 추가적으로 학습시켜 미세 조정(fine-tuning)하여 사용하는 것도 가능합니다.
- 설치:
!pip install transformers datasets accelerate evaluatedatasets: 데이터셋 관리 라이브러리. 데이터셋을 직접 만들 수 있고, 허깅페이스 사이트에 공유된 타 데이터셋을 쉽게 다운로드할 수 있습니다.accelerate: PyTorch 코드를 멀티 GPU, TPU 등에서 손쉽게 사용할 수 있도록 도와주는 라이브러리입니다.evaluate: 머신러닝 모델과 데이터 세트를 쉽게 평가할 수 있는 라이브러리로, 다양한 도메인(NLP, 컴퓨터 비전, 강화 학습 등)에 대한 수십 가지 평가 방법을 제공합니다.
모델 찾기
- huggingface.co 방문 → models 메뉴 선택
- Task에서 Text Generation 선택
- 한국어 모델을 찾으려면 Languages에서 Korean을 선택
실습 데이터: NSMC
NSMC(Naver Sentiment Movie Corpus) 데이터셋: 네이버 영화평 감성 분석 말뭉치입니다.
import pandas as pd
url = 'https://github.com/e9t/nsmc/raw/master/ratings_train.txt'
df = pd.read_csv(url, sep='\t').dropna()
데이터셋 변환
from datasets import Dataset
# 데이터 프레임에서 한 행씩 읽어와 사전(dict)으로 반환하는 생성자
def gen():
for row in df.itertuples():
yield {'text': row.document, 'label': row.label}
# 생성자로부터 데이터셋을 만듦
ds = Dataset.from_generator(gen)
KoGPT2 모델 토크나이저
skt의 kogpt2 모델을 사용합니다.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(
"skt/kogpt2-base-v2",
bos_token='</s>',
eos_token='</s>',
unk_token='<unk>',
pad_token='<pad>',
mask_token='<mask>'
)
토큰화
# 토큰화 함수 정의: 64개 토큰보다 길면 자르고(truncation), 모자라면 <pad> 토큰으로 채움(padding)
def tokenize_function(examples):
return tokenizer(examples["text"], padding="max_length", truncation=True, max_length=64)
# 데이터셋에 토큰화 함수 일괄 적용
tokenized_ds = ds.map(tokenize_function, batched=True)
데이터 분할
# 최대 길이
total_size = len(ds)
# 90%는 훈련용으로 사용
train_size = int(total_size * 0.9)
train_ds = tokenized_ds.shuffle(seed=42).select(range(train_size))
# 나머지는 검증용으로 사용
eval_ds = tokenized_ds.shuffle(seed=42).select(range(train_size, total_size))
KoGPT2 모델 불러오기 및 훈련
# GPU 사용 가능한지 확인 (True라고 나와야 함)
import torch
torch.cuda.is_available()
# skt의 KoGPT2 모델 불러오기 (긍정/부정의 2가지로 분류하므로 num_labels=2)
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("skt/kogpt2-base-v2", num_labels=2)
# GPU로 모델을 옮김
model.to('cuda:0')
평가 지표: 정확도
import evaluate
import numpy as np
# 정확도 지표 로딩
metric = evaluate.load("accuracy")
# 지표 계산 함수
# logits 값이 가장 큰 위치를 예측값으로 사용하여 실제값과 비교
def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
return metric.compute(predictions=predictions, references=labels)
하이퍼파라미터 설정 및 훈련
from transformers import TrainingArguments, Trainer
# 1 에포크만 학습하도록 설정
training_args = TrainingArguments(
output_dir="test_trainer",
num_train_epochs=1
)
# 모델, 하이퍼파라미터, 데이터셋, 평가 지표를 설정
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_ds,
eval_dataset=eval_ds,
compute_metrics=compute_metrics,
)
# 훈련 시작
trainer.train()
모델 저장 및 파이프라인
저장 및 불러오기
# 훈련된 모델을 구글 드라이브에 저장
model_path = 'drive/MyDrive/kogpt2-nsmc'
model.save_pretrained(model_path)
# 구글 드라이브에서 모델 불러오기
model = AutoModelForSequenceClassification.from_pretrained(model_path, num_labels=2)
파이프라인 만들기
모델을 하나의 함수처럼 간편하게 사용하는 방법입니다.
from transformers import pipeline
# 레이블 설정
model.config.id2label = {0: 'NEGATIVE', 1: 'POSITIVE'}
# 파이프라인 설정
sm = pipeline('text-classification', model=model, tokenizer=tokenizer, device='cuda:0')
sm('이 영화 재밌다') # 긍정 문장
sm('돈 아깝다') # 부정 문장
미세 조정된 모델 사용하기
허깅페이스에서 NSMC에 이미 미세 조정된 모델을 다운받아 바로 사용할 수도 있습니다. 감성 분석의 경우, 미리 감성 분석 데이터에 미세 조정된 모델을 자신의 데이터로 재차 미세 조정하는 것이 일반 모델에서 시작하는 것보다 효율적입니다.
sm2 = pipeline("text-classification", model="seongyeon1/klue-base-finetuned-nsmc")
sm2.model.config.id2label = {0: 'NEGATIVE', 1: 'POSITIVE'}
sm2('이 영화 재밌다')
sm2('돈 아깝다')