buraktrk commited on
Commit
c35e733
·
verified ·
1 Parent(s): ab701df

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +54 -45
app.py CHANGED
@@ -3,6 +3,7 @@ from sklearn.model_selection import train_test_split, GridSearchCV
3
  from sklearn.preprocessing import MinMaxScaler, LabelEncoder
4
  from sklearn.metrics import accuracy_score
5
  from concrete.ml.sklearn import XGBClassifier as ConcreteXGBClassifier
 
6
 
7
 
8
  # Örnek dosyalar
@@ -15,12 +16,17 @@ EXAMPLE_XLSX = [
15
  ]
16
 
17
 
18
- # Global tanımlar
19
- enc_input = None
20
- enc_output = None
21
- fhe_model = None
 
 
22
 
23
 
 
 
 
24
  SELECTED_FEATS = [
25
  "Cari Oran",
26
  "Dönen Varlıklar / Aktif (%)",
@@ -178,8 +184,10 @@ scaler_sel = MinMaxScaler().fit(X_tr[COLS])
178
  Xtr_sel = scaler_sel.transform(X_tr[COLS])
179
  final_model = ConcreteXGBClassifier(n_bits=8, **best_params, random_state=42)
180
  final_model.fit(Xtr_sel, ytr_e)
181
- fhe_circuit = final_model.compile(Xtr_sel)
182
- keys = None
 
 
183
 
184
 
185
 
@@ -190,71 +198,72 @@ for i, col in enumerate(COLS, 1):
190
 
191
  # ------------------------ FONKSİYONLAR ------------------------
192
  def generate_keys():
193
- global fhe_circuit, keys
194
- print(" Model derleniyor...")
195
- fhe_circuit = final_model.compile(Xtr_sel)
196
- keys = fhe_circuit.keygen()
197
-
198
- if keys is None or keys.evaluation is None:
199
- raise gr.Error("Anahtar üretilemedi.")
200
-
201
- return keys.evaluation.serialize()[:120].decode() + "..."
202
-
203
 
204
 
205
  def encrypt_excel(file):
206
- global enc_input
207
- raw_df = pd.read_excel(file.name, header=None).set_index(0).T.reset_index(drop=True)
208
- raw_df.columns = raw_df.columns.str.strip()
209
- raw_df.rename(columns={"Desc": "Periyot"}, inplace=True)
 
 
 
210
 
211
- enriched = compute_ratios(raw_df)
212
  X_input = enriched[COLS].dropna()
213
  scaled = scaler_sel.transform(X_input)
214
-
215
- if keys is None or keys.evaluation is None:
216
- raise gr.Error("Anahtarlar hazır değil. Lütfen önce 'Anahtar Oluştur'a tıklayın.")
217
 
218
- enc_input = fhe_circuit.encrypt(scaled, keys.evaluation)
219
- return str(enc_input)[:150] + "..."
220
 
221
 
222
  def run_fhe():
223
- global enc_output
224
- import time
225
- if fhe_circuit is None or enc_input is None:
226
- raise gr.Error("Şifreli giriş veya circuit eksik.")
227
- start = time.time()
228
- enc_output = fhe_circuit.run(enc_input)
229
- return f"{time.time() - start:.2f}"
 
 
 
 
230
 
231
  def decrypt_result():
232
- if enc_output is None:
233
  raise gr.Error("Henüz tahmin yapılmadı.")
234
- y_pred = fhe_circuit.decrypt(enc_output, keys.decryption)
235
- return encoder.inverse_transform([y_pred])[0]
 
 
236
 
237
  # -------------------- Gradio UI -------------------- #
238
  with gr.Blocks(theme=gr.themes.Default(primary_hue="blue")) as demo:
239
  gr.Markdown("# Denetçi Görüşü Tahmin Uygulaması (FHE)")
240
 
241
  gr.Markdown("## 1. Anahtar Oluştur")
242
- key_btn = gr.Button("🔑 Anahtar Oluştur ve Server'a Gönder")
243
- key_out = gr.Textbox(label="Evaluation Key (görsel)")
244
  key_btn.click(generate_keys, outputs=key_out)
245
 
246
  gr.Markdown("## 2. Excel Yükle")
247
  file_in = gr.File(file_types=[".xlsx"], label="Excel Dosyası")
248
- encrypt_btn = gr.Button("🔐 Veriyi Şifrele ve Sun")
249
- enc_out = gr.Textbox(label="Şifreli Giriş")
250
  encrypt_btn.click(encrypt_excel, inputs=file_in, outputs=enc_out)
251
 
252
- gr.Markdown("## 3. Şifreli Tahmini Gerçekleştir")
253
- run_btn = gr.Button("🚀 FHE Tahmini Başlat")
254
- time_box = gr.Textbox(label="Süre (sn)")
255
- run_btn.click(run_fhe, outputs=time_box)
256
 
257
- gr.Markdown("## 4. Tahmini Deşifre Et")
258
  decrypt_btn = gr.Button("🔓 Tahmini Göster")
259
  result_box = gr.Textbox(label="Tahmin Edilen Görüş")
260
  decrypt_btn.click(decrypt_result, outputs=result_box)
 
3
  from sklearn.preprocessing import MinMaxScaler, LabelEncoder
4
  from sklearn.metrics import accuracy_score
5
  from concrete.ml.sklearn import XGBClassifier as ConcreteXGBClassifier
6
+ from concrete.ml.deployment import FHEModelDev, FHEModelClient, FHEModelServer
7
 
8
 
9
  # Örnek dosyalar
 
16
  ]
17
 
18
 
19
+ # Global değişkenler
20
+ client = None
21
+ server = None
22
+ encrypted_input = None
23
+ encrypted_output = None
24
+ COLS = []
25
 
26
 
27
+ fhe_dir = "fhe_model_artifacts"
28
+ key_dir = "client_keys"
29
+
30
  SELECTED_FEATS = [
31
  "Cari Oran",
32
  "Dönen Varlıklar / Aktif (%)",
 
184
  Xtr_sel = scaler_sel.transform(X_tr[COLS])
185
  final_model = ConcreteXGBClassifier(n_bits=8, **best_params, random_state=42)
186
  final_model.fit(Xtr_sel, ytr_e)
187
+ final_model.compile(Xtr_sel)
188
+
189
+ dev = FHEModelDev(path_dir=fhe_dir, model=final_model)
190
+ dev.save()
191
 
192
 
193
 
 
198
 
199
  # ------------------------ FONKSİYONLAR ------------------------
200
  def generate_keys():
201
+ global client
202
+ if not os.path.exists(key_dir):
203
+ os.makedirs(key_dir)
204
+ client = FHEModelClient(path_dir=fhe_dir, key_dir=key_dir)
205
+ serialized_eval_keys = client.get_serialized_evaluation_keys()
206
+ return str(serialized_eval_keys[:100]) + "..."
 
 
 
 
207
 
208
 
209
  def encrypt_excel(file):
210
+ global encrypted_input
211
+ if client is None:
212
+ raise gr.Error("Lütfen önce 'Anahtar Oluştur'a tıklayın.")
213
+
214
+ df = pd.read_excel(file.name, header=None).set_index(0).T.reset_index(drop=True)
215
+ df.columns = df.columns.str.strip()
216
+ df.rename(columns={"Desc": "Periyot"}, inplace=True)
217
 
218
+ enriched = compute_ratios(df)
219
  X_input = enriched[COLS].dropna()
220
  scaled = scaler_sel.transform(X_input)
 
 
 
221
 
222
+ encrypted_input = client.quantize_encrypt_serialize(scaled)
223
+ return str(encrypted_input[:120]) + "..."
224
 
225
 
226
  def run_fhe():
227
+ global server, encrypted_output
228
+ if encrypted_input is None:
229
+ raise gr.Error("Veri şifrelenmemiş.")
230
+
231
+ server = FHEModelServer(path_dir=fhe_dir)
232
+ server.load()
233
+
234
+ eval_keys = client.get_serialized_evaluation_keys()
235
+ encrypted_output = server.run(encrypted_input, eval_keys)
236
+ return "Tahmin tamamlandı."
237
+
238
 
239
  def decrypt_result():
240
+ if encrypted_output is None:
241
  raise gr.Error("Henüz tahmin yapılmadı.")
242
+ prediction = client.deserialize_decrypt_dequantize(encrypted_output)
243
+ return encoder.inverse_transform([int(prediction[0])])[0]
244
+
245
+
246
 
247
  # -------------------- Gradio UI -------------------- #
248
  with gr.Blocks(theme=gr.themes.Default(primary_hue="blue")) as demo:
249
  gr.Markdown("# Denetçi Görüşü Tahmin Uygulaması (FHE)")
250
 
251
  gr.Markdown("## 1. Anahtar Oluştur")
252
+ key_btn = gr.Button("🔑 Anahtar Oluştur")
253
+ key_out = gr.Textbox(label="Evaluation Key")
254
  key_btn.click(generate_keys, outputs=key_out)
255
 
256
  gr.Markdown("## 2. Excel Yükle")
257
  file_in = gr.File(file_types=[".xlsx"], label="Excel Dosyası")
258
+ encrypt_btn = gr.Button("🔐 Veriyi Şifrele")
259
+ enc_out = gr.Textbox(label="Şifreli Veri")
260
  encrypt_btn.click(encrypt_excel, inputs=file_in, outputs=enc_out)
261
 
262
+ gr.Markdown("## 3. Tahmini Gerçekleştir (Server)")
263
+ run_btn = gr.Button("🚀 Tahmini Başlat")
264
+ run_btn.click(run_fhe, outputs=gr.Textbox(label="Durum"))
 
265
 
266
+ gr.Markdown("## 4. Sonucu Deşifre Et")
267
  decrypt_btn = gr.Button("🔓 Tahmini Göster")
268
  result_box = gr.Textbox(label="Tahmin Edilen Görüş")
269
  decrypt_btn.click(decrypt_result, outputs=result_box)