File size: 2,453 Bytes
27d693a
239cbc2
27d693a
 
 
 
 
 
 
 
 
239cbc2
 
 
 
 
 
 
27d693a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
239cbc2
 
27d693a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ddc6839
27d693a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
239cbc2
27d693a
ddc6839
27d693a
 
 
 
 
 
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# /// script
# dependencies = ["trl>=0.12.0", "peft>=0.13.0", "datasets", "transformers>=4.45.0", "accelerate", "bitsandbytes", "huggingface_hub"]
# ///

import os
from datasets import load_dataset
from peft import LoraConfig
from trl import SFTTrainer, SFTConfig
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
import torch

# Authenticate
from huggingface_hub import login
hf_token = os.environ.get("HF_TOKEN")
if hf_token:
    login(token=hf_token)
    print("Authenticated with HuggingFace")

print("Loading dataset...")
dataset = load_dataset("KevinKeller/cognitive-pattern-selector-v1")
train_dataset = dataset["train"]
eval_dataset = dataset.get("validation")

print(f"Train samples: {len(train_dataset)}")
if eval_dataset:
    print(f"Eval samples: {len(eval_dataset)}")

print("Loading model: Qwen/Qwen2.5-7B-Instruct...")
model_id = "Qwen/Qwen2.5-7B-Instruct"

# 4-bit quantization for fitting on A10G
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
)

tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
if tokenizer.pad_token is None:
    tokenizer.pad_token = tokenizer.eos_token

model = AutoModelForCausalLM.from_pretrained(
    model_id,
    quantization_config=bnb_config,
    device_map="auto",
    trust_remote_code=True,
)

# LoRA config
peft_config = LoraConfig(
    r=16,
    lora_alpha=32,
    lora_dropout=0.05,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
    bias="none",
    task_type="CAUSAL_LM",
)

# Training config - removed max_seq_length from SFTConfig
training_args = SFTConfig(
    output_dir="./pattern-selector-output",
    num_train_epochs=3,
    per_device_train_batch_size=2,
    gradient_accumulation_steps=4,
    learning_rate=2e-4,
    logging_steps=10,
    save_strategy="epoch",
    eval_strategy="epoch" if eval_dataset else "no",
    bf16=True,
    push_to_hub=True,
    hub_model_id="KevinKeller/cognitive-pattern-selector-qwen2.5-7b",
    report_to="none",
)

print("Starting training...")
trainer = SFTTrainer(
    model=model,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
    peft_config=peft_config,
    tokenizer=tokenizer,
    args=training_args,
    max_seq_length=4096,  # Moved here
)

trainer.train()
print("Training complete! Pushing to Hub...")
trainer.push_to_hub()
print("Done!")