File size: 3,052 Bytes
8034635
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
91
# /// script
# dependencies = ["trl>=0.12.0", "peft>=0.7.0", "trackio", "datasets", "transformers", "accelerate", "bitsandbytes"]
# ///

from datasets import load_dataset, concatenate_datasets
from peft import LoraConfig
from trl import SFTTrainer, SFTConfig
import trackio

print("Loading datasets...")

# Dataset 1: Codeforces competitive programming (messages format)
ds1 = load_dataset(
    "open-r1/codeforces-cots", 
    "solutions_w_editorials_py_decontaminated",
    split="train"
)
ds1 = ds1.select_columns(["messages"])
print(f"Codeforces: {len(ds1)} examples")

# Dataset 2: Golang coder (messages format)
ds2 = load_dataset("smcleod/golang-coder", split="train")
ds2 = ds2.select_columns(["messages"])
print(f"Golang: {len(ds2)} examples")

# Dataset 3: Vue/Nuxt/Tailwind (text format - needs conversion)
ds3_raw = load_dataset("kevind13/vuejs-nuxt-tailwind-codellama", split="train")
# Convert text format to messages format for consistency
def text_to_messages(example):
    return {"messages": [{"role": "user", "content": "Continue the code."}, {"role": "assistant", "content": example["text"]}]}
ds3 = ds3_raw.map(text_to_messages, remove_columns=ds3_raw.column_names)
print(f"Vue/Nuxt/Tailwind: {len(ds3)} examples")

# Dataset 4: React code instructions (messages format)
ds4 = load_dataset("cfahlgren1/react-code-instructions", split="train")
ds4 = ds4.select_columns(["messages"])
print(f"React: {len(ds4)} examples")

# Concatenate all datasets
combined = concatenate_datasets([ds1, ds2, ds3, ds4])
combined = combined.shuffle(seed=42)
print(f"Combined dataset: {len(combined)} examples")

# Create train/eval split
dataset_split = combined.train_test_split(test_size=0.05, seed=42)
print(f"Train: {len(dataset_split['train'])}, Eval: {len(dataset_split['test'])}")

print("Starting training...")

trainer = SFTTrainer(
    model="Qwen/Qwen3-0.6B",
    train_dataset=dataset_split["train"],
    eval_dataset=dataset_split["test"],
    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",
    ),
    args=SFTConfig(
        output_dir="qwen3-0.6b-multicode",
        push_to_hub=True,
        hub_model_id="chaddy81/qwen3-0.6b-multicode-sft",
        hub_private_repo=False,
        num_train_epochs=1,
        per_device_train_batch_size=2,
        per_device_eval_batch_size=2,
        gradient_accumulation_steps=8,
        gradient_checkpointing=True,
        learning_rate=2e-4,
        lr_scheduler_type="cosine",
        warmup_ratio=0.05,
        logging_steps=10,
        save_strategy="steps",
        save_steps=500,
        eval_strategy="steps",
        eval_steps=500,
        hub_strategy="every_save",
        bf16=True,
        report_to="trackio",
        project="qwen3-multicode",
        run_name="qwen3-0.6b-sft-multicode",
    )
)

trainer.train()
trainer.push_to_hub()
print("Training complete! Model pushed to Hub.")