Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,95 +1,111 @@
|
|
1 |
import torch
|
2 |
import gradio as gr
|
|
|
|
|
|
|
3 |
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
|
4 |
from peft import get_peft_model, LoraConfig, TaskType
|
5 |
from datasets import load_dataset
|
6 |
|
7 |
-
device = "cpu"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
|
9 |
def train_model(dataset_url, model_url, epochs):
|
10 |
try:
|
11 |
-
|
12 |
-
# 🚀 بارگیری مدل و توکنایزر بدون نیاز به GPU
|
13 |
tokenizer = AutoTokenizer.from_pretrained(model_url, trust_remote_code=True)
|
14 |
model = AutoModelForCausalLM.from_pretrained(
|
15 |
-
model_url,
|
16 |
-
trust_remote_code=True,
|
17 |
-
torch_dtype=torch.float32, # ✅ اجرا روی CPU
|
18 |
-
device_map="cpu"
|
19 |
)
|
20 |
|
21 |
-
# ✅ تنظیم LoRA برای کاهش مصرف حافظه
|
22 |
lora_config = LoraConfig(
|
23 |
-
task_type=TaskType.CAUSAL_LM,
|
24 |
-
r=8,
|
25 |
-
lora_alpha=32,
|
26 |
-
lora_dropout=0.1,
|
27 |
-
target_modules=["q_proj", "v_proj"]
|
28 |
)
|
29 |
|
30 |
model = get_peft_model(model, lora_config)
|
31 |
model.to(device)
|
32 |
|
33 |
-
# ✅ بارگیری دیتاست
|
34 |
dataset = load_dataset(dataset_url)
|
35 |
-
|
36 |
-
# ✅ توکنایز کردن دادهها
|
37 |
def tokenize_function(examples):
|
38 |
return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=256)
|
39 |
|
40 |
tokenized_datasets = dataset.map(tokenize_function, batched=True)
|
41 |
train_dataset = tokenized_datasets["train"]
|
42 |
|
43 |
-
# ✅ تنظیمات ترینینگ
|
44 |
training_args = TrainingArguments(
|
45 |
output_dir="./deepseek_lora_cpu",
|
46 |
evaluation_strategy="epoch",
|
47 |
learning_rate=5e-4,
|
48 |
-
per_device_train_batch_size=1,
|
49 |
per_device_eval_batch_size=1,
|
50 |
num_train_epochs=int(epochs),
|
51 |
save_strategy="epoch",
|
52 |
save_total_limit=2,
|
53 |
logging_dir="./logs",
|
54 |
logging_steps=10,
|
55 |
-
fp16=False,
|
56 |
gradient_checkpointing=True,
|
57 |
optim="adamw_torch",
|
58 |
report_to="none"
|
59 |
)
|
60 |
|
61 |
trainer = Trainer(
|
62 |
-
model=model,
|
63 |
-
args=training_args,
|
64 |
train_dataset=train_dataset
|
65 |
)
|
66 |
|
67 |
-
|
68 |
-
trainer.train()
|
69 |
-
trainer.save_model("./deepseek_lora_finetuned")
|
70 |
-
tokenizer.save_pretrained("./deepseek_lora_finetuned")
|
71 |
|
72 |
-
|
|
|
|
|
|
|
|
|
|
|
73 |
|
74 |
except Exception as e:
|
75 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
76 |
|
77 |
-
# ✅ رابط کاربری Gradio
|
78 |
with gr.Blocks() as app:
|
79 |
-
gr.Markdown("# 🚀 AutoTrain DeepSeek R1 (CPU) -
|
80 |
|
81 |
dataset_url = gr.Textbox(label="Dataset URL (Hugging Face)", placeholder="مثال: samsum")
|
82 |
model_url = gr.Textbox(label="Model URL (Hugging Face)", placeholder="مثال: deepseek-ai/deepseek-r1")
|
83 |
epochs = gr.Slider(minimum=1, maximum=10, step=1, value=3, label="تعد��د Epochs")
|
84 |
|
85 |
-
train_button = gr.Button("شروع ترینینگ"
|
86 |
output_text = gr.Textbox(label="وضعیت ترینینگ")
|
87 |
|
88 |
-
|
89 |
-
|
90 |
-
|
|
|
|
|
|
|
|
|
91 |
|
92 |
-
|
93 |
|
94 |
app.queue()
|
95 |
app.launch(server_name="0.0.0.0", server_port=7860, share=True)
|
|
|
1 |
import torch
|
2 |
import gradio as gr
|
3 |
+
import multiprocessing
|
4 |
+
import os
|
5 |
+
import time
|
6 |
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
|
7 |
from peft import get_peft_model, LoraConfig, TaskType
|
8 |
from datasets import load_dataset
|
9 |
|
10 |
+
device = "cpu"
|
11 |
+
training_process = None
|
12 |
+
log_file = "training_status.log"
|
13 |
+
|
14 |
+
def log_status(message):
|
15 |
+
with open(log_file, "w") as f:
|
16 |
+
f.write(message)
|
17 |
+
|
18 |
+
def read_status():
|
19 |
+
if os.path.exists(log_file):
|
20 |
+
with open(log_file, "r") as f:
|
21 |
+
return f.read()
|
22 |
+
return "⏳ در انتظار شروع ترینینگ..."
|
23 |
|
24 |
def train_model(dataset_url, model_url, epochs):
|
25 |
try:
|
26 |
+
log_status("🚀 در حال بارگیری مدل...")
|
|
|
27 |
tokenizer = AutoTokenizer.from_pretrained(model_url, trust_remote_code=True)
|
28 |
model = AutoModelForCausalLM.from_pretrained(
|
29 |
+
model_url, trust_remote_code=True, torch_dtype=torch.float32, device_map="cpu"
|
|
|
|
|
|
|
30 |
)
|
31 |
|
|
|
32 |
lora_config = LoraConfig(
|
33 |
+
task_type=TaskType.CAUSAL_LM, r=8, lora_alpha=32, lora_dropout=0.1, target_modules=["q_proj", "v_proj"]
|
|
|
|
|
|
|
|
|
34 |
)
|
35 |
|
36 |
model = get_peft_model(model, lora_config)
|
37 |
model.to(device)
|
38 |
|
|
|
39 |
dataset = load_dataset(dataset_url)
|
|
|
|
|
40 |
def tokenize_function(examples):
|
41 |
return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=256)
|
42 |
|
43 |
tokenized_datasets = dataset.map(tokenize_function, batched=True)
|
44 |
train_dataset = tokenized_datasets["train"]
|
45 |
|
|
|
46 |
training_args = TrainingArguments(
|
47 |
output_dir="./deepseek_lora_cpu",
|
48 |
evaluation_strategy="epoch",
|
49 |
learning_rate=5e-4,
|
50 |
+
per_device_train_batch_size=1,
|
51 |
per_device_eval_batch_size=1,
|
52 |
num_train_epochs=int(epochs),
|
53 |
save_strategy="epoch",
|
54 |
save_total_limit=2,
|
55 |
logging_dir="./logs",
|
56 |
logging_steps=10,
|
57 |
+
fp16=False,
|
58 |
gradient_checkpointing=True,
|
59 |
optim="adamw_torch",
|
60 |
report_to="none"
|
61 |
)
|
62 |
|
63 |
trainer = Trainer(
|
64 |
+
model=model,
|
65 |
+
args=training_args,
|
66 |
train_dataset=train_dataset
|
67 |
)
|
68 |
|
69 |
+
log_status("🚀 ترینینگ شروع شد...")
|
|
|
|
|
|
|
70 |
|
71 |
+
for epoch in range(int(epochs)):
|
72 |
+
log_status(f"🔄 در حال اجرا: Epoch {epoch+1}/{epochs}...")
|
73 |
+
trainer.train(resume_from_checkpoint=True)
|
74 |
+
trainer.save_model(f"./deepseek_lora_finetuned_epoch_{epoch+1}")
|
75 |
+
|
76 |
+
log_status("✅ ترینینگ کامل شد!")
|
77 |
|
78 |
except Exception as e:
|
79 |
+
log_status(f"❌ خطا: {str(e)}")
|
80 |
+
|
81 |
+
def start_training(dataset_url, model_url, epochs):
|
82 |
+
global training_process
|
83 |
+
if training_process is None or not training_process.is_alive():
|
84 |
+
training_process = multiprocessing.Process(target=train_model, args=(dataset_url, model_url, epochs))
|
85 |
+
training_process.start()
|
86 |
+
return "🚀 ترینینگ شروع شد!"
|
87 |
+
else:
|
88 |
+
return "⚠ ترینینگ در حال اجرا است!"
|
89 |
|
|
|
90 |
with gr.Blocks() as app:
|
91 |
+
gr.Markdown("# 🚀 AutoTrain DeepSeek R1 (CPU) - نمایش وضعیت لحظهای")
|
92 |
|
93 |
dataset_url = gr.Textbox(label="Dataset URL (Hugging Face)", placeholder="مثال: samsum")
|
94 |
model_url = gr.Textbox(label="Model URL (Hugging Face)", placeholder="مثال: deepseek-ai/deepseek-r1")
|
95 |
epochs = gr.Slider(minimum=1, maximum=10, step=1, value=3, label="تعد��د Epochs")
|
96 |
|
97 |
+
train_button = gr.Button("شروع ترینینگ")
|
98 |
output_text = gr.Textbox(label="وضعیت ترینینگ")
|
99 |
|
100 |
+
train_button.click(start_training, inputs=[dataset_url, model_url, epochs], outputs=output_text)
|
101 |
+
|
102 |
+
# ✅ نمایش وضعیت لحظهای ترینینگ
|
103 |
+
status_box = gr.Textbox(label="مرحله فعلی ترینینگ", interactive=False)
|
104 |
+
|
105 |
+
def update_status():
|
106 |
+
return read_status()
|
107 |
|
108 |
+
app.load(update_status, inputs=[], outputs=status_box, every=5) # هر ۵ ثانیه وضعیت را بهروزرسانی کن
|
109 |
|
110 |
app.queue()
|
111 |
app.launch(server_name="0.0.0.0", server_port=7860, share=True)
|