File size: 2,815 Bytes
168ae1c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import os
os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "max_split_size_mb:128"

from transformers import (
    AutoTokenizer, 
    AutoModelForSequenceClassification,
    Trainer, 
    TrainingArguments
)
from datasets import load_from_disk
import torch
import numpy as np
from sklearn.metrics import accuracy_score

print("="*60)
print("QUICK TRAINING IN VIRTUAL ENVIRONMENT")
print("="*60)

# Load dataset
print("πŸ“‚ Loading dataset...")
dataset = load_from_disk("data/hf_dataset")

# Split dataset
dataset = dataset.train_test_split(test_size=0.2, seed=42)
print(f"Train size: {len(dataset['train'])}")
print(f"Test size: {len(dataset['test'])}")

# Load tokenizer and model
print("πŸ€– Loading CodeBERT from Hugging Face...")
model_name = "microsoft/codebert-base"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(
    model_name, 
    num_labels=2
)

# Tokenization function
def tokenize_function(examples):
    return tokenizer(
        examples["code"],
        padding="max_length",
        truncation=True,
        max_length=128
    )

# Tokenize dataset
print("πŸ”’ Tokenizing dataset...")
tokenized_datasets = dataset.map(tokenize_function, batched=True)

# Remove text columns (keep only tokens)
tokenized_datasets = tokenized_datasets.remove_columns(["code", "type", "explanation"])
tokenized_datasets.set_format("torch")

# Training arguments (QUICK - for testing)
training_args = TrainingArguments(
    output_dir="./model_checkpoints",
    num_train_epochs=3,  # Small for quick training
    per_device_train_batch_size=8,
    per_device_eval_batch_size=8,
    warmup_steps=100,
    weight_decay=0.01,
    logging_dir="./logs",
    logging_steps=10,
    eval_strategy="steps",
    eval_steps=50,
    save_strategy="steps",
    save_steps=100,
    load_best_model_at_end=True,
    metric_for_best_model="accuracy",
    greater_is_better=True,
)

# Compute metrics
def compute_metrics(p):
    predictions, labels = p
    predictions = np.argmax(predictions, axis=1)
    accuracy = accuracy_score(labels, predictions)
    return {"accuracy": accuracy}

# Create trainer
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["test"],
    compute_metrics=compute_metrics,
)

# Train!
print("πŸš€ Starting training...")
print("This will take 2-5 minutes depending on your system")
trainer.train()

# Evaluate
print("\nπŸ“Š Evaluating model...")
metrics = trainer.evaluate()
print(f"Test Accuracy: {metrics['eval_accuracy']:.2%}")

# Save model
print("πŸ’Ύ Saving model...")
trainer.save_model("saved_model")
tokenizer.save_pretrained("saved_model")

print("\n" + "="*60)
print("πŸŽ‰ TRAINING COMPLETE!")
print("Model saved to: saved_model/")
print("="*60)