Spaces:
Runtime error
Runtime error
File size: 4,315 Bytes
899f482 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
import torch
import numpy as np
from datasets import load_dataset, Dataset
from transformers import AutoTokenizer, AutoModelForSequenceClassification, TrainingArguments, Trainer
from sklearn.metrics import accuracy_score, f1_score
# 1. GPU/CPU ์ฅ์น ์ค์ (ํ์ต ์ Trainer๊ฐ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ฏ๋ก ํ์ธ์ฉ)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"์ฌ์ฉ ์ฅ์น: {device}")
# 2. ๋ชจ๋ธ ๋ฐ ํ ํฌ๋์ด์ ๋ก๋
MODEL_NAME = "FacebookAI/xlm-roberta-base"
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
# ๋ถ๋ฅ๋ฅผ ์ํด AutoModelForSequenceClassification ๋ก๋ (๋ถ๋ฅ ํค๋๊ฐ ์ถ๊ฐ๋จ)
model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=2)
# num_labels=2: ๊ธ์ (1), ๋ถ์ (0)์ ๊ตฌ๋ถํ๋๋ก ์ค์
# 3. ๊ฐ์ ๋ฐ์ดํฐ์
์ค๋น ๋ฐ ์ ์ฒ๋ฆฌ
# ์ค์ ํ์ต ์์๋ ์ฌ๊ธฐ์ ๋น์ ์ ๋น๊ทผ๋ง์ผ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํด์ผ ํฉ๋๋ค.
data = {
'text': [
"๋งค๋๊ฐ ์ ๋ง ์ข์ผ์ธ์! ๊ธฐ๋ถ ์ข์ ๊ฑฐ๋์์ต๋๋ค.", # ๊ธ์
"๋ฌผ๊ฑด ์ํ๊ฐ ๋ณ๋ก๊ณ ๋ต๋ณ๋ ๋๋ฌด ๋๋ ธ์ด์.", # ๋ถ์
"๋น ๋ฅธ ์๋ต๊ณผ ๊น๋ํ ๊ฑฐ๋ ๊ฐ์ฌํฉ๋๋ค.", # ๊ธ์
"๊ฐ๊ฒฉ์ด ๋๋ฌด ๋น์ธ๋ค์. ๋น์ถ์
๋๋ค.", # ๋ถ์
"์ค๋๋ ๋ง์กฑ์ค๋ฌ์ด ์ค๊ณ ๊ฑฐ๋์์ต๋๋ค.", # ๊ธ์
"์๊ฐ ์ฝ์ ์ ์งํค๊ณ ์ฐ๋ฝ๋ ์ ์ ๋๋ค์.", # ๋ถ์
],
'label': [1, 0, 1, 0, 1, 0] # 1: ๊ธ์ , 0: ๋ถ์
}
raw_dataset = Dataset.from_dict(data)
# ๋ฐ์ดํฐ์
์ ํ์ต(train)๊ณผ ํ๊ฐ(test) ์ธํธ๋ก ๋ถํ (์์์ด๋ฏ๋ก 50:50)
train_test_split = raw_dataset.train_test_split(test_size=0.5, seed=42)
train_dataset = train_test_split['train']
eval_dataset = train_test_split['test']
def tokenize_function(examples):
# ์
๋ ฅ ํ
์คํธ๋ฅผ ํ ํฐํํฉ๋๋ค.
return tokenizer(examples['text'], truncation=True, padding='max_length', max_length=128)
# ๋ฐ์ดํฐ์
์ ํ ํฌ๋์ด์ ์ ์ฉ
tokenized_train_dataset = train_dataset.map(tokenize_function, batched=True)
tokenized_eval_dataset = eval_dataset.map(tokenize_function, batched=True)
# 4. ํ๊ฐ ์งํ ํจ์ ์ ์
def compute_metrics(p):
# ์์ธก๋ ๋ก์ง(logits)์์ argmax๋ฅผ ์ทจํด ์์ธก ๋ ์ด๋ธ์ ์ป์ต๋๋ค.
predictions = np.argmax(p.predictions, axis=1)
# ์ ํ๋(Accuracy)์ F1-Score๋ฅผ ๊ณ์ฐํฉ๋๋ค.
acc = accuracy_score(p.label_ids, predictions)
f1 = f1_score(p.label_ids, predictions, average='binary') # ๊ธ์ (1)์ ๋ํ F1-Score
return {"accuracy": acc, "f1": f1}
# 5. ํ์ต ์ค์ (TrainingArguments)
OUTPUT_DIR = "./xlm-roberta-review-classifier" # ๋ชจ๋ธ์ ์ ์ฅํ ๊ฒฝ๋ก
training_args = TrainingArguments(
output_dir=OUTPUT_DIR,
num_train_epochs=3, # ํ์ต ํ์ (์ค์ ์์
์ 3~5ํ ๊ถ์ฅ)
per_device_train_batch_size=8, # GPU๋น ํ์ต ๋ฐฐ์น ํฌ๊ธฐ (VRAM์ ๋ฐ๋ผ ์กฐ์ )
per_device_eval_batch_size=8, # GPU๋น ํ๊ฐ ๋ฐฐ์น ํฌ๊ธฐ
warmup_steps=500, # ํ์ต๋ฅ ์ด ์ต๋์น์ ๋๋ฌํ๋ ๋จ๊ณ ์
weight_decay=0.01, # ๊ฐ์ค์น ๊ฐ์ (์ค๋ฒํผํ
๋ฐฉ์ง)
logging_dir='./logs', # ๋ก๊ทธ ์ ์ฅ ๊ฒฝ๋ก
logging_steps=10,
eval_strategy="epoch", # ์ํฌํฌ๋ง๋ค ํ๊ฐ ์ํ
save_strategy="epoch", # ์ํฌํฌ๋ง๋ค ๋ชจ๋ธ ์ ์ฅ
load_best_model_at_end=True, # ํ์ต ์ข
๋ฃ ์ ๊ฐ์ฅ ์ข์ ์ฑ๋ฅ์ ๋ชจ๋ธ ๋ก๋
fp16=torch.cuda.is_available(), # GPU ์ฌ์ฉ ์ ์๋๋ฅผ ์ํด fp16 ์ฌ์ฉ
)
# 6. Trainer ๊ฐ์ฒด ์์ฑ ๋ฐ ํ์ต ์์
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_train_dataset,
eval_dataset=tokenized_eval_dataset,
compute_metrics=compute_metrics,
)
print("\n--- ํ์ธ ํ๋ ์์ ---")
trainer.train()
# 7. ์ต์ข
๋ชจ๋ธ ์ ์ฅ
# ํ์ต๋ ๋ชจ๋ธ๊ณผ ํ ํฌ๋์ด์ ๋ฅผ ์ง์ ๋ ๊ฒฝ๋ก์ ์ ์ฅํฉ๋๋ค.
print(f"\n--- ํ์ธ ํ๋ ์๋ฃ, ๋ชจ๋ธ์ {OUTPUT_DIR}์ ์ ์ฅ ์ค ---")
trainer.save_model(OUTPUT_DIR)
tokenizer.save_pretrained(OUTPUT_DIR)
print("๋ชจ๋ธ ์ ์ฅ ์๋ฃ. ์ด์ ์ ์ฅ๋ ๋ชจ๋ธ์ ๋ก๋ํ์ฌ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.") |