RianLi commited on
Commit
4334bc5
·
verified ·
1 Parent(s): 2b9d7ab

Upload 4 files

Browse files
Files changed (1) hide show
  1. fine_tune_improved.py +85 -0
fine_tune_improved.py ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from datasets import load_dataset
3
+ from peft import LoraConfig, get_peft_model
4
+ from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
5
+ from trl import SFTTrainer
6
+
7
+ # 1. 加载模型和分词器
8
+ # 使用Qwen2.5-0.5B模型,小尺寸适合CPU训练
9
+ model_name = "Qwen/Qwen2.5-0.5B" # 使用小尺寸的Qwen模型
10
+
11
+ model = AutoModelForCausalLM.from_pretrained(
12
+ model_name,
13
+ torch_dtype=torch.float32,
14
+ low_cpu_mem_usage=True,
15
+ trust_remote_code=True,
16
+ )
17
+ model.config.use_cache = False
18
+
19
+ tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
20
+ # 为Qwen添加pad token
21
+ if tokenizer.pad_token is None:
22
+ tokenizer.pad_token = tokenizer.eos_token
23
+
24
+ # 2. 加载并准备数据集
25
+ dataset = load_dataset("json", data_files="data.json", split="train")
26
+
27
+ # 将数据集转换为文本格式,添加结束标记
28
+ def convert_to_text(examples):
29
+ texts = []
30
+ for i in range(len(examples['instruction'])):
31
+ text = f"### Instruction:\n{examples['instruction'][i]}\n\n### Input:\n{examples['input'][i]}\n\n### Response:\n{examples['output'][i]}{tokenizer.eos_token}"
32
+ texts.append(text)
33
+ return {"text": texts}
34
+
35
+ dataset = dataset.map(convert_to_text, batched=True, remove_columns=dataset.column_names)
36
+
37
+ # 3. 配置LoRA参数
38
+ lora_config = LoraConfig(
39
+ r=16, # 增加rank
40
+ lora_alpha=32,
41
+ lora_dropout=0.1,
42
+ bias="none",
43
+ task_type="CAUSAL_LM",
44
+ target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], # Qwen的注意力和MLP模块
45
+ )
46
+
47
+ # 4. 创建PEFT模型
48
+ model = get_peft_model(model, lora_config)
49
+
50
+ # 5. 配置训练参数
51
+ output_dir = "./qwen2.5-0.5b-lora"
52
+ training_args = TrainingArguments(
53
+ output_dir=output_dir,
54
+ per_device_train_batch_size=2, # 稍微增加批次大小
55
+ gradient_accumulation_steps=4, # 减少梯度累积
56
+ learning_rate=2e-4, # 调整学习率
57
+ logging_steps=10,
58
+ max_steps=200, # 增加训练步数
59
+ save_strategy="steps",
60
+ save_steps=50,
61
+ dataloader_num_workers=0,
62
+ fp16=False,
63
+ report_to=[],
64
+ remove_unused_columns=False,
65
+ warmup_steps=20, # 添加预热步数
66
+ weight_decay=0.01, # 添加权重衰减
67
+ )
68
+
69
+ # 6. 创建SFTTrainer
70
+ trainer = SFTTrainer(
71
+ model=model,
72
+ train_dataset=dataset,
73
+ args=training_args,
74
+ peft_config=lora_config,
75
+ max_seq_length=256, # 限制序列长度
76
+ )
77
+
78
+ # 7. 开始训练
79
+ print("开始训练Qwen2.5-0.5B模型...")
80
+ trainer.train()
81
+
82
+ # 8. 保存模型
83
+ print("保存Qwen2.5-0.5B LoRA适配器...")
84
+ trainer.save_model(output_dir)
85
+ print(f"Qwen2.5-0.5B LoRA适配器已保存到 {output_dir}")