Mukul Rayana
Day 1: data pipeline, session tracker, query router, adversarial probes, Colab training notebooks
bc3ba9e | # EmpathRAG β DeBERTa NLI Safety Guardrail Fine-Tuning | |
| # Run on Google Colab Pro (A100). Expected time: under 2 hours. | |
| # Target: recall > 0.80, precision > 0.65 | |
| # | |
| # SETUP INSTRUCTIONS: | |
| # 1. Upload nli_train.csv, nli_val.csv, nli_test.csv to Colab (or mount Drive) | |
| # 2. Set runtime to A100 GPU | |
| # 3. Run all cells in order | |
| # ββ Cell 1: Install ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # !pip install transformers datasets evaluate scikit-learn accelerate -q | |
| # ββ Cell 2: Mount Drive ββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # from google.colab import drive | |
| # drive.mount("/content/drive") | |
| # SAVE_DIR = "/content/drive/MyDrive/empathrag/safety_guardrail" | |
| # !mkdir -p {SAVE_DIR} | |
| # ββ Cell 3: Training script ββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| import pandas as pd | |
| import numpy as np | |
| import torch | |
| import evaluate as evaluate_lib | |
| from datasets import Dataset | |
| from transformers import ( | |
| AutoTokenizer, | |
| AutoModelForSequenceClassification, | |
| TrainingArguments, | |
| Trainer, | |
| ) | |
| SAVE_DIR = "/content/drive/MyDrive/empathrag/safety_guardrail" | |
| train_df = pd.read_csv("nli_train.csv") | |
| val_df = pd.read_csv("nli_val.csv") | |
| test_df = pd.read_csv("nli_test.csv") | |
| MODEL = "microsoft/deberta-v3-base" | |
| tokenizer = AutoTokenizer.from_pretrained(MODEL) | |
| def tokenize(batch): | |
| return tokenizer( | |
| batch["text"], | |
| batch["hypothesis"], | |
| truncation=True, | |
| max_length=256, | |
| padding="max_length", | |
| ) | |
| train_ds = Dataset.from_pandas(train_df).map(tokenize, batched=True) | |
| val_ds = Dataset.from_pandas(val_df).map(tokenize, batched=True) | |
| test_ds = Dataset.from_pandas(test_df).map(tokenize, batched=True) | |
| model = AutoModelForSequenceClassification.from_pretrained(MODEL, num_labels=2) | |
| f1 = evaluate_lib.load("f1") | |
| recall = evaluate_lib.load("recall") | |
| precision = evaluate_lib.load("precision") | |
| def compute_metrics(eval_pred): | |
| logits, labels = eval_pred | |
| preds = np.argmax(logits, axis=-1) | |
| return { | |
| "f1": f1.compute(predictions=preds, references=labels, pos_label=0)["f1"], | |
| "recall": recall.compute(predictions=preds, references=labels, pos_label=0)["recall"], | |
| "precision": precision.compute(predictions=preds, references=labels, pos_label=0)["precision"], | |
| } | |
| args = TrainingArguments( | |
| output_dir=SAVE_DIR, | |
| num_train_epochs=4, | |
| per_device_train_batch_size=32, | |
| per_device_eval_batch_size=64, | |
| learning_rate=1e-5, | |
| warmup_ratio=0.1, | |
| weight_decay=0.01, | |
| eval_strategy="epoch", | |
| save_strategy="epoch", | |
| load_best_model_at_end=True, | |
| metric_for_best_model="recall", | |
| fp16=True, | |
| report_to="none", | |
| ) | |
| trainer = Trainer( | |
| model=model, | |
| args=args, | |
| train_dataset=train_ds, | |
| eval_dataset=val_ds, | |
| compute_metrics=compute_metrics, | |
| ) | |
| trainer.train() | |
| trainer.save_model(SAVE_DIR) | |
| tokenizer.save_pretrained(SAVE_DIR) | |
| results = trainer.evaluate(test_ds) | |
| print(f"Test recall: {results['eval_recall']:.3f} | precision: {results['eval_precision']:.3f}") | |
| print("Target: recall > 0.80, precision > 0.65") | |