Nonabzbssbbsbs commited on
Commit
1af83cc
·
verified ·
1 Parent(s): ec26860

Create finetune.py

Browse files
Files changed (1) hide show
  1. finetune.py +95 -0
finetune.py ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from transformers import AutoModelForCausalLM, AutoTokenizer
3
+ from datasets import load_dataset
4
+ from peft import LoraConfig, get_peft_model
5
+ from trl import SFTTrainer
6
+ import os
7
+ import transformers
8
+
9
+ # --- 1. Параметрлерді орнату (CPU-ға Арналған) ---
10
+ MODEL_ID = "Qwen/Qwen1.5-0.5B-Chat"
11
+ DATASET_FILE = "kz_book_data.jsonl" # Жаңа кітап дерегі
12
+ OUTPUT_DIR = "./qwen_kz_books_tuned"
13
+ NEW_TOKENIZER = AutoTokenizer.from_pretrained(MODEL_ID, trust_remote_code=True)
14
+
15
+ # --- 2. Деректерді Дайындау Функциясы ---
16
+ def formatting_prompts_func(examples):
17
+ """Модельге арналған JSONL деректерін форматтау"""
18
+ outputs = []
19
+ for prompt, comp_kz, comp_mn in zip(examples['prompt'], examples['completion_kz'], examples['completion_mn']):
20
+
21
+ # Екі тілді жауапты біріктіру (Монғолша бос болуы мүмкін)
22
+ full_completion = f"Қазақша: {comp_kz}\n\nМонғолша: {comp_mn}"
23
+
24
+ # Qwen-ге арналған чат үлгісін қолдану
25
+ messages = [
26
+ {"role": "user", "content": f"Сұрақ: {prompt}. Жауапты Қазақша етіп форматтаңыз:"},
27
+ {"role": "assistant", "content": full_completion}
28
+ ]
29
+
30
+ # SFTTrainer үшін жаңа токенизатор арқылы форматтау
31
+ input_text = NEW_TOKENIZER.apply_chat_template(
32
+ messages,
33
+ tokenize=False
34
+ )
35
+ outputs.append(input_text)
36
+ return {"text": outputs}
37
+
38
+ # --- 3. LoRA Конфигурациясы ---
39
+ lora_config = LoraConfig(
40
+ r=8,
41
+ target_modules=["c_attn", "attn_q", "attn_k", "attn_v", "c_proj", "w1", "w2"],
42
+ lora_alpha=8,
43
+ lora_dropout=0.05,
44
+ bias="none",
45
+ task_type="CAUSAL_LM",
46
+ )
47
+
48
+ # --- 4. Модельді Жүктеу ---
49
+ model = AutoModelForCausalLM.from_pretrained(
50
+ MODEL_ID,
51
+ torch_dtype=torch.float32,
52
+ device_map="cpu",
53
+ trust_remote_code=True
54
+ )
55
+
56
+ # --- 5. Деректерді Жүктеу ---
57
+ try:
58
+ dataset = load_dataset("json", data_files=DATASET_FILE, split="train")
59
+ except Exception as e:
60
+ print(f"Деректер жиынтығын жүктеу қатесі: {e}. {DATASET_FILE} дұрыс JSONL форматында екеніне көз жеткізіңіз.")
61
+ exit()
62
+
63
+ # --- 6. SFTTrainer-ді Қолдану ---
64
+ trainer = SFTTrainer(
65
+ model=model,
66
+ train_dataset=dataset,
67
+ peft_config=lora_config,
68
+ tokenizer=NEW_TOKENIZER,
69
+ packing=True,
70
+ formatting_func=formatting_prompts_func,
71
+ max_seq_length=512,
72
+ args=transformers.TrainingArguments(
73
+ output_dir=OUTPUT_DIR,
74
+ per_device_train_batch_size=1,
75
+ gradient_accumulation_steps=4,
76
+ warmup_steps=5,
77
+ max_steps=100, # Оқыту қадамдарын көбейттік
78
+ learning_rate=2e-4,
79
+ logging_steps=1,
80
+ fp16=False,
81
+ bf16=False,
82
+ optim="adamw_torch",
83
+ report_to="none",
84
+ ),
85
+ )
86
+
87
+ # --- 7. Оқытуды Бастау ---
88
+ print("\n🔥 МОДЕЛЬДІ ОҚЫТУДЫ БАСТАЙМЫЗ (CPU-да жұмыс істейді)...")
89
+ trainer.train()
90
+
91
+ # --- 8. Нәтижені Сақтау ---
92
+ print("\n✅ Оқыту аяқталды. Нәтижелер сақталуда...")
93
+ trainer.model.save_pretrained(OUTPUT_DIR)
94
+ NEW_TOKENIZER.save_pretrained(OUTPUT_DIR)
95
+ print(f"Дайын модель {OUTPUT_DIR} папкасына сақталды.")