tymbos commited on
Commit
af09211
·
verified ·
1 Parent(s): d6a5933

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +24 -76
app.py CHANGED
@@ -16,34 +16,12 @@ DetectorFactory.seed = 0
16
  CHECKPOINT_FILE = "checkpoint.txt"
17
  TOKENIZER_DIR = "tokenizer_model"
18
  TOKENIZER_FILE = os.path.join(TOKENIZER_DIR, "tokenizer.json")
19
- CHUNK_SIZE = 1000 # Μέγεθος batch για checkpoint
20
- MAX_SAMPLES = 3000000 # Όριο δειγμάτων (προσαρμόστε όπως χρειάζεται)
21
 
22
  # Παγκόσμια μεταβλητή ελέγχου συλλογής
23
  STOP_COLLECTION = False
24
 
25
- def fetch_splits(dataset_name):
26
- """Ανάκτηση των splits του dataset από το Hugging Face."""
27
- try:
28
- response = requests.get(f"https://datasets-server.huggingface.co/splits?dataset={dataset_name}", timeout=10)
29
- response.raise_for_status()
30
- data = response.json()
31
-
32
- splits_info = {}
33
- for split in data['splits']:
34
- config = split['config']
35
- split_name = split['split']
36
- if config not in splits_info:
37
- splits_info[config] = []
38
- splits_info[config].append(split_name)
39
-
40
- return {
41
- "splits": splits_info,
42
- "viewer_template": f"https://huggingface.co/datasets/{dataset_name}/embed/viewer/{{config}}/{{split}}"
43
- }
44
- except Exception as e:
45
- raise gr.Error(f"Σφάλμα κατά την ανάκτηση των splits: {str(e)}")
46
-
47
  def create_iterator(dataset_name, configs, split):
48
  """Φορτώνει το dataset και αποδίδει τα κείμενα ως iterator."""
49
  configs_list = [c.strip() for c in configs.split(",") if c.strip()]
@@ -71,9 +49,7 @@ def load_checkpoint():
71
  return []
72
 
73
  def analyze_checkpoint(num_samples=1000):
74
- """
75
- Διαβάζει τα πρώτα num_samples δείγματα από το checkpoint και επιστρέφει το ποσοστό γλωσσών.
76
- """
77
  if not os.path.exists(CHECKPOINT_FILE):
78
  return "Το αρχείο checkpoint δεν υπάρχει."
79
 
@@ -89,25 +65,22 @@ def analyze_checkpoint(num_samples=1000):
89
  lang = detect(line)
90
  language_counts[lang] = language_counts.get(lang, 0) + 1
91
  total += 1
92
- except Exception as e:
93
  continue
94
 
95
  if total == 0:
96
  return "Δεν βρέθηκαν έγκυρα δείγματα για ανάλυση."
97
 
98
- report = "Αποτελέσματα Ανάλυσης:\n"
99
  for lang, count in language_counts.items():
100
- report += f"Γλώσσα {lang}: {count/total*100:.2f}%\n"
101
 
102
  return report
103
 
104
  def collect_samples(dataset_name, configs, split):
105
- """
106
- Ξεκινά τη συλλογή δειγμάτων από το dataset μέχρι να φτάσει το MAX_SAMPLES
107
- ή μέχρι να ζητηθεί διακοπή (STOP_COLLECTION).
108
- """
109
  global STOP_COLLECTION
110
- STOP_COLLECTION = False # Βεβαιωνόμαστε ότι η συλλογή ξεκινάει ανενεργή τη διακοπή
111
  total_processed = len(load_checkpoint())
112
  progress_messages = [f"📌 Υπάρχουν ήδη {total_processed} δείγματα στο checkpoint."]
113
 
@@ -116,7 +89,7 @@ def collect_samples(dataset_name, configs, split):
116
 
117
  for text in dataset_iterator:
118
  if STOP_COLLECTION:
119
- progress_messages.append("⏹️ Η συλλογή διακόπηκε από το χρήστη.")
120
  break
121
 
122
  new_texts.append(text)
@@ -138,17 +111,12 @@ def collect_samples(dataset_name, configs, split):
138
  return "\n".join(progress_messages)
139
 
140
  def train_tokenizer_fn(dataset_name, configs, split, vocab_size, min_freq, test_text):
141
- """
142
- Εκπαιδεύει τον tokenizer χρησιμοποιώντας τα δείγματα που έχουν συλλεχθεί στο checkpoint.
143
- """
144
- print("🚀 Ξεκινά η εκπαίδευση του tokenizer με τα δεδομένα του checkpoint...")
145
  all_texts = load_checkpoint()
146
  tokenizer = train_tokenizer(all_texts, vocab_size, min_freq, TOKENIZER_DIR)
147
 
148
- # Φόρτωση εκπαιδευμένου tokenizer
149
  trained_tokenizer = Tokenizer.from_file(TOKENIZER_FILE)
150
-
151
- # Δοκιμή
152
  encoded = trained_tokenizer.encode(test_text)
153
  decoded = trained_tokenizer.decode(encoded.ids)
154
 
@@ -167,33 +135,25 @@ def train_tokenizer_fn(dataset_name, configs, split, vocab_size, min_freq, test_
167
  img_buffer.getvalue())
168
 
169
  # Callbacks κουμπιών
170
-
171
  def start_collection(dataset_name, configs, split):
172
- """Ξεκινά τη συλλογή δειγμάτων (ή επανεκκινεί τη συλλογή αν έχει γίνει restart)."""
173
- msg = collect_samples(dataset_name, configs, split)
174
- return msg
175
 
176
  def stop_collection():
177
- """Θέτει το flag για διακοπή της συλλογής δειγμάτων."""
178
  global STOP_COLLECTION
179
  STOP_COLLECTION = True
180
- return "Η συλλογή σταμάτησε από το χρήστη."
181
 
182
  def restart_collection():
183
- """
184
- Επαναφέρει τη συλλογή διαγράφοντας το checkpoint και
185
- επαναφέροντας το flag ώστε να ξεκινήσει νέα συλλογή.
186
- """
187
  global STOP_COLLECTION
188
  STOP_COLLECTION = False
189
  if os.path.exists(CHECKPOINT_FILE):
190
  os.remove(CHECKPOINT_FILE)
191
- return "Το checkpoint διαγράφτηκε. Μπορείς να ξεκινήσεις νέα συλλογή."
192
 
193
  # Gradio Interface
194
  with gr.Blocks() as demo:
195
- gr.Markdown("## Wikipedia Tokenizer Trainer with Collection, Analysis & Training")
196
-
197
  with gr.Row():
198
  with gr.Column():
199
  dataset_name = gr.Textbox(value="wikimedia/wikipedia", label="Dataset Name")
@@ -202,38 +162,26 @@ with gr.Blocks() as demo:
202
  vocab_size = gr.Slider(20000, 100000, value=50000, label="Vocabulary Size")
203
  min_freq = gr.Slider(1, 100, value=3, label="Minimum Frequency")
204
  test_text = gr.Textbox(value="Η Ακρόπολη είναι σύμβολο της αρχαίας Ελλάδας.", label="Test Text")
 
205
  start_btn = gr.Button("Start Collection")
206
  stop_btn = gr.Button("Stop Collection")
207
  analyze_btn = gr.Button("Analyze Samples")
208
  restart_btn = gr.Button("Restart Collection")
209
  train_btn = gr.Button("Train Tokenizer")
 
210
  with gr.Column():
211
  progress = gr.Textbox(label="Progress", interactive=False, lines=10)
212
  results_text = gr.Textbox(label="Test Decoded Text", interactive=False)
213
  results_plot = gr.Image(label="Token Length Distribution")
214
- # Έλεγχος ύπαρξης του tokenizer για download
215
  initial_file_value = TOKENIZER_FILE if os.path.exists(TOKENIZER_FILE) else None
216
  download_button = gr.File(label="Download Tokenizer", value=initial_file_value)
217
 
218
  # Συνδέουμε τα κουμπιά με τις συναρτήσεις
219
- start_btn.click(fn=start_collection,
220
- inputs=[dataset_name, configs, split],
221
- outputs=progress)
222
-
223
- stop_btn.click(fn=stop_collection,
224
- inputs=[],
225
- outputs=progress)
226
-
227
- analyze_btn.click(fn=lambda: analyze_checkpoint(1000),
228
- inputs=[],
229
- outputs=progress)
230
-
231
- restart_btn.click(fn=restart_collection,
232
- inputs=[],
233
- outputs=progress)
234
-
235
- train_btn.click(fn=train_tokenizer_fn,
236
- inputs=[dataset_name, configs, split, vocab_size, min_freq, test_text],
237
- outputs=[progress, results_text, results_plot])
238
 
239
  demo.launch()
 
16
  CHECKPOINT_FILE = "checkpoint.txt"
17
  TOKENIZER_DIR = "tokenizer_model"
18
  TOKENIZER_FILE = os.path.join(TOKENIZER_DIR, "tokenizer.json")
19
+ CHUNK_SIZE = 50000 # Μέγεθος batch για checkpoint
20
+ MAX_SAMPLES = 50000000 # Όριο δειγμάτων (προσαρμόστε όπως χρειάζεται)
21
 
22
  # Παγκόσμια μεταβλητή ελέγχου συλλογής
23
  STOP_COLLECTION = False
24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  def create_iterator(dataset_name, configs, split):
26
  """Φορτώνει το dataset και αποδίδει τα κείμενα ως iterator."""
27
  configs_list = [c.strip() for c in configs.split(",") if c.strip()]
 
49
  return []
50
 
51
  def analyze_checkpoint(num_samples=1000):
52
+ """Αναλύει τη γλωσσική κατανομή των δειγμάτων στο checkpoint."""
 
 
53
  if not os.path.exists(CHECKPOINT_FILE):
54
  return "Το αρχείο checkpoint δεν υπάρχει."
55
 
 
65
  lang = detect(line)
66
  language_counts[lang] = language_counts.get(lang, 0) + 1
67
  total += 1
68
+ except Exception:
69
  continue
70
 
71
  if total == 0:
72
  return "Δεν βρέθηκαν έγκυρα δείγματα για ανάλυση."
73
 
74
+ report = "📊 Αποτελέσματα Ανάλυσης:\n"
75
  for lang, count in language_counts.items():
76
+ report += f"Γλώσσα {lang}: {count/total*100:.2f}%\n"
77
 
78
  return report
79
 
80
  def collect_samples(dataset_name, configs, split):
81
+ """Ξεκινά τη συλλογή δειγμάτων, εκτός αν ζητηθεί διακοπή."""
 
 
 
82
  global STOP_COLLECTION
83
+ STOP_COLLECTION = False # Επανεκκίνηση της συλλογής
84
  total_processed = len(load_checkpoint())
85
  progress_messages = [f"📌 Υπάρχουν ήδη {total_processed} δείγματα στο checkpoint."]
86
 
 
89
 
90
  for text in dataset_iterator:
91
  if STOP_COLLECTION:
92
+ progress_messages.append("⏹️ Η συλλογή σταμάτησε από το χρήστη.")
93
  break
94
 
95
  new_texts.append(text)
 
111
  return "\n".join(progress_messages)
112
 
113
  def train_tokenizer_fn(dataset_name, configs, split, vocab_size, min_freq, test_text):
114
+ """Εκπαιδεύει τον tokenizer με τα αποθηκευμένα δείγματα."""
115
+ print("🚀 Ξεκινά η εκπαίδευση του tokenizer...")
 
 
116
  all_texts = load_checkpoint()
117
  tokenizer = train_tokenizer(all_texts, vocab_size, min_freq, TOKENIZER_DIR)
118
 
 
119
  trained_tokenizer = Tokenizer.from_file(TOKENIZER_FILE)
 
 
120
  encoded = trained_tokenizer.encode(test_text)
121
  decoded = trained_tokenizer.decode(encoded.ids)
122
 
 
135
  img_buffer.getvalue())
136
 
137
  # Callbacks κουμπιών
 
138
  def start_collection(dataset_name, configs, split):
139
+ return collect_samples(dataset_name, configs, split)
 
 
140
 
141
  def stop_collection():
 
142
  global STOP_COLLECTION
143
  STOP_COLLECTION = True
144
+ return "⏹️ Η συλλογή σταμάτησε από το χρήστη."
145
 
146
  def restart_collection():
 
 
 
 
147
  global STOP_COLLECTION
148
  STOP_COLLECTION = False
149
  if os.path.exists(CHECKPOINT_FILE):
150
  os.remove(CHECKPOINT_FILE)
151
+ return "🔄 Το checkpoint διαγράφηκε. Μπορείς να ξεκινήσεις νέα συλλογή."
152
 
153
  # Gradio Interface
154
  with gr.Blocks() as demo:
155
+ gr.Markdown("## Wikipedia Tokenizer Trainer")
156
+
157
  with gr.Row():
158
  with gr.Column():
159
  dataset_name = gr.Textbox(value="wikimedia/wikipedia", label="Dataset Name")
 
162
  vocab_size = gr.Slider(20000, 100000, value=50000, label="Vocabulary Size")
163
  min_freq = gr.Slider(1, 100, value=3, label="Minimum Frequency")
164
  test_text = gr.Textbox(value="Η Ακρόπολη είναι σύμβολο της αρχαίας Ελλάδας.", label="Test Text")
165
+
166
  start_btn = gr.Button("Start Collection")
167
  stop_btn = gr.Button("Stop Collection")
168
  analyze_btn = gr.Button("Analyze Samples")
169
  restart_btn = gr.Button("Restart Collection")
170
  train_btn = gr.Button("Train Tokenizer")
171
+
172
  with gr.Column():
173
  progress = gr.Textbox(label="Progress", interactive=False, lines=10)
174
  results_text = gr.Textbox(label="Test Decoded Text", interactive=False)
175
  results_plot = gr.Image(label="Token Length Distribution")
176
+
177
  initial_file_value = TOKENIZER_FILE if os.path.exists(TOKENIZER_FILE) else None
178
  download_button = gr.File(label="Download Tokenizer", value=initial_file_value)
179
 
180
  # Συνδέουμε τα κουμπιά με τις συναρτήσεις
181
+ start_btn.click(fn=start_collection, inputs=[dataset_name, configs, split], outputs=progress)
182
+ stop_btn.click(fn=stop_collection, inputs=[], outputs=progress)
183
+ analyze_btn.click(fn=lambda: analyze_checkpoint(1000), inputs=[], outputs=progress)
184
+ restart_btn.click(fn=restart_collection, inputs=[], outputs=progress)
185
+ train_btn.click(fn=train_tokenizer_fn, inputs=[dataset_name, configs, split, vocab_size, min_freq, test_text], outputs=[progress, results_text, results_plot])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
 
187
  demo.launch()