Spaces:
Running
Running
| 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) |