File size: 3,469 Bytes
6f52713
 
 
 
 
 
 
 
 
 
 
 
 
 
fe28a26
6f52713
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
92
93
94
95
import os
from unsloth import FastLanguageModel
from datasets import load_dataset
from trl import SFTTrainer
from transformers import TrainingArguments

# 1. AYARLAR
max_seq_length = 2048 # Modelin tek seferde okuyacağı maksimum kelime/token sayısı
dtype = None # Ekran kartına göre otomatik ayarlar (Float16 / Bfloat16)
load_in_4bit = True # VRAM dostu 4-bit sıkıştırma aktif

# 2. MODELİ YÜKLE
# Buraya Hugging Face'e yüklediğin kendi modelinin yolunu yazabilirsin
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "tda45/TdAI-4bit", 
    max_seq_length = max_seq_length,
    dtype = dtype,
    load_in_4bit = True, # Bu değerin True olduğundan kesinlikle emin ol
    fix_tokenizer = True,
)

# 3. LoRA AYARLARI (Eğitimi hızlandıran akıllı katmanlar)
model = FastLanguageModel.get_peft_model(
    model,
    r = 16, # LoRA matris boyutu (Önerilen: 8, 16, 32)
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
    lora_alpha = 16,
    lora_dropout = 0, 
    bias = "none",    
    use_gradient_checkpointing = "unsloth", # Hafıza tasarrufu için önemli
    random_state = 3407,
    use_rslora = False,
    loftq_config = None,
)

# 4. VERİ SETİNİ HAZIRLA
# Alpaca formatında örnek bir prompt şablonu
prompt_sablonu = """Aşağıda bir görevi tanımlayan bir talimat ve daha fazla ortam sağlayan bir girdi bulunmaktadır. İsteyi uygun şekilde tamamlayan bir yanıt yazın.



### Talimat:

{}



### Yanıt:

{}"""

# Eğer Hugging Face'te veya yerelde bir veri setin varsa buraya bağla
# Örnek olarak kendi json dosyanı yüklemek istersen: dataset = load_dataset("json", data_files="verilerim.json", split="train")
dataset = load_dataset("yahma/alpaca-cleaned", split = "train") # Örnek hazır veri seti

def format_prompts(examples):
    instructions = examples["instruction"]
    outputs      = examples["output"]
    texts = []
    for instruction, output in zip(instructions, outputs):
        text = prompt_sablonu.format(instruction, output) + tokenizer.eos_token
        texts.append(text)
    return { "text" : texts, }

dataset = dataset.map(format_prompts, batched = True,)

# 5. EĞİTİM PARAMETRELERİ
trainer = SFTTrainer(
    model = model,
    tokenizer = tokenizer,
    train_dataset = dataset,
    dataset_text_field = "text",
    max_seq_length = max_seq_length,
    dataset_num_proc = 2,
    packing = False, # Küçük veri setleri için False kalması daha iyi
    args = TrainingArguments(
        per_device_train_batch_size = 2,
        gradient_accumulation_steps = 4,
        warmup_steps = 5,
        max_steps = 60, # Deneme için adım sayısını küçük tuttuk, duruma göre artırabilirsin
        learning_rate = 2e-4,
        fp16 = not FastLanguageModel.is_bfloat16_supported(),
        bf16 = FastLanguageModel.is_bfloat16_supported(),
        logging_steps = 1,
        optim = "adamw_8bit",
        weight_decay = 0.01,
        lr_scheduler_type = "linear",
        seed = 3407,
        output_dir = "outputs",
    ),
)

# 6. EĞİTİMİ BAŞLAT
print("Eğitim süreci başlıyor...")
trainer_stats = trainer.train()
print("Eğitim tamamlandı!")

# 7. EĞİTİLMİŞ MODELİ KAYDET
model.save_pretrained("lora_model")
tokenizer.save_pretrained("lora_model")
print("Eğitilen LoRA katmanları 'lora_model' klasörüne kaydedildi.")