Download train.py from ashritaa-chinnari123/code_explainer_bug_checker_NLP_project: direct link, hf CLI and curl.
- Browser
- Download file 2.81 kB
-
https://huggingface.co/spaces/ashritaa-chinnari123/code_explainer_bug_checker_NLP_project/resolve/main/train.py
- Command line
-
hf download hf://spaces/ashritaa-chinnari123/code_explainer_bug_checker_NLP_project/train.py
-
curl -L -o train.py https://huggingface.co/spaces/ashritaa-chinnari123/code_explainer_bug_checker_NLP_project/resolve/main/train.py
2.81 kB
| """ | |
| Fine-tune CodeT5 on a buggy-code -> fixed-code dataset. | |
| Dataset: CodeXGLUE "code-refinement" (Java, small subset) — pairs of | |
| (buggy_function, fixed_function). This is the standard benchmark for this | |
| exact task, so it's a strong, defensible choice for a project report. | |
| Swap `DATASET_NAME` for "google/code_x_glue_cc_code_refinement" (small) or | |
| use the "Bugs2Fix" dataset if you want Python-only pairs instead. | |
| Run: | |
| pip install -r requirements.txt | |
| python train.py | |
| """ | |
| from datasets import load_dataset | |
| from transformers import ( | |
| AutoTokenizer, | |
| AutoModelForSeq2SeqLM, | |
| Seq2SeqTrainer, | |
| Seq2SeqTrainingArguments, | |
| DataCollatorForSeq2Seq, | |
| ) | |
| MODEL_NAME = "Salesforce/codet5-base" | |
| DATASET_NAME = "google/code_x_glue_cc_code_refinement" | |
| DATASET_CONFIG = "small" # or "medium" | |
| OUTPUT_DIR = "./checkpoints/codet5-bugfix-finetuned" | |
| MAX_INPUT_LEN = 256 | |
| MAX_TARGET_LEN = 256 | |
| def main(): | |
| print("Loading dataset...") | |
| raw_dataset = load_dataset(DATASET_NAME, DATASET_CONFIG) | |
| print("Loading tokenizer & model...") | |
| tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) | |
| model = AutoModelForSeq2SeqLM.from_pretrained(MODEL_NAME) | |
| def preprocess(examples): | |
| inputs = ["fix bug: " + code for code in examples["buggy"]] | |
| targets = examples["fixed"] | |
| model_inputs = tokenizer( | |
| inputs, max_length=MAX_INPUT_LEN, truncation=True, padding="max_length" | |
| ) | |
| labels = tokenizer( | |
| targets, max_length=MAX_TARGET_LEN, truncation=True, padding="max_length" | |
| ) | |
| model_inputs["labels"] = labels["input_ids"] | |
| return model_inputs | |
| print("Tokenizing...") | |
| tokenized_dataset = raw_dataset.map( | |
| preprocess, batched=True, remove_columns=raw_dataset["train"].column_names | |
| ) | |
| data_collator = DataCollatorForSeq2Seq(tokenizer, model=model) | |
| training_args = Seq2SeqTrainingArguments( | |
| output_dir=OUTPUT_DIR, | |
| eval_strategy="epoch", | |
| save_strategy="epoch", | |
| learning_rate=3e-5, | |
| per_device_train_batch_size=8, | |
| per_device_eval_batch_size=8, | |
| num_train_epochs=5, | |
| weight_decay=0.01, | |
| predict_with_generate=True, | |
| fp16=True, # requires GPU | |
| logging_steps=50, | |
| save_total_limit=2, | |
| load_best_model_at_end=True, | |
| ) | |
| trainer = Seq2SeqTrainer( | |
| model=model, | |
| args=training_args, | |
| train_dataset=tokenized_dataset["train"], | |
| eval_dataset=tokenized_dataset["validation"], | |
| data_collator=data_collator, | |
| tokenizer=tokenizer, | |
| ) | |
| print("Starting fine-tuning...") | |
| trainer.train() | |
| print(f"Saving final model to {OUTPUT_DIR}") | |
| trainer.save_model(OUTPUT_DIR) | |
| tokenizer.save_pretrained(OUTPUT_DIR) | |
| if __name__ == "__main__": | |
| main() | |