code5ecure commited on
Commit
99ca1ce
·
verified ·
1 Parent(s): 0e318c6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +45 -89
app.py CHANGED
@@ -1,96 +1,52 @@
 
 
1
  import torch
2
- from torch.utils.data import DataLoader, Dataset
3
- from transformers import AutoTokenizer, AutoModelForMaskedLM, pipeline
4
- from opacus import PrivacyEngine
5
- import gradio as gr
6
 
7
- # ===========================
8
- # مدل و توکنایزر
9
- # ===========================
10
- model_name = "HooshvareLab/bert-base-parsbert-uncased"
11
- tokenizer = AutoTokenizer.from_pretrained(model_name)
12
- tokenizer.pad_token = tokenizer.eos_token # حل ارور padding
13
 
14
- model = AutoModelForMaskedLM.from_pretrained(model_name)
15
- device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
16
- model.to(device)
 
17
 
18
- # ===========================
19
- # بارگذاری داده آموزشی داخلی
20
- # ===========================
21
- with open("training_data.txt", "r", encoding="utf-8") as f:
22
- texts = [line.strip() for line in f if line.strip()]
23
-
24
- # ===========================
25
- # Dataset و DataLoader
26
- # ===========================
27
  class TextDataset(Dataset):
28
- def __init__(self, texts, tokenizer, max_length=128):
29
- self.encodings = tokenizer(texts, truncation=True, padding=True, max_length=max_length, return_tensors="pt")
30
- def __len__(self):
31
- return self.encodings.input_ids.size(0)
32
- def __getitem__(self, idx):
33
- return {"input_ids": self.encodings.input_ids[idx], "attention_mask": self.encodings.attention_mask[idx], "labels": self.encodings.input_ids[idx]}
34
-
35
- dataset = TextDataset(texts, tokenizer)
36
- data_loader = DataLoader(dataset, batch_size=4, shuffle=True)
37
-
38
- # ===========================
39
- # تعریف Optimizer و PrivacyEngine
40
- # ===========================
41
- optimizer = torch.optim.AdamW(model.parameters(), lr=5e-5)
42
-
43
- privacy_engine = PrivacyEngine()
44
- model, optimizer, data_loader = privacy_engine.make_private(
45
- module=model,
46
- optimizer=optimizer,
47
- data_loader=data_loader,
48
- max_grad_norm=1.0,
49
- noise_multiplier=1.0,
50
- )
51
 
52
- # ===========================
53
- # آموزش incremental (یک epoch ساده)
54
- # ===========================
55
- def train_step():
56
- model.train()
57
- total_loss = 0
58
- for batch in data_loader:
59
- input_ids = batch["input_ids"].to(device)
60
- attention_mask = batch["attention_mask"].to(device)
61
- labels = batch["labels"].to(device)
62
-
63
- optimizer.zero_grad()
64
- outputs = model(input_ids, attention_mask=attention_mask, labels=labels)
65
- loss = outputs.loss
66
- loss.backward()
67
- optimizer.step()
68
- total_loss += loss.item()
69
- return total_loss / len(data_loader)
70
-
71
- # ===========================
72
- # تابع تولید پاسخ
73
- # ===========================
74
- generator = pipeline(
75
- task="text-generation",
76
- model=model,
77
- tokenizer=tokenizer,
78
- device=0 if torch.cuda.is_available() else -1
79
- )
80
-
81
- def chat(prompt):
82
- loss = train_step() # آموزش incremental روی داده داخلی قبل از تولید پاسخ
83
- result = generator(prompt, max_length=128, do_sample=True, temperature=0.8)
84
- return f"{result[0]['generated_text']}\n\n(مدل به صورت incremental روی داده‌های داخلی آموزش داده شد. DP فعال است)"
85
-
86
- # ===========================
87
- # رابط کاربری Gradio (RTL)
88
- # ===========================
89
- with gr.Blocks() as demo:
90
- gr.HTML("<div dir='rtl'><h2>چت بات فارسی با یادگیری امن</h2></div>")
91
- prompt_input = gr.Textbox(label="متن خود را وارد کنید:", placeholder="اینجا بنویسید...", lines=3)
92
- output = gr.Textbox(label="پاسخ مدل:", lines=8)
93
- btn = gr.Button("ارسال")
94
- btn.click(chat, inputs=prompt_input, outputs=output)
95
 
96
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from torch.utils.data import Dataset
2
+ from transformers import BertTokenizer, BertForMaskedLM
3
  import torch
 
 
 
 
4
 
5
+ # بارگذاری توکنایزر و مدل
6
+ tokenizer = BertTokenizer.from_pretrained("HooshvareLab/bert-base-parsbert-uncased")
7
+ model = BertForMaskedLM.from_pretrained("HooshvareLab/bert-base-parsbert-uncased")
 
 
 
8
 
9
+ # اضافه کردن pad_token در صورت نیاز
10
+ if tokenizer.pad_token is None:
11
+ tokenizer.add_special_tokens({'pad_token': '[PAD]'})
12
+ model.resize_token_embeddings(len(tokenizer))
13
 
 
 
 
 
 
 
 
 
 
14
  class TextDataset(Dataset):
15
+ def __init__(self, file_path, tokenizer, max_length=128):
16
+ # خواندن خطوط غیرخالی از فایل
17
+ with open(file_path, 'r', encoding='utf-8') as f:
18
+ self.texts = [line.strip() for line in f if line.strip()]
19
+ self.tokenizer = tokenizer
20
+ self.max_length = max_length
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
+ def __len__(self):
23
+ return len(self.texts)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
 
25
+ def __getitem__(self, idx):
26
+ text = self.texts[idx]
27
+ encoding = self.tokenizer(
28
+ text,
29
+ truncation=True,
30
+ padding='max_length',
31
+ max_length=self.max_length,
32
+ return_tensors='pt'
33
+ )
34
+ input_ids = encoding['input_ids'].squeeze(0)
35
+ attention_mask = encoding['attention_mask'].squeeze(0)
36
+
37
+ # برای MaskedLM، label همان input_ids است، ولی padding با -100 نشانه‌گذاری می‌شود تا در loss حساب نشود
38
+ labels = input_ids.clone()
39
+ labels[input_ids == tokenizer.pad_token_id] = -100
40
+
41
+ return {
42
+ 'input_ids': input_ids,
43
+ 'attention_mask': attention_mask,
44
+ 'labels': labels
45
+ }
46
+
47
+ # نمونه‌سازی Dataset با فایل متنی آپلود شده
48
+ dataset = TextDataset("training.txt", tokenizer)
49
+
50
+ # بررسی دو نمونه
51
+ for i in range(2):
52
+ print(dataset[i])