Ult1.0 / train.py
teolm30's picture
Upload train.py with huggingface_hub
81337ed verified
Raw
History Blame Contribute Delete
2.82 kB
"""
Ult1.0 Fine-Tuning Script
==========================
Fine-tune Ult1.0 on your own data using LoRA.
Requires a GPU with ~8 GB VRAM.
Usage:
python train.py # train on Alpaca
python train.py --dataset your/dataset # custom dataset
python train.py --lr 1e-4 --epochs 5 # custom params
"""
import torch, argparse, os
from transformers import (
AutoModelForCausalLM, AutoTokenizer,
TrainingArguments, Trainer, DataCollatorForSeq2Seq
)
from peft import LoraConfig, get_peft_model, TaskType
from datasets import load_dataset
parser = argparse.ArgumentParser()
parser.add_argument("--model", default="teolm30/Ult1.0")
parser.add_argument("--dataset", default="yahma/alpaca-cleaned")
parser.add_argument("--lr", type=float, default=2e-4)
parser.add_argument("--epochs", type=int, default=3)
parser.add_argument("--batch_size", type=int, default=4)
parser.add_argument("--max_length", type=int, default=512)
parser.add_argument("--output", default="./ult10_finetuned")
args = parser.parse_args()
os.makedirs(args.output, exist_ok=True)
print(f"Loading model: {args.model}")
model = AutoModelForCausalLM.from_pretrained(
args.model, torch_dtype=torch.bfloat16, device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(args.model)
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
lora_config = LoraConfig(
r=8, lora_alpha=16,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
task_type=TaskType.CAUSAL_LM,
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
print(f"Loading dataset: {args.dataset}")
dataset = load_dataset(args.dataset, split="train")
def format_example(ex):
inp = f"\nInput: {ex['input']}" if ex.get("input") else ""
return {"text": f"Instruction: {ex['instruction']}{inp}\nResponse: {ex['output']}"}
dataset = dataset.map(format_example)
def tokenize(examples):
return tokenizer(
examples["text"], truncation=True,
max_length=args.max_length, padding="max_length"
)
remove_cols = [c for c in dataset.column_names if c != "text"]
dataset = dataset.map(tokenize, remove_columns=remove_cols, batched=True)
training_args = TrainingArguments(
output_dir=args.output,
per_device_train_batch_size=args.batch_size,
gradient_accumulation_steps=4,
num_train_epochs=args.epochs,
learning_rate=args.lr,
logging_steps=10,
save_strategy="epoch",
bf16=True,
report_to="none",
dataloader_num_workers=4,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset,
data_collator=DataCollatorForSeq2Seq(tokenizer, pad_to_multiple_of=8),
)
trainer.train()
model.save_pretrained(args.output)
tokenizer.save_pretrained(args.output)
print(f"Model saved to {args.output}")