Spaces:
Runtime error
Runtime error
| 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("๋ชจ๋ธ ์ ์ฅ ์๋ฃ. ์ด์ ์ ์ฅ๋ ๋ชจ๋ธ์ ๋ก๋ํ์ฌ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.") |