TamilSense / src /train.py
vishnuexe's picture
load model from hf
d477079
import mlflow
import mlflow.pytorch
from transformers import (
AutoTokenizer,
AutoModelForSequenceClassification,
TrainingArguments,
Trainer
)
from datasets import Dataset
import pandas as pd
import numpy as np
from sklearn.metrics import accuracy_score, f1_score
import torch
MODEL_NAME = "google/muril-base-cased"
NUM_LABELS = 2
MAX_LENGTH = 128
LABEL2ID = {"positive": 0, "negative": 1}
ID2LABEL = {0: "positive", 1: "negative"}
print(f"GPU available: {torch.cuda.is_available()}")
print(f"GPU: {torch.cuda.get_device_name(0)}")
df_train = pd.read_csv('data/processed/train.csv')
df_test = pd.read_csv('data/processed/test.csv')
df_train['label'] = df_train['sentiment'].map(LABEL2ID)
df_test['label'] = df_test['sentiment'].map(LABEL2ID)
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
def tokenize(examples):
return tokenizer(
examples['text'],
padding='max_length',
truncation=True,
max_length=MAX_LENGTH
)
train_dataset = Dataset.from_pandas(df_train[['text', 'label']])
test_dataset = Dataset.from_pandas(df_test[['text', 'label']])
train_dataset = train_dataset.map(tokenize, batched=True)
test_dataset = test_dataset.map(tokenize, batched=True)
model = AutoModelForSequenceClassification.from_pretrained(
MODEL_NAME,
num_labels=NUM_LABELS,
id2label=ID2LABEL,
label2id=LABEL2ID
)
def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
acc = accuracy_score(labels, predictions)
f1 = f1_score(labels, predictions, average='weighted')
return {"accuracy": acc, "f1": f1}
training_args = TrainingArguments(
output_dir="models/tamil-sentiment",
num_train_epochs=8,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
eval_strategy="epoch",
save_strategy="epoch",
load_best_model_at_end=True,
metric_for_best_model="f1",
fp16=True,
logging_dir="logs",
logging_steps=50,
warmup_steps=500,
weight_decay=0.01,
learning_rate=1e-5,
)
mlflow.set_tracking_uri("file:///D:/tamil/mlruns")
mlflow.set_experiment("tamil-sentiment")
with mlflow.start_run(run_name="muril-binary-v4"):
mlflow.log_param("train_size", 55064)
mlflow.log_param("model", MODEL_NAME)
mlflow.log_param("epochs", 8)
mlflow.log_param("max_length", MAX_LENGTH)
mlflow.log_param("batch_size", 16)
mlflow.log_param("learning_rate", 1e-5)
mlflow.log_param("classes", "binary")
mlflow.log_param("train_size", len(df_train))
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=test_dataset,
compute_metrics=compute_metrics,
)
trainer.train()
results = trainer.evaluate()
mlflow.log_metric("accuracy", results['eval_accuracy'])
mlflow.log_metric("f1", results['eval_f1'])
print(f"\nAccuracy: {results['eval_accuracy']:.4f}")
print(f"F1 Score: {results['eval_f1']:.4f}")
trainer.save_model("models/tamil-sentiment-final")
tokenizer.save_pretrained("models/tamil-sentiment-final")
print("Model saved!")