melikegks commited on
Commit
e672d7b
·
verified ·
1 Parent(s): 134375c

CPU optimizasyonu: thread sayısı, girdiye bağlı token sınırı, ısınma, süre göstergesi

Browse files
Files changed (1) hide show
  1. app.py +37 -6
app.py CHANGED
@@ -5,7 +5,9 @@ Model uçtan uca çalışır: metni alır, maskelenmiş metni döndürür.
5
  ve kullanıcıya ayrıca gösterilir — ham model davranışı gizlenmez.
6
  """
7
 
 
8
  import re
 
9
 
10
  import gradio as gr
11
  import torch
@@ -49,6 +51,9 @@ TALIMATLAR = {
49
  "Serbest (aşağıya yaz)": "",
50
  }
51
 
 
 
 
52
  print("Model yükleniyor…")
53
  tokenizer = AutoTokenizer.from_pretrained(MODEL_ADI)
54
  model = AutoModelForCausalLM.from_pretrained(
@@ -57,11 +62,13 @@ model = AutoModelForCausalLM.from_pretrained(
57
  device_map="auto",
58
  ).eval()
59
  IM_END_ID = tokenizer.convert_tokens_to_ids(IM_END)
60
- print("Hazır. Cihaz:", next(model.parameters()).device)
 
61
 
62
 
63
  @torch.inference_mode()
64
  def maskele(metin, talimat):
 
65
  mesajlar = [
66
  {"role": "system", "content": talimat},
67
  {"role": "user", "content": metin},
@@ -71,16 +78,27 @@ def maskele(metin, talimat):
71
  enable_thinking=False,
72
  )
73
  girdi = tokenizer(prompt, return_tensors="pt",
74
- add_special_tokens=False).to(model.device)
 
 
 
 
 
 
 
 
75
  cikti = model.generate(
76
  **girdi,
77
- max_new_tokens=320,
78
  do_sample=False, # maskeleme belirlenimci olmalı
79
  eos_token_id=IM_END_ID,
80
  pad_token_id=tokenizer.pad_token_id,
 
81
  )
82
- yeni = cikti[0, girdi["input_ids"].shape[1]:]
83
- return tokenizer.decode(yeni, skip_special_tokens=True).strip()
 
 
84
 
85
 
86
  def calistir(metin, secim, serbest_talimat):
@@ -93,7 +111,7 @@ def calistir(metin, secim, serbest_talimat):
93
  if not talimat:
94
  talimat = TALIMATLAR["Tam maskeleme"]
95
 
96
- cikti = maskele(metin, talimat)
97
 
98
  etiketler = ETIKET_RE.findall(cikti)
99
  uydurma = sorted({e for e in etiketler if e not in GECERLI_ETIKETLER})
@@ -106,6 +124,7 @@ def calistir(metin, secim, serbest_talimat):
106
  sayim[e] = sayim.get(e, 0) + 1
107
  ozet = "Maskelenen: " + ", ".join(
108
  f"{e}×{n}" if n > 1 else e for e, n in sorted(sayim.items()))
 
109
 
110
  if uydurma:
111
  uyari = (
@@ -121,6 +140,14 @@ def calistir(metin, secim, serbest_talimat):
121
  return cikti, ozet, uyari
122
 
123
 
 
 
 
 
 
 
 
 
124
  ORNEKLER = [
125
  ["müşteri Ahmet Yıldız 0542 321 45 67 numarasından aradı, "
126
  "iade hesabı TR12 0001 2000 0034 5678 9012 34", "Tam maskeleme", ""],
@@ -149,6 +176,10 @@ altında farklı maskelenir.
149
 
150
  Model [melikegks/turkish-pii-guard-0.8b](https://huggingface.co/melikegks/turkish-pii-guard-0.8b)
151
 
 
 
 
 
152
  **Not:** Buraya gerçek kişisel veri girme. Değerlendirme tamamen sentetik veriyle
153
  yapılmıştır; gerçek metindeki performans ölçülmemiştir.
154
  """
 
5
  ve kullanıcıya ayrıca gösterilir — ham model davranışı gizlenmez.
6
  """
7
 
8
+ import os
9
  import re
10
+ import time
11
 
12
  import gradio as gr
13
  import torch
 
51
  "Serbest (aşağıya yaz)": "",
52
  }
53
 
54
+ # cpu-basic'te varsayılan thread sayısı düşük kalabiliyor.
55
+ torch.set_num_threads(os.cpu_count() or 2)
56
+
57
  print("Model yükleniyor…")
58
  tokenizer = AutoTokenizer.from_pretrained(MODEL_ADI)
59
  model = AutoModelForCausalLM.from_pretrained(
 
62
  device_map="auto",
63
  ).eval()
64
  IM_END_ID = tokenizer.convert_tokens_to_ids(IM_END)
65
+ CIHAZ = next(model.parameters()).device
66
+ print("Cihaz:", CIHAZ, "· thread:", torch.get_num_threads())
67
 
68
 
69
  @torch.inference_mode()
70
  def maskele(metin, talimat):
71
+ """Maskelenmiş metni ve geçen süreyi döndürür."""
72
  mesajlar = [
73
  {"role": "system", "content": talimat},
74
  {"role": "user", "content": metin},
 
78
  enable_thinking=False,
79
  )
80
  girdi = tokenizer(prompt, return_tensors="pt",
81
+ add_special_tokens=False).to(CIHAZ)
82
+
83
+ # Çıktı girdiyle yaklaşık aynı uzunlukta: maskeleme metni yeniden yazmaz,
84
+ # yalnızca bazı parçaları etiketle değiştirir. Sabit 320 yerine girdiye
85
+ # bağlı sınır, model <|im_end|> üretmezse boşa dönmeyi engeller.
86
+ girdi_uzunlugu = girdi["input_ids"].shape[1]
87
+ sinir = min(256, max(48, girdi_uzunlugu + 24))
88
+
89
+ baslangic = time.time()
90
  cikti = model.generate(
91
  **girdi,
92
+ max_new_tokens=sinir,
93
  do_sample=False, # maskeleme belirlenimci olmalı
94
  eos_token_id=IM_END_ID,
95
  pad_token_id=tokenizer.pad_token_id,
96
+ use_cache=True,
97
  )
98
+ sure = time.time() - baslangic
99
+
100
+ yeni = cikti[0, girdi_uzunlugu:]
101
+ return tokenizer.decode(yeni, skip_special_tokens=True).strip(), sure
102
 
103
 
104
  def calistir(metin, secim, serbest_talimat):
 
111
  if not talimat:
112
  talimat = TALIMATLAR["Tam maskeleme"]
113
 
114
+ cikti, sure = maskele(metin, talimat)
115
 
116
  etiketler = ETIKET_RE.findall(cikti)
117
  uydurma = sorted({e for e in etiketler if e not in GECERLI_ETIKETLER})
 
124
  sayim[e] = sayim.get(e, 0) + 1
125
  ozet = "Maskelenen: " + ", ".join(
126
  f"{e}×{n}" if n > 1 else e for e, n in sorted(sayim.items()))
127
+ ozet += f" · {sure:.1f} sn"
128
 
129
  if uydurma:
130
  uyari = (
 
140
  return cikti, ozet, uyari
141
 
142
 
143
+ # İlk gerçek istek, lazy başlatma yüzünden ekstra yavaş oluyor.
144
+ # Başlangıçta kısa bir üretim yaparak o maliyeti kullanıcıdan alıyoruz.
145
+ print("Isınma…")
146
+ _t = time.time()
147
+ maskele("tel 0532 111 22 33", TALIMATLAR["Tam maskeleme"])
148
+ print(f"Isınma bitti: {time.time() - _t:.1f} sn")
149
+
150
+
151
  ORNEKLER = [
152
  ["müşteri Ahmet Yıldız 0542 321 45 67 numarasından aradı, "
153
  "iade hesabı TR12 0001 2000 0034 5678 9012 34", "Tam maskeleme", ""],
 
176
 
177
  Model [melikegks/turkish-pii-guard-0.8b](https://huggingface.co/melikegks/turkish-pii-guard-0.8b)
178
 
179
+ ⏱️ Bu demo ücretsiz CPU'da çalışıyor; bir maskeleme **15-30 saniye** sürer.
180
+ Model 0.8B parametreli ve her token için tüm ağırlıkları okuması gerekiyor —
181
+ GPU'da aynı işlem yarım saniyeden kısa.
182
+
183
  **Not:** Buraya gerçek kişisel veri girme. Değerlendirme tamamen sentetik veriyle
184
  yapılmıştır; gerçek metindeki performans ölçülmemiştir.
185
  """