Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -4,17 +4,17 @@ from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments,
|
|
4 |
from peft import get_peft_model, LoraConfig, TaskType
|
5 |
from datasets import load_dataset
|
6 |
|
7 |
-
# ✅
|
8 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
9 |
|
10 |
-
# ✅
|
11 |
def train_model(dataset_url, model_url, epochs):
|
12 |
try:
|
13 |
-
#
|
14 |
tokenizer = AutoTokenizer.from_pretrained(model_url)
|
15 |
model = AutoModelForCausalLM.from_pretrained(model_url).to(device)
|
16 |
|
17 |
-
# ✅
|
18 |
lora_config = LoraConfig(
|
19 |
task_type=TaskType.CAUSAL_LM,
|
20 |
r=8,
|
@@ -26,30 +26,30 @@ def train_model(dataset_url, model_url, epochs):
|
|
26 |
model = get_peft_model(model, lora_config)
|
27 |
model.to(device)
|
28 |
|
29 |
-
# ✅
|
30 |
dataset = load_dataset(dataset_url)
|
31 |
|
32 |
-
# ✅
|
33 |
def tokenize_function(examples):
|
34 |
return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=256)
|
35 |
|
36 |
tokenized_datasets = dataset.map(tokenize_function, batched=True)
|
37 |
train_dataset = tokenized_datasets["train"]
|
38 |
|
39 |
-
# ✅
|
40 |
training_args = TrainingArguments(
|
41 |
output_dir="./deepseek_lora_cpu",
|
42 |
evaluation_strategy="epoch",
|
43 |
learning_rate=5e-4,
|
44 |
-
per_device_train_batch_size=1, #
|
45 |
per_device_eval_batch_size=1,
|
46 |
num_train_epochs=int(epochs),
|
47 |
save_strategy="epoch",
|
48 |
save_total_limit=2,
|
49 |
logging_dir="./logs",
|
50 |
logging_steps=10,
|
51 |
-
fp16=False, #
|
52 |
-
gradient_checkpointing=True, #
|
53 |
optim="adamw_torch",
|
54 |
report_to="none"
|
55 |
)
|
@@ -60,30 +60,34 @@ def train_model(dataset_url, model_url, epochs):
|
|
60 |
train_dataset=train_dataset
|
61 |
)
|
62 |
|
63 |
-
#
|
64 |
trainer.train()
|
65 |
-
|
66 |
-
# ✅ Save the Fine-Tuned Model
|
67 |
-
model.save_pretrained("./deepseek_lora_finetuned")
|
68 |
tokenizer.save_pretrained("./deepseek_lora_finetuned")
|
69 |
|
70 |
-
return "✅
|
71 |
-
|
72 |
except Exception as e:
|
73 |
-
return f"❌
|
74 |
|
75 |
-
# ✅ Gradio UI
|
76 |
with gr.Blocks() as app:
|
77 |
-
gr.Markdown("# 🚀 AutoTrain DeepSeek R1 (CPU)")
|
|
|
|
|
|
|
|
|
78 |
|
79 |
-
|
80 |
-
|
81 |
-
epochs = gr.Slider(minimum=1, maximum=10, step=1, value=3, label="Number of Training Epochs")
|
82 |
|
83 |
-
|
84 |
-
|
|
|
|
|
85 |
|
86 |
-
train_button.click(
|
87 |
|
88 |
-
# ✅
|
89 |
-
app.
|
|
|
|
4 |
from peft import get_peft_model, LoraConfig, TaskType
|
5 |
from datasets import load_dataset
|
6 |
|
7 |
+
# ✅ بررسی سختافزار (CPU/GPU)
|
8 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
9 |
|
10 |
+
# ✅ تابع اجرای ترینینگ (قفل شده تا پایان)
|
11 |
def train_model(dataset_url, model_url, epochs):
|
12 |
try:
|
13 |
+
# 🚀 بارگیری مدل و توکنایزر
|
14 |
tokenizer = AutoTokenizer.from_pretrained(model_url)
|
15 |
model = AutoModelForCausalLM.from_pretrained(model_url).to(device)
|
16 |
|
17 |
+
# ✅ تنظیم LoRA برای کاهش مصرف حافظه
|
18 |
lora_config = LoraConfig(
|
19 |
task_type=TaskType.CAUSAL_LM,
|
20 |
r=8,
|
|
|
26 |
model = get_peft_model(model, lora_config)
|
27 |
model.to(device)
|
28 |
|
29 |
+
# ✅ بارگیری دیتاست
|
30 |
dataset = load_dataset(dataset_url)
|
31 |
|
32 |
+
# ✅ توکنایز کردن دادهها
|
33 |
def tokenize_function(examples):
|
34 |
return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=256)
|
35 |
|
36 |
tokenized_datasets = dataset.map(tokenize_function, batched=True)
|
37 |
train_dataset = tokenized_datasets["train"]
|
38 |
|
39 |
+
# ✅ تنظیمات ترینینگ
|
40 |
training_args = TrainingArguments(
|
41 |
output_dir="./deepseek_lora_cpu",
|
42 |
evaluation_strategy="epoch",
|
43 |
learning_rate=5e-4,
|
44 |
+
per_device_train_batch_size=1, # کاهش مصرف RAM
|
45 |
per_device_eval_batch_size=1,
|
46 |
num_train_epochs=int(epochs),
|
47 |
save_strategy="epoch",
|
48 |
save_total_limit=2,
|
49 |
logging_dir="./logs",
|
50 |
logging_steps=10,
|
51 |
+
fp16=False, # عدم استفاده از FP16 روی CPU
|
52 |
+
gradient_checkpointing=True, # ذخیره حافظه
|
53 |
optim="adamw_torch",
|
54 |
report_to="none"
|
55 |
)
|
|
|
60 |
train_dataset=train_dataset
|
61 |
)
|
62 |
|
63 |
+
# 🚀 شروع ترینینگ (قفل شده تا پایان)
|
64 |
trainer.train()
|
65 |
+
trainer.save_model("./deepseek_lora_finetuned") # ذخیره نهایی مدل
|
|
|
|
|
66 |
tokenizer.save_pretrained("./deepseek_lora_finetuned")
|
67 |
|
68 |
+
return "✅ ترینینگ کامل شد! مدل ذخیره شد."
|
69 |
+
|
70 |
except Exception as e:
|
71 |
+
return f"❌ خطا: {str(e)}"
|
72 |
|
73 |
+
# ✅ Gradio UI با دکمهی غیرفعالشونده
|
74 |
with gr.Blocks() as app:
|
75 |
+
gr.Markdown("# 🚀 AutoTrain DeepSeek R1 (CPU) - (بدون توقف تا پایان)")
|
76 |
+
|
77 |
+
dataset_url = gr.Textbox(label="Dataset URL (Hugging Face)", placeholder="مثال: samsum")
|
78 |
+
model_url = gr.Textbox(label="Model URL (Hugging Face)", placeholder="مثال: deepseek-ai/deepseek-r1")
|
79 |
+
epochs = gr.Slider(minimum=1, maximum=10, step=1, value=3, label="تعداد Epochs")
|
80 |
|
81 |
+
train_button = gr.Button("شروع ترینینگ", interactive=True)
|
82 |
+
output_text = gr.Textbox(label="وضعیت ترینینگ")
|
|
|
83 |
|
84 |
+
# 🚀 بعد از کلیک دکمه را غیرفعال کنیم تا کار متوقف نشود
|
85 |
+
def disable_button(*args):
|
86 |
+
train_button.interactive = False # غیرفعال کردن دکمه
|
87 |
+
return train_model(*args)
|
88 |
|
89 |
+
train_button.click(disable_button, inputs=[dataset_url, model_url, epochs], outputs=output_text)
|
90 |
|
91 |
+
# ✅ اجرای Gradio در حالت قفل شده
|
92 |
+
app.queue() # این خط تضمین میکند که پردازش متوقف نشو��
|
93 |
+
app.launch(server_name="0.0.0.0", server_port=7860, share=True, blocking=True)
|