File size: 1,653 Bytes
5585f60 | 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 | # /// 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}")
|