code5ecure commited on
Commit
3933200
·
verified ·
1 Parent(s): 11f0842

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +44 -34
app.py CHANGED
@@ -1,17 +1,14 @@
1
  import torch
2
- from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
3
- from datasets import load_dataset
4
  import numpy as np
5
- from flask import Flask, request, jsonify
6
  from opacus import PrivacyEngine
7
  from torch.utils.data import Dataset
8
 
9
- app = Flask(__name__)
10
-
11
  # Load ParsBERT model and tokenizer
12
  model_name = "HooshvareLab/bert-base-parsbert-uncased"
13
  tokenizer = AutoTokenizer.from_pretrained(model_name)
14
- model = AutoModelForCausalLM.from_pretrained(model_name)
15
 
16
  # Differential Privacy parameters
17
  epsilon = 1.0 # Privacy budget
@@ -25,7 +22,7 @@ conversation_history = []
25
  class ChatDataset(Dataset):
26
  def __init__(self, data):
27
  self.data = data
28
- self.encodings = tokenizer(data, truncation=True, padding=True, return_tensors="pt")
29
 
30
  def __len__(self):
31
  return len(self.data)
@@ -35,11 +32,12 @@ class ChatDataset(Dataset):
35
  item["labels"] = item["input_ids"].clone()
36
  return item
37
 
38
- # Load training data from Hugging Face
39
  def load_training_data():
40
  try:
41
  with open("training_data.txt", "r", encoding="utf-8") as file:
42
  texts = [line.strip() for line in file if line.strip()]
 
43
  return texts
44
  except FileNotFoundError:
45
  print("Error: training_data.txt not found in the root directory.")
@@ -51,14 +49,20 @@ def load_training_data():
51
  # Fine-tune model with differential privacy
52
  def train_model():
53
  texts = load_training_data()
 
 
 
 
54
  train_dataset = ChatDataset(texts)
55
 
56
  training_args = TrainingArguments(
57
  output_dir="./results",
58
  num_train_epochs=3,
59
- per_device_train_batch_size=8,
60
  save_steps=10_000,
61
  save_total_limit=2,
 
 
62
  )
63
 
64
  trainer = Trainer(
@@ -69,7 +73,7 @@ def train_model():
69
 
70
  # Add differential privacy
71
  privacy_engine = PrivacyEngine()
72
- model, optimizer, train_dataloader = privacy_engine.make_private(
73
  module=model,
74
  optimizer=trainer.optimizer,
75
  data_loader=trainer.get_train_dataloader(),
@@ -79,16 +83,18 @@ def train_model():
79
 
80
  trainer.optimizer = optimizer
81
  trainer.train_dataloader = train_dataloader
 
82
 
83
  trainer.train()
84
  model.save_pretrained("./fine_tuned_model")
85
  tokenizer.save_pretrained("./fine_tuned_model")
 
86
 
87
  def add_noise(tensor, sensitivity, epsilon, delta):
88
  """Add Laplace noise for differential privacy."""
89
  scale = sensitivity / epsilon
90
  noise = np.random.laplace(0, scale, tensor.shape)
91
- return tensor + torch.tensor(noise, dtype=tensor.dtype)
92
 
93
  def update_model(user_input, response):
94
  """Update conversation history."""
@@ -96,34 +102,38 @@ def update_model(user_input, response):
96
  conversation_history.append({"user": user_input, "bot": response})
97
  if len(conversation_history) > 100: # Limit history size
98
  conversation_history.pop(0)
99
- print(f"Learning from: {user_input} -> {response}")
100
 
101
- @app.route('/chat', methods=['POST'])
102
- def chat():
103
- data = request.json
104
- user_input = data.get('message', '')
105
-
106
  # Tokenize input
107
- inputs = tokenizer(user_input, return_tensors="pt", padding=True, truncation=True)
108
 
109
- # Generate response with model
110
  with torch.no_grad():
111
- outputs = model(**inputs)
112
- logits = outputs.logits
113
-
114
- # Apply differential privacy to logits
115
- noisy_logits = add_noise(logits, sensitivity, epsilon, delta)
116
-
117
- # Decode response
118
- response_ids = torch.argmax(noisy_logits, dim=-1)
119
- response = tokenizer.decode(response_ids[0], skip_special_tokens=True)
120
 
121
  # Update conversation history
122
- update_model(user_input, response)
123
 
124
- return jsonify({"response": response})
 
 
 
 
 
 
 
 
 
 
125
 
126
- if __name__ == '__main__':
127
- # Train the model on startup
128
- train_model()
129
- app.run(debug=True)
 
1
  import torch
2
+ from transformers import BertLMHeadModel, AutoTokenizer, TrainingArguments, Trainer
 
3
  import numpy as np
4
+ import gradio as gr
5
  from opacus import PrivacyEngine
6
  from torch.utils.data import Dataset
7
 
 
 
8
  # Load ParsBERT model and tokenizer
9
  model_name = "HooshvareLab/bert-base-parsbert-uncased"
10
  tokenizer = AutoTokenizer.from_pretrained(model_name)
11
+ model = BertLMHeadModel.from_pretrained(model_name, is_decoder=True)
12
 
13
  # Differential Privacy parameters
14
  epsilon = 1.0 # Privacy budget
 
22
  class ChatDataset(Dataset):
23
  def __init__(self, data):
24
  self.data = data
25
+ self.encodings = tokenizer(data, truncation=True, padding=True, max_length=128, return_tensors="pt")
26
 
27
  def __len__(self):
28
  return len(self.data)
 
32
  item["labels"] = item["input_ids"].clone()
33
  return item
34
 
35
+ # Load training data from training_data.txt in the root directory
36
  def load_training_data():
37
  try:
38
  with open("training_data.txt", "r", encoding="utf-8") as file:
39
  texts = [line.strip() for line in file if line.strip()]
40
+ print(f"Loaded {len(texts)} training examples from training_data.txt")
41
  return texts
42
  except FileNotFoundError:
43
  print("Error: training_data.txt not found in the root directory.")
 
49
  # Fine-tune model with differential privacy
50
  def train_model():
51
  texts = load_training_data()
52
+ if not texts:
53
+ print("No training data available. Skipping training.")
54
+ return
55
+
56
  train_dataset = ChatDataset(texts)
57
 
58
  training_args = TrainingArguments(
59
  output_dir="./results",
60
  num_train_epochs=3,
61
+ per_device_train_batch_size=4, # Reduced to avoid memory issues
62
  save_steps=10_000,
63
  save_total_limit=2,
64
+ no_cuda=True if not torch.cuda.is_available() else None, # CPU compatibility
65
+ logging_steps=100, # Log training progress
66
  )
67
 
68
  trainer = Trainer(
 
73
 
74
  # Add differential privacy
75
  privacy_engine = PrivacyEngine()
76
+ private_model, optimizer, train_dataloader = privacy_engine.make_private(
77
  module=model,
78
  optimizer=trainer.optimizer,
79
  data_loader=trainer.get_train_dataloader(),
 
83
 
84
  trainer.optimizer = optimizer
85
  trainer.train_dataloader = train_dataloader
86
+ trainer.model = private_model # Update trainer to use private model
87
 
88
  trainer.train()
89
  model.save_pretrained("./fine_tuned_model")
90
  tokenizer.save_pretrained("./fine_tuned_model")
91
+ print("Model training completed and saved to ./fine_tuned_model")
92
 
93
  def add_noise(tensor, sensitivity, epsilon, delta):
94
  """Add Laplace noise for differential privacy."""
95
  scale = sensitivity / epsilon
96
  noise = np.random.laplace(0, scale, tensor.shape)
97
+ return tensor + torch.tensor(noise, dtype=tensor.dtype, device=tensor.device)
98
 
99
  def update_model(user_input, response):
100
  """Update conversation history."""
 
102
  conversation_history.append({"user": user_input, "bot": response})
103
  if len(conversation_history) > 100: # Limit history size
104
  conversation_history.pop(0)
105
+ return f"Learning from: {user_input} -> {response}"
106
 
107
+ def chat(message, history):
 
 
 
 
108
  # Tokenize input
109
+ inputs = tokenizer(message, return_tensors="pt", padding=True, truncation=True, max_length=128).to(model.device)
110
 
111
+ # Generate response with model using beam search
112
  with torch.no_grad():
113
+ outputs = model.generate(
114
+ input_ids=inputs["input_ids"],
115
+ attention_mask=inputs["attention_mask"],
116
+ max_length=50,
117
+ num_beams=5,
118
+ no_repeat_ngram_size=2,
119
+ early_stopping=True,
120
+ )
121
+ response = tokenizer.decode(outputs[0], skip_special_tokens=True)
122
 
123
  # Update conversation history
124
+ update_model(message, response)
125
 
126
+ return response
127
+
128
+ # Train the model on startup
129
+ train_model()
130
+
131
+ # Gradio interface
132
+ iface = gr.ChatInterface(
133
+ fn=chat,
134
+ title="ParsBERT Chatbot with Differential Privacy",
135
+ description="Chat with a fine-tuned ParsBERT model using training_data.txt from the root directory."
136
+ )
137
 
138
+ if __name__ == "__main__":
139
+ iface.launch(server_name="0.0.0.0", server_port=7860)