File size: 3,688 Bytes
2b35f7d
0b40748
 
 
 
 
777e328
0b40748
 
 
777e328
e784c2f
777e328
 
 
 
 
 
0b40748
3f9d883
0b40748
 
 
 
 
 
 
 
 
 
 
3f9d883
0b40748
 
3f9d883
0b40748
 
 
 
 
 
3f9d883
0b40748
 
 
 
777e328
0b40748
 
 
 
 
 
777e328
e784c2f
0b40748
 
 
 
 
 
 
 
 
 
3f9d883
0b40748
e784c2f
0b40748
 
3f9d883
 
0b40748
3f9d883
0b40748
e784c2f
0b40748
3f9d883
 
 
 
 
0b40748
3f9d883
 
0b40748
3f9d883
e784c2f
3f9d883
0b40748
3f9d883
2b35f7d
e784c2f
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import torch
import gradio as gr
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from peft import get_peft_model, LoraConfig, TaskType
from datasets import load_dataset

device = "cpu"  # ✅ اجباراً فقط روی CPU اجرا شود

def train_model(dataset_url, model_url, epochs):
    try:
        # 🚀 بارگیری مدل و توکنایزر با اجازه اجرای کد سفارشی و بدون نیاز به GPU
        tokenizer = AutoTokenizer.from_pretrained(model_url, trust_remote_code=True)
        model = AutoModelForCausalLM.from_pretrained(
            model_url, 
            trust_remote_code=True, 
            torch_dtype=torch.float32,  # ✅ تغییر به float32 برای CPU
            device_map="cpu"  # ✅ اجباری کردن اجرای روی CPU
        )

        # ✅ تنظیم LoRA برای کاهش مصرف حافظه
        lora_config = LoraConfig(
            task_type=TaskType.CAUSAL_LM,
            r=8,
            lora_alpha=32,
            lora_dropout=0.1,
            target_modules=["q_proj", "v_proj"]
        )

        model = get_peft_model(model, lora_config)
        model.to(device)

        # ✅ بارگیری دیتاست
        dataset = load_dataset(dataset_url)

        # ✅ توکنایز کردن داده‌ها
        def tokenize_function(examples):
            return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=256)

        tokenized_datasets = dataset.map(tokenize_function, batched=True)
        train_dataset = tokenized_datasets["train"]

        # ✅ تنظیمات ترینینگ
        training_args = TrainingArguments(
            output_dir="./deepseek_lora_cpu",
            evaluation_strategy="epoch",
            learning_rate=5e-4,
            per_device_train_batch_size=1,  # کاهش مصرف RAM
            per_device_eval_batch_size=1,
            num_train_epochs=int(epochs),
            save_strategy="epoch",
            save_total_limit=2,
            logging_dir="./logs",
            logging_steps=10,
            fp16=False,  # ❌ غیرفعال‌سازی FP16 چون روی CPU اجرا می‌شود
            gradient_checkpointing=True,
            optim="adamw_torch",
            report_to="none"
        )

        trainer = Trainer(
            model=model,
            args=training_args,
            train_dataset=train_dataset
        )

        # 🚀 شروع ترینینگ (قفل شده تا پایان)
        trainer.train()
        trainer.save_model("./deepseek_lora_finetuned")  
        tokenizer.save_pretrained("./deepseek_lora_finetuned")

        return "✅ ترینینگ کامل شد! مدل ذخیره شد."

    except Exception as e:
        return f"❌ خطا: {str(e)}"

# ✅ رابط کاربری Gradio
with gr.Blocks() as app:
    gr.Markdown("# 🚀 AutoTrain DeepSeek R1 (CPU) - (بدون توقف تا پایان)")

    dataset_url = gr.Textbox(label="Dataset URL (Hugging Face)", placeholder="مثال: samsum")
    model_url = gr.Textbox(label="Model URL (Hugging Face)", placeholder="مثال: deepseek-ai/deepseek-r1")
    epochs = gr.Slider(minimum=1, maximum=10, step=1, value=3, label="تعداد Epochs")

    train_button = gr.Button("شروع ترینینگ", interactive=True)
    output_text = gr.Textbox(label="وضعیت ترینینگ")

    def disable_button(*args):
        train_button.interactive = False
        return train_model(*args)

    train_button.click(disable_button, inputs=[dataset_url, model_url, epochs], outputs=output_text)

app.queue()
app.launch(server_name="0.0.0.0", server_port=7860, share=True)