training-scripts / train_intent_router.py
ArchibaldAI's picture
Upload train_intent_router.py with huggingface_hub
5585f60 verified
# /// script
# dependencies = ["trl>=0.12.0", "peft>=0.7.0", "datasets", "trackio", "accelerate", "bitsandbytes"]
# ///
from datasets import load_dataset
from peft import LoraConfig
from trl import SFTTrainer, SFTConfig
import json
# Load dataset
dataset = load_dataset("ArchibaldAI/agent-intent-router")
print(f"Train: {len(dataset['train'])} examples")
print(f"Test: {len(dataset['test'])} examples")
print(f"Sample: {dataset['train'][0]}")
# Model: SmolLM2-360M - tiny, fast, perfect for classification
model_name = "HuggingFaceTB/SmolLM2-360M-Instruct"
output_name = "ArchibaldAI/agent-intent-router-v1"
# LoRA config - lightweight fine-tuning
peft_config = LoraConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
bias="none",
task_type="CAUSAL_LM",
)
# Training config
training_args = SFTConfig(
output_dir="./intent-router",
push_to_hub=True,
hub_model_id=output_name,
num_train_epochs=5,
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
learning_rate=2e-4,
warmup_ratio=0.1,
logging_steps=10,
eval_strategy="epoch",
save_strategy="epoch",
load_best_model_at_end=True,
metric_for_best_model="eval_loss",
report_to="trackio",
run_name="intent-router-v1",
max_length=256, # Short sequences for classification
bf16=True,
)
# Train
trainer = SFTTrainer(
model=model_name,
train_dataset=dataset["train"],
eval_dataset=dataset["test"],
peft_config=peft_config,
args=training_args,
)
trainer.train()
trainer.push_to_hub()
print(f"\n✅ Model pushed to {output_name}")