code5ecure commited on
Commit
0ec31da
·
verified ·
1 Parent(s): 67251dc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +61 -73
app.py CHANGED
@@ -1,94 +1,82 @@
1
  import gradio as gr
2
- import torch
3
  from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
4
- from torch.optim import AdamW
5
- from torch.utils.data import Dataset, DataLoader
 
6
  from opacus import PrivacyEngine
 
7
 
8
- # ---------------------
9
- # تنظیمات مدل
10
- # ---------------------
11
  MODEL_NAME = "HooshvareLab/gpt2-fa"
12
- tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
13
- model = AutoModelForCausalLM.from_pretrained(
14
- MODEL_NAME,
15
- torch_dtype="auto"
16
- )
17
  device = "cuda" if torch.cuda.is_available() else "cpu"
18
- model.to(device)
 
 
19
 
20
  generator = pipeline("text-generation", model=model, tokenizer=tokenizer, device=0 if device=="cuda" else -1)
21
 
22
- # ---------------------
23
- # Dataset ساده
24
- # ---------------------
25
- class TextDataset(Dataset):
26
- def __init__(self, file_path, tokenizer, max_length=128):
27
- with open(file_path, "r", encoding="utf-8") as f:
28
- lines = f.read().splitlines()
29
- self.examples = [tokenizer.encode(line, truncation=True, max_length=max_length) for line in lines]
30
 
31
- def __len__(self):
32
- return len(self.examples)
 
 
 
 
 
 
33
 
 
 
 
 
 
34
  def __getitem__(self, idx):
35
- return torch.tensor(self.examples[idx])
36
 
37
- # بارگذاری داده آموزشی
38
- train_dataset = TextDataset("training_data.txt", tokenizer)
39
- train_loader = DataLoader(train_dataset, batch_size=2, shuffle=True)
40
 
41
- # ---------------------
42
- # تنظیمات بهینه‌ساز و DP
43
- # ---------------------
44
- optimizer = AdamW(model.parameters(), lr=5e-5)
45
- privacy_engine = PrivacyEngine(
46
  model,
47
- batch_size=2,
48
- sample_size=len(train_dataset),
49
- alphas=[10, 100],
50
- noise_multiplier=1.0,
51
- max_grad_norm=1.0,
52
  )
53
- privacy_engine.attach(optimizer)
54
-
55
- # ---------------------
56
- # تابع تولید متن
57
- # ---------------------
58
- def generate_and_learn(prompt, max_new_tokens=150, temperature=0.7, top_p=0.9, train_steps=1):
59
- # تولید متن
60
- output_text = generator(prompt, max_new_tokens=int(max_new_tokens),
61
- do_sample=True, temperature=float(temperature),
62
- top_p=float(top_p))[0]["generated_text"]
63
 
64
- # یادگیری incremental روی داده آموزشی
 
65
  model.train()
66
- for _ in range(train_steps):
67
- for batch in train_loader:
68
- batch = batch.to(device)
69
- outputs = model(batch, labels=batch)
70
- loss = outputs.loss
71
- optimizer.zero_grad()
72
- loss.backward()
73
- optimizer.step()
 
74
 
75
- return output_text + "\n\n[✅ مدل بعد از یادگیری incremental بروزرسانی شد]"
 
 
 
 
 
 
 
 
 
76
 
77
- # ---------------------
78
- # رابط Gradio
79
- # ---------------------
80
  with gr.Blocks(title="چت بات فارسی با یادگیری امن") as demo:
81
- gr.Markdown(
82
- "<div dir='rtl'>"
83
- "## چت بات فارسی با یادگیری امن\n"
84
- "یک Prompt وارد کنید و پاسخ مدل را دریافت کنید. مدل قابلیت یادگیری incremental با **DP** دارد."
85
- "</div>"
86
- )
87
- prompt_box = gr.Textbox(label="Prompt", lines=4)
88
- btn = gr.Button("تولید پاسخ")
89
- output_box = gr.Textbox(label="خروجی", lines=12)
90
-
91
- btn.click(generate_and_learn, inputs=prompt_box, outputs=output_box)
92
-
93
- if __name__ == "__main__":
94
- demo.launch()
 
1
  import gradio as gr
 
2
  from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
3
+ import torch
4
+ from torch.utils.data import DataLoader, Dataset
5
+ from torch.optim import Adam
6
  from opacus import PrivacyEngine
7
+ import os
8
 
9
+ # ---------- تنظیمات مدل ----------
 
 
10
  MODEL_NAME = "HooshvareLab/gpt2-fa"
11
+ MAX_NEW_TOKENS = 150
12
+
 
 
 
13
  device = "cuda" if torch.cuda.is_available() else "cpu"
14
+
15
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
16
+ model = AutoModelForCausalLM.from_pretrained(MODEL_NAME).to(device)
17
 
18
  generator = pipeline("text-generation", model=model, tokenizer=tokenizer, device=0 if device=="cuda" else -1)
19
 
20
+ # ---------- داده آموزشی ----------
21
+ TRAINING_FILE = "training_data.txt"
 
 
 
 
 
 
22
 
23
+ if not os.path.exists(TRAINING_FILE):
24
+ # ایجاد یک فایل نمونه کوچک
25
+ with open(TRAINING_FILE, "w", encoding="utf-8") as f:
26
+ f.write("سلام! این یک متن نمونه برای آموزش مدل GPT-2 فارسی است.\n")
27
+ f.write("مدل می‌تواند پاسخ‌های ساده و امن بدهد.\n")
28
+
29
+ with open(TRAINING_FILE, "r", encoding="utf-8") as f:
30
+ texts = f.read().splitlines()
31
 
32
+ class TextDataset(Dataset):
33
+ def __init__(self, texts, tokenizer, max_length=128):
34
+ self.encodings = tokenizer(texts, truncation=True, padding=True, max_length=max_length, return_tensors="pt")
35
+ def __len__(self):
36
+ return len(self.encodings["input_ids"])
37
  def __getitem__(self, idx):
38
+ return {key: val[idx] for key, val in self.encodings.items()}
39
 
40
+ dataset = TextDataset(texts, tokenizer)
41
+ dataloader = DataLoader(dataset, batch_size=2, shuffle=True)
 
42
 
43
+ # ---------- بهینه‌ساز و DP ----------
44
+ optimizer = Adam(model.parameters(), lr=5e-5)
45
+
46
+ privacy_engine = PrivacyEngine()
47
+ privacy_engine.attach(
48
  model,
49
+ optimizer,
50
+ sample_rate=dataloader.batch_size / len(dataset),
51
+ max_grad_norm=1.0
 
 
52
  )
 
 
 
 
 
 
 
 
 
 
53
 
54
+ # ---------- تابع آموزش incremental ----------
55
+ def train_one_epoch():
56
  model.train()
57
+ for batch in dataloader:
58
+ input_ids = batch["input_ids"].to(device)
59
+ attention_mask = batch["attention_mask"].to(device)
60
+ outputs = model(input_ids, attention_mask=attention_mask, labels=input_ids)
61
+ loss = outputs.loss
62
+ optimizer.zero_grad()
63
+ loss.backward()
64
+ optimizer.step()
65
+ return f"✅ یک دوره آموزشی انجام شد. آخرین Loss: {loss.item():.4f}"
66
 
67
+ # ---------- تابع تولید متن ----------
68
+ def generate_text(prompt, max_new_tokens=MAX_NEW_TOKENS):
69
+ model.eval()
70
+ try:
71
+ return generator(prompt, max_new_tokens=int(max_new_tokens), do_sample=True)[0]["generated_text"]
72
+ except torch.cuda.OutOfMemoryError:
73
+ torch.cuda.empty_cache()
74
+ return "⚠️ حافظه کم بود، خروجی کامل تولید نشد."
75
+ except Exception as e:
76
+ return f"❌ خطا: {e}"
77
 
78
+ # ---------- رابط Gradio ----------
 
 
79
  with gr.Blocks(title="چت بات فارسی با یادگیری امن") as demo:
80
+ gr.Markdown("<div dir='rtl'>## چت بات فارسی (DP-ready)\n"
81
+ "تنها یک پرامپت وارد کنید و پاسخ مدل را دریافت کنید. "
82
+ "مدل به صورت incremental روی داده‌های داخلی آموزش داده می‌شود.</div>", elem_id="int_