hoduyquocbao commited on
Commit
0d17543
1 Parent(s): 07f44f8

new features

Browse files
Files changed (3) hide show
  1. checkpoint.py +174 -0
  2. conversattion.py +0 -0
  3. multi_model.py +123 -0
checkpoint.py ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import torch
3
+ from datasets import load_dataset
4
+ from transformers import (
5
+ AutoTokenizer,
6
+ AutoModelForCausalLM,
7
+ TrainingArguments,
8
+ Trainer,
9
+ DataCollatorForLanguageModeling
10
+ )
11
+ from peft import LoraConfig, get_peft_model
12
+ import spaces
13
+ import time
14
+
15
+ # Đường dẫn lưu checkpoint
16
+ CHECKPOINT_DIR = "./checkpoints"
17
+ if not os.path.exists(CHECKPOINT_DIR):
18
+ os.makedirs(CHECKPOINT_DIR)
19
+
20
+ # Tải Dataset
21
+ dataset = load_dataset('vntc/wiki-mini-corpus')
22
+
23
+ # Chia Dataset thành train và validation
24
+ split_dataset = dataset['train'].train_test_split(test_size=0.1, seed=42)
25
+ train_dataset = split_dataset['train']
26
+ validation_dataset = split_dataset['test']
27
+
28
+ # Tiền Xử Lý Văn Bản
29
+ @spaces.GPU(duration=180, queue=False)
30
+ def preprocess_function(examples):
31
+ passages = [passage.lower().strip() for passage in examples['passage']]
32
+ return {'passage': passages}
33
+
34
+ processed_train = train_dataset.map(preprocess_function, batched=True, remove_columns=['id', 'metadata'])
35
+ processed_validation = validation_dataset.map(preprocess_function, batched=True, remove_columns=['id', 'metadata'])
36
+
37
+ # Tokenization
38
+ model_name = "meta-llama/Llama-3.2-3B-Instruct"
39
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
40
+
41
+ # Đảm bảo tokenizer có pad_token
42
+ if tokenizer.pad_token is None:
43
+ tokenizer.pad_token = tokenizer.eos_token
44
+
45
+ @spaces.GPU(duration=180, queue=False)
46
+ def tokenize_function(examples):
47
+ return tokenizer(
48
+ examples['passage'],
49
+ padding='max_length',
50
+ truncation=True,
51
+ max_length=512,
52
+ )
53
+
54
+ tokenized_train = processed_train.map(tokenize_function, batched=True)
55
+ tokenized_validation = processed_validation.map(tokenize_function, batched=True)
56
+
57
+ # Thêm trường 'labels'
58
+ @spaces.GPU(duration=180, queue=False)
59
+ def add_labels(examples):
60
+ examples['labels'] = examples['input_ids'].copy()
61
+ return examples
62
+
63
+ tokenized_train = tokenized_train.map(add_labels, batched=True)
64
+ tokenized_validation = tokenized_validation.map(add_labels, batched=True)
65
+
66
+ # Loại bỏ các cột không cần thiết
67
+ tokenized_train = tokenized_train.remove_columns(['passage'])
68
+ tokenized_validation = tokenized_validation.remove_columns(['passage'])
69
+
70
+ # Định dạng dữ liệu cho PyTorch
71
+ tokenized_train.set_format('torch')
72
+ tokenized_validation.set_format('torch')
73
+
74
+ # Tạo DatasetDict
75
+ final_dataset = {
76
+ 'train': tokenized_train,
77
+ 'validation': tokenized_validation
78
+ }
79
+
80
+ # Tải và Cấu Hình Mô Hình với LoRA
81
+ model = AutoModelForCausalLM.from_pretrained(
82
+ model_name,
83
+ device_map="auto",
84
+ torch_dtype=torch.float16,
85
+ load_in_8bit=False
86
+ )
87
+
88
+ lora_config = LoraConfig(
89
+ r=8,
90
+ lora_alpha=32,
91
+ target_modules=["q_proj", "k_proj", "v_proj", "out_proj"],
92
+ lora_dropout=0.1,
93
+ bias="none",
94
+ )
95
+
96
+ model = get_peft_model(model, lora_config)
97
+ print(model)
98
+
99
+ # Cấu Hình TrainingArguments
100
+ training_args = TrainingArguments(
101
+ output_dir=CHECKPOINT_DIR,
102
+ per_device_train_batch_size=4,
103
+ per_device_eval_batch_size=4,
104
+ gradient_accumulation_steps=8,
105
+ num_train_epochs=3,
106
+ learning_rate=3e-4,
107
+ weight_decay=0.01,
108
+ logging_steps=50, # Giảm số bước logging
109
+ evaluation_strategy="steps", # Đánh giá sau mỗi vài bước
110
+ eval_steps=100, # Đánh giá sau mỗi 100 bước
111
+ save_strategy="steps", # Lưu checkpoint sau mỗi vài bước
112
+ save_steps=100, # Lưu checkpoint sau mỗi 100 bước
113
+ save_total_limit=5, # Giới hạn số lượng checkpoint lưu trữ
114
+ fp16=True,
115
+ report_to="none",
116
+ load_best_model_at_end=True,
117
+ )
118
+
119
+ # Data Collator
120
+ data_collator = DataCollatorForLanguageModeling(
121
+ tokenizer=tokenizer,
122
+ mlm=False, # Vì bạn đang thực hiện Causal LM
123
+ pad_to_multiple_of=8
124
+ )
125
+
126
+ # Tạo Trainer
127
+ trainer = Trainer(
128
+ model=model,
129
+ args=training_args,
130
+ train_dataset=final_dataset['train'],
131
+ eval_dataset=final_dataset['validation'],
132
+ tokenizer=tokenizer,
133
+ data_collator=data_collator,
134
+ )
135
+
136
+ # Định Nghĩa Hàm Huấn Luyện với Decorator @spaces.GPU
137
+ @spaces.GPU(duration=180, queue=False)
138
+ def run_training():
139
+ # Kiểm tra nếu có checkpoint
140
+ checkpoints = [os.path.join(CHECKPOINT_DIR, d) for d in os.listdir(CHECKPOINT_DIR) if d.startswith('checkpoint')]
141
+ if checkpoints:
142
+ latest_checkpoint = max(checkpoints, key=os.path.getctime)
143
+ print(f"Đang tiếp tục huấn luyện từ checkpoint: {latest_checkpoint}")
144
+ trainer.train(resume_from_checkpoint=latest_checkpoint)
145
+ else:
146
+ trainer.train()
147
+
148
+ # Lưu checkpoint sau khi huấn luyện
149
+ trainer.save_model(CHECKPOINT_DIR)
150
+ return "Huấn luyện hoàn tất hoặc đã tiếp tục từ checkpoint."
151
+
152
+ # Hàm Tự Động Hóa Việc Gọi Lặp Lại `run_training`
153
+ @spaces.GPU(duration=180, queue=False)
154
+ def continuous_training(max_epochs=3):
155
+ current_epoch = 0
156
+ while current_epoch < max_epochs:
157
+ result = run_training()
158
+ print(result)
159
+
160
+ # Giả định mỗi lần gọi huấn luyện tiến thêm 0.25 epoch (tùy thuộc vào tốc độ huấn luyện)
161
+ current_epoch += 0.25
162
+ print(f"Đã huấn luyện {current_epoch} / {max_epochs} epochs.")
163
+
164
+ # Kiểm tra nếu đã đạt số epoch mong muốn
165
+ if current_epoch >= max_epochs:
166
+ print("Đã hoàn thành quá trình huấn luyện.")
167
+ break
168
+
169
+ # Chờ một khoảng thời gian trước khi gọi lại (tùy thuộc vào yêu cầu của hệ thống)
170
+ time.sleep(1) # Thời gian chờ có thể điều chỉnh
171
+
172
+ # Chạy quá trình huấn luyện liên tục
173
+ if __name__ == "__main__":
174
+ continuous_training(max_epochs=3)
conversattion.py ADDED
File without changes
multi_model.py ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from datasets import load_dataset
3
+ from transformers import (
4
+ AutoTokenizer,
5
+ AutoModelForCausalLM,
6
+ TrainingArguments,
7
+ Trainer,
8
+ DataCollatorForLanguageModeling
9
+ )
10
+ from peft import LoraConfig, get_peft_model
11
+
12
+ # 1. Tải Dataset
13
+ dataset = load_dataset('vntc/wiki-mini-corpus')
14
+
15
+ # 2. Chia Dataset thành train và validation
16
+ split_dataset = dataset['train'].train_test_split(test_size=0.1, seed=42)
17
+ train_dataset = split_dataset['train']
18
+ validation_dataset = split_dataset['test']
19
+
20
+ # 3. Tiền Xử Lý Văn Bản
21
+ def preprocess_function(examples):
22
+ passages = [passage.lower().strip() for passage in examples['passage']]
23
+ return {'passage': passages}
24
+
25
+ processed_train = train_dataset.map(preprocess_function, batched=True, remove_columns=['id', 'metadata'])
26
+ processed_validation = validation_dataset.map(preprocess_function, batched=True, remove_columns=['id', 'metadata'])
27
+
28
+ # 4. Tokenization
29
+ model_name = "meta-llama/Llama-3.2-3B-Instruct"
30
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
31
+
32
+ # Đảm bảo tokenizer có pad_token
33
+ if tokenizer.pad_token is None:
34
+ tokenizer.pad_token = tokenizer.eos_token
35
+
36
+ def tokenize_function(examples):
37
+ return tokenizer(
38
+ examples['passage'],
39
+ padding='max_length',
40
+ truncation=True,
41
+ max_length=512,
42
+ )
43
+
44
+ tokenized_train = processed_train.map(tokenize_function, batched=True)
45
+ tokenized_validation = processed_validation.map(tokenize_function, batched=True)
46
+
47
+ # 5. Thêm trường 'labels'
48
+ def add_labels(examples):
49
+ examples['labels'] = examples['input_ids'].copy()
50
+ return examples
51
+
52
+ tokenized_train = tokenized_train.map(add_labels, batched=True)
53
+ tokenized_validation = tokenized_validation.map(add_labels, batched=True)
54
+
55
+ # 6. Loại bỏ các cột không cần thiết
56
+ tokenized_train = tokenized_train.remove_columns(['passage'])
57
+ tokenized_validation = tokenized_validation.remove_columns(['passage'])
58
+
59
+ # 7. Định dạng dữ liệu cho PyTorch
60
+ tokenized_train.set_format('torch')
61
+ tokenized_validation.set_format('torch')
62
+
63
+ # 8. Tạo DatasetDict
64
+ final_dataset = {
65
+ 'train': tokenized_train,
66
+ 'validation': tokenized_validation
67
+ }
68
+
69
+ # 9. Tải và Cấu Hình Mô Hình với LoRA
70
+ model = AutoModelForCausalLM.from_pretrained(
71
+ model_name,
72
+ device_map="auto",
73
+ torch_dtype=torch.float16,
74
+ load_in_8bit=False
75
+ )
76
+
77
+ lora_config = LoraConfig(
78
+ r=8,
79
+ lora_alpha=32,
80
+ target_modules=["q_proj", "k_proj", "v_proj", "out_proj"],
81
+ lora_dropout=0.1,
82
+ bias="none",
83
+ )
84
+
85
+ model = get_peft_model(model, lora_config)
86
+ print(model)
87
+
88
+ # 10. Cấu Hình TrainingArguments
89
+ training_args = TrainingArguments(
90
+ output_dir="./lora_finetuned_llama3.2",
91
+ per_device_train_batch_size=4,
92
+ per_device_eval_batch_size=4,
93
+ gradient_accumulation_steps=8,
94
+ num_train_epochs=3,
95
+ learning_rate=3e-4,
96
+ weight_decay=0.01,
97
+ logging_steps=100,
98
+ evaluation_strategy="epoch",
99
+ save_strategy="epoch",
100
+ save_total_limit=2,
101
+ fp16=True,
102
+ report_to="none",
103
+ )
104
+
105
+ # 11. Data Collator Sử Dụng DataCollatorForLanguageModeling
106
+ data_collator = DataCollatorForLanguageModeling(
107
+ tokenizer=tokenizer,
108
+ mlm=False, # Vì bạn đang thực hiện Causal LM
109
+ pad_to_multiple_of=8
110
+ )
111
+
112
+ # 12. Tạo Trainer
113
+ trainer = Trainer(
114
+ model=model,
115
+ args=training_args,
116
+ train_dataset=final_dataset['train'],
117
+ eval_dataset=final_dataset['validation'],
118
+ tokenizer=tokenizer,
119
+ data_collator=data_collator,
120
+ )
121
+
122
+ # 13. Bắt Đầu Huấn Luyện
123
+ trainer.train()