Ringkas-In / notebooks /02_finetuning_bert_baseline.py
anthonysigid's picture
deploy SummAIrizer apps to spaces
2a16478
Raw
History Blame Contribute Delete
3.93 kB
# %% [markdown]
# # Template Fine-Tuning IndoBERT Baseline
# Jika Akurasi dari model Zero-Shot belum mencukupi untuk kebutuhan spesifik perusahaan,
# kita dapat melatih ulang (fine-tune) pre-trained model bahasa Indonesia (IndoBERT)
# menggunakan dataset klasifikasi mandiri.
# %%
import os
import json
import torch
import pandas as pd
from sklearn.model_selection import train_test_split
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from transformers import Trainer, TrainingArguments
from datasets import Dataset
# Pastikan menggunakan GPU jika tersedia
device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')
print(f"Menggunakan perangkat: {device}")
# %% [markdown]
# ## 1. Persiapan Data
# Misalkan kita memuat dataset dari synthetic, namun untuk fine-tuning idealnya
# kita membutuhkan minimal ratusan hingga ribuan data agar hasilnya stabil.
# %%
dataset_path = "../data/synthetic/dataset.json"
with open(dataset_path, 'r', encoding='utf-8') as f:
data = json.load(f)
df = pd.DataFrame(data)
# Buat mapping kategori ke ID angka (0, 1, 2, dst)
unique_labels = df['category'].unique().tolist()
label2id = {label: i for i, label in enumerate(unique_labels)}
id2label = {i: label for label, i in label2id.items()}
# Ubah target kolom
df['label'] = df['category'].map(label2id)
# Bagi dataset Train dan Test (80% / 20%)
train_df, test_df = train_test_split(df, test_size=0.2, random_state=42)
# Konversi DataFrame pandas menjadi HuggingFace Dataset
train_dataset = Dataset.from_pandas(train_df[['content', 'label']])
test_dataset = Dataset.from_pandas(test_df[['content', 'label']])
print(f"Jumlah Data Latih: {len(train_dataset)}")
print(f"Jumlah Data Uji: {len(test_dataset)}")
# %% [markdown]
# ## 2. Inisialisasi Tokenizer & Model
# Kita menggunakan IndoBERT dari IndoBenchmark
# %%
model_name = "indobenchmark/indobert-base-p1"
try:
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(
model_name,
num_labels=len(unique_labels),
id2label=id2label,
label2id=label2id
).to(device)
except Exception as e:
print(f"Gagal memuat model. Pastikan koneksi internet stabil. Error: {e}")
# %% [markdown]
# ## 3. Fungsi Tokenisasi (Preprocessing)
# %%
def tokenize_function(examples):
return tokenizer(examples['content'], padding="max_length", truncation=True, max_length=256)
tokenized_train = train_dataset.map(tokenize_function, batched=True)
tokenized_test = test_dataset.map(tokenize_function, batched=True)
# %% [markdown]
# ## 4. Konfigurasi Pelatihan (Training Arguments)
# %%
training_args = TrainingArguments(
output_dir="../models/indobert_finetuned",
evaluation_strategy="epoch",
learning_rate=2e-5,
per_device_train_batch_size=8, # Sesuaikan dengan VRAM GPU
per_device_eval_batch_size=8,
num_train_epochs=3,
weight_decay=0.01,
save_strategy="epoch",
logging_dir="../models/logs",
load_best_model_at_end=True,
)
from sklearn.metrics import accuracy_score, f1_score
def compute_metrics(pred):
labels = pred.label_ids
preds = pred.predictions.argmax(-1)
acc = accuracy_score(labels, preds)
f1 = f1_score(labels, preds, average='weighted')
return {"accuracy": acc, "f1": f1}
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_train,
eval_dataset=tokenized_test,
compute_metrics=compute_metrics
)
# %% [markdown]
# ## 5. Mulai Pelatihan
# (Uncomment baris di bawah untuk memulai proses pelatihan sungguhan)
# Peringatan: Sangat disarankan menjalankan proses ini di GPU/Google Colab.
# %%
# trainer.train()
# %% [markdown]
# ## 6. Simpan Model Terlatih
# %%
# trainer.save_model("../models/indobert_finetuned_final")
# tokenizer.save_pretrained("../models/indobert_finetuned_final")
# print("Model berhasil disimpan!")