#!/usr/bin/env python3 import torch from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer from datasets import load_dataset from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training def fine_tune_model(): # Load base model model_name = "Qwen/Qwen2.5-1.5B-Instruct" print("Loading base model...") tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained( model_name, load_in_4bit=True, device_map="auto", trust_remote_code=True ) # Prepare for LoRA model = prepare_model_for_kbit_training(model) # LoRA configuration lora_config = LoraConfig( r=16, lora_alpha=32, target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM" ) model = get_peft_model(model, lora_config) model.print_trainable_parameters() # Load dataset print("Loading dataset...") dataset = load_dataset("chizk/wikipedia-pretrain-zh-tw", split="train[:1000]") # Tokenize def tokenize_function(examples): return tokenizer( examples["text"], truncation=True, max_length=512, padding="max_length" ) tokenized_dataset = dataset.map(tokenize_function, batched=True) # Training arguments training_args = TrainingArguments( output_dir="./results", num_train_epochs=1, per_device_train_batch_size=2, gradient_accumulation_steps=4, learning_rate=2e-4, fp16=True, logging_steps=10, save_steps=100, save_total_limit=1, report_to="none", ) trainer = Trainer( model=model, args=training_args, train_dataset=tokenized_dataset, ) # Train print("Starting training...") trainer.train() # Save print("Saving model...") model.save_pretrained("./fine_tuned_model") tokenizer.save_pretrained("./fine_tuned_model") print("Training complete!") if __name__ == "__main__": fine_tune_model()