Spaces:
Sleeping
Sleeping
hoduyquocbao
commited on
Commit
•
9c3f080
1
Parent(s):
ece098b
fix error features
Browse files- __pycache__/checkpoint.cpython-310.pyc +0 -0
- app.py +1 -1
- checkpoint.py +103 -84
- requirements.txt +2 -1
__pycache__/checkpoint.cpython-310.pyc
ADDED
Binary file (4.03 kB). View file
|
|
app.py
CHANGED
@@ -289,7 +289,6 @@ def generate(
|
|
289 |
# Thông báo về việc phân tích đầu vào
|
290 |
yield "🔍 Đang phân tích truy vấn của bạn..."
|
291 |
|
292 |
-
continuous_training(max_epochs=3)
|
293 |
|
294 |
# Xác định hàm nào sẽ được gọi dựa trên tin nhắn của người dùng
|
295 |
function_call = process_query(message)
|
@@ -300,6 +299,7 @@ def generate(
|
|
300 |
elif function_call["name"] == "summarize_query":
|
301 |
yield "🛠️ Đã chọn chức năng: Tóm tắt văn bản."
|
302 |
elif function_call["name"] == "sentiment_analysis":
|
|
|
303 |
yield "🛠️ Đã chọn chức năng: Phân tích tâm lý."
|
304 |
elif function_call["name"] in ["general_query", "hard_query"]:
|
305 |
yield "🛠️ Đã chọn chức năng: Trả lời câu hỏi."
|
|
|
289 |
# Thông báo về việc phân tích đầu vào
|
290 |
yield "🔍 Đang phân tích truy vấn của bạn..."
|
291 |
|
|
|
292 |
|
293 |
# Xác định hàm nào sẽ được gọi dựa trên tin nhắn của người dùng
|
294 |
function_call = process_query(message)
|
|
|
299 |
elif function_call["name"] == "summarize_query":
|
300 |
yield "🛠️ Đã chọn chức năng: Tóm tắt văn bản."
|
301 |
elif function_call["name"] == "sentiment_analysis":
|
302 |
+
continuous_training(total_steps=300, steps_per_call=50)
|
303 |
yield "🛠️ Đã chọn chức năng: Phân tích tâm lý."
|
304 |
elif function_call["name"] in ["general_query", "hard_query"]:
|
305 |
yield "🛠️ Đã chọn chức năng: Trả lời câu hỏi."
|
checkpoint.py
CHANGED
@@ -6,7 +6,10 @@ from transformers import (
|
|
6 |
AutoModelForCausalLM,
|
7 |
TrainingArguments,
|
8 |
Trainer,
|
9 |
-
DataCollatorForLanguageModeling
|
|
|
|
|
|
|
10 |
)
|
11 |
from peft import LoraConfig, get_peft_model
|
12 |
import spaces
|
@@ -17,16 +20,15 @@ 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=20, queue=False)
|
30 |
def preprocess_function(examples):
|
31 |
passages = [passage.lower().strip() for passage in examples['passage']]
|
32 |
return {'passage': passages}
|
@@ -34,7 +36,7 @@ def preprocess_function(examples):
|
|
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 |
|
@@ -42,7 +44,6 @@ tokenizer = AutoTokenizer.from_pretrained(model_name)
|
|
42 |
if tokenizer.pad_token is None:
|
43 |
tokenizer.pad_token = tokenizer.eos_token
|
44 |
|
45 |
-
@spaces.GPU(duration=20, queue=False)
|
46 |
def tokenize_function(examples):
|
47 |
return tokenizer(
|
48 |
examples['passage'],
|
@@ -54,8 +55,7 @@ def tokenize_function(examples):
|
|
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=20, queue=False)
|
59 |
def add_labels(examples):
|
60 |
examples['labels'] = examples['input_ids'].copy()
|
61 |
return examples
|
@@ -63,79 +63,93 @@ def add_labels(examples):
|
|
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 |
-
#
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
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=50, # Đá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=50, # 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=
|
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:
|
@@ -149,26 +163,31 @@ def run_training():
|
|
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
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
157 |
result = run_training()
|
158 |
print(result)
|
|
|
|
|
159 |
|
160 |
-
#
|
161 |
-
|
162 |
-
|
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(
|
171 |
|
172 |
-
#
|
173 |
-
|
174 |
-
|
|
|
6 |
AutoModelForCausalLM,
|
7 |
TrainingArguments,
|
8 |
Trainer,
|
9 |
+
DataCollatorForLanguageModeling,
|
10 |
+
TrainerCallback,
|
11 |
+
TrainerState,
|
12 |
+
TrainerControl
|
13 |
)
|
14 |
from peft import LoraConfig, get_peft_model
|
15 |
import spaces
|
|
|
20 |
if not os.path.exists(CHECKPOINT_DIR):
|
21 |
os.makedirs(CHECKPOINT_DIR)
|
22 |
|
23 |
+
# Tải Dataset (CPU)
|
24 |
dataset = load_dataset('vntc/wiki-mini-corpus')
|
25 |
|
26 |
+
# Chia Dataset thành train và validation (CPU)
|
27 |
split_dataset = dataset['train'].train_test_split(test_size=0.1, seed=42)
|
28 |
train_dataset = split_dataset['train']
|
29 |
validation_dataset = split_dataset['test']
|
30 |
|
31 |
+
# Tiền Xử Lý Văn Bản (CPU)
|
|
|
32 |
def preprocess_function(examples):
|
33 |
passages = [passage.lower().strip() for passage in examples['passage']]
|
34 |
return {'passage': passages}
|
|
|
36 |
processed_train = train_dataset.map(preprocess_function, batched=True, remove_columns=['id', 'metadata'])
|
37 |
processed_validation = validation_dataset.map(preprocess_function, batched=True, remove_columns=['id', 'metadata'])
|
38 |
|
39 |
+
# Tokenization (CPU)
|
40 |
model_name = "meta-llama/Llama-3.2-3B-Instruct"
|
41 |
tokenizer = AutoTokenizer.from_pretrained(model_name)
|
42 |
|
|
|
44 |
if tokenizer.pad_token is None:
|
45 |
tokenizer.pad_token = tokenizer.eos_token
|
46 |
|
|
|
47 |
def tokenize_function(examples):
|
48 |
return tokenizer(
|
49 |
examples['passage'],
|
|
|
55 |
tokenized_train = processed_train.map(tokenize_function, batched=True)
|
56 |
tokenized_validation = processed_validation.map(tokenize_function, batched=True)
|
57 |
|
58 |
+
# Thêm trường 'labels' (CPU)
|
|
|
59 |
def add_labels(examples):
|
60 |
examples['labels'] = examples['input_ids'].copy()
|
61 |
return examples
|
|
|
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 (CPU)
|
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 (CPU)
|
71 |
tokenized_train.set_format('torch')
|
72 |
tokenized_validation.set_format('torch')
|
73 |
|
74 |
+
# Tạo DatasetDict (CPU)
|
75 |
final_dataset = {
|
76 |
'train': tokenized_train,
|
77 |
'validation': tokenized_validation
|
78 |
}
|
79 |
|
80 |
+
# Định Nghĩa TrainerCallback để Lưu Checkpoint Nhanh Hơn
|
81 |
+
class SaveCheckpointCallback(TrainerCallback):
|
82 |
+
def on_step_end(self, args, state, control, **kwargs):
|
83 |
+
if state.global_step % args.save_steps == 0 and state.global_step != 0:
|
84 |
+
checkpoint_path = os.path.join(args.output_dir, f"checkpoint-{state.global_step}")
|
85 |
+
print(f"Lưu checkpoint tại: {checkpoint_path}")
|
86 |
+
trainer.save_model(checkpoint_path)
|
87 |
+
return TrainerControl.CONTINUE
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
88 |
|
89 |
# Định Nghĩa Hàm Huấn Luyện với Decorator @spaces.GPU
|
90 |
+
@spaces.GPU(duration=15, queue=False)
|
91 |
def run_training():
|
92 |
+
"""
|
93 |
+
Hàm huấn luyện mô hình sử dụng GPU với thời gian hạn chế.
|
94 |
+
"""
|
95 |
+
# Tải và Cấu Hình Mô Hình với LoRA (GPU)
|
96 |
+
model = AutoModelForCausalLM.from_pretrained(
|
97 |
+
model_name,
|
98 |
+
device_map="auto",
|
99 |
+
torch_dtype=torch.float16,
|
100 |
+
load_in_8bit=False
|
101 |
+
)
|
102 |
+
|
103 |
+
lora_config = LoraConfig(
|
104 |
+
r=8,
|
105 |
+
lora_alpha=32,
|
106 |
+
target_modules=["q_proj", "k_proj", "v_proj", "out_proj"],
|
107 |
+
lora_dropout=0.1,
|
108 |
+
bias="none",
|
109 |
+
)
|
110 |
+
|
111 |
+
model = get_peft_model(model, lora_config)
|
112 |
+
print(model)
|
113 |
+
|
114 |
+
# Cấu Hình TrainingArguments (GPU)
|
115 |
+
training_args = TrainingArguments(
|
116 |
+
output_dir=CHECKPOINT_DIR,
|
117 |
+
per_device_train_batch_size=4,
|
118 |
+
per_device_eval_batch_size=4,
|
119 |
+
gradient_accumulation_steps=8,
|
120 |
+
num_train_epochs=3,
|
121 |
+
max_steps=50, # Đặt max_steps tại đây
|
122 |
+
learning_rate=3e-4,
|
123 |
+
weight_decay=0.01,
|
124 |
+
logging_steps=10, # Giảm số bước logging để theo dõi thường xuyên hơn
|
125 |
+
eval_strategy="steps", # Đánh giá sau mỗi vài bước
|
126 |
+
eval_steps=50, # Đánh giá sau mỗi 50 bước
|
127 |
+
save_strategy="steps", # Lưu checkpoint sau mỗi vài bước
|
128 |
+
save_steps=50, # Lưu checkpoint sau mỗi 50 bước
|
129 |
+
save_total_limit=5, # Giới hạn số lượng checkpoint lưu trữ
|
130 |
+
fp16=True,
|
131 |
+
report_to="none",
|
132 |
+
load_best_model_at_end=True,
|
133 |
+
)
|
134 |
+
|
135 |
+
# Data Collator (GPU)
|
136 |
+
data_collator = DataCollatorForLanguageModeling(
|
137 |
+
tokenizer=tokenizer,
|
138 |
+
mlm=False, # Vì bạn đang thực hiện Causal LM
|
139 |
+
pad_to_multiple_of=8
|
140 |
+
)
|
141 |
+
|
142 |
+
# Tạo Trainer (GPU)
|
143 |
+
trainer = Trainer(
|
144 |
+
model=model,
|
145 |
+
args=training_args,
|
146 |
+
train_dataset=final_dataset['train'],
|
147 |
+
eval_dataset=final_dataset['validation'],
|
148 |
+
tokenizer=tokenizer,
|
149 |
+
data_collator=data_collator,
|
150 |
+
callbacks=[SaveCheckpointCallback()], # Thêm callback
|
151 |
+
)
|
152 |
+
|
153 |
# Kiểm tra nếu có checkpoint
|
154 |
checkpoints = [os.path.join(CHECKPOINT_DIR, d) for d in os.listdir(CHECKPOINT_DIR) if d.startswith('checkpoint')]
|
155 |
if checkpoints:
|
|
|
163 |
trainer.save_model(CHECKPOINT_DIR)
|
164 |
return "Huấn luyện hoàn tất hoặc đã tiếp tục từ checkpoint."
|
165 |
|
166 |
+
# Hàm Tự Động Hóa Việc Gọi Lặp Lại Hàm Huấn Luyện
|
167 |
+
def continuous_training(total_steps=300, steps_per_call=50):
|
168 |
+
"""
|
169 |
+
Hàm tự động gọi lại `run_training` để hoàn thành quá trình huấn luyện.
|
170 |
+
|
171 |
+
Args:
|
172 |
+
total_steps (int): Tổng số bước huấn luyện mong muốn.
|
173 |
+
steps_per_call (int): Số bước huấn luyện mỗi lần gọi hàm.
|
174 |
+
"""
|
175 |
+
steps_done = 0
|
176 |
+
while steps_done < total_steps:
|
177 |
+
print(f"Bắt đầu huấn luyện cho {steps_per_call} bước.")
|
178 |
result = run_training()
|
179 |
print(result)
|
180 |
+
steps_done += steps_per_call
|
181 |
+
print(f"Đã huấn luyện {steps_done} / {total_steps} bước.")
|
182 |
|
183 |
+
# Kiểm tra nếu đã đạt số bước mong muốn
|
184 |
+
if steps_done >= total_steps:
|
185 |
+
print("Đã hoàn thành toàn bộ quá trình huấn luyện.")
|
|
|
|
|
|
|
|
|
186 |
break
|
187 |
|
188 |
# 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)
|
189 |
+
time.sleep(2) # Thời gian chờ có thể điều chỉnh
|
190 |
|
191 |
+
# Gọi hàm huấn luyện liên tục
|
192 |
+
if __name__ == "__main__":
|
193 |
+
continuous_training(total_steps=300, steps_per_call=50)
|
requirements.txt
CHANGED
@@ -17,4 +17,5 @@ sentencepiece
|
|
17 |
soxr
|
18 |
pydub
|
19 |
opencv-python
|
20 |
-
av
|
|
|
|
17 |
soxr
|
18 |
pydub
|
19 |
opencv-python
|
20 |
+
av
|
21 |
+
peft
|