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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -46
app.py CHANGED
@@ -2,6 +2,7 @@
2
  import os
3
  import gradio as gr
4
  import requests
 
5
  from io import BytesIO
6
  import matplotlib.pyplot as plt
7
  from datasets import load_dataset
@@ -16,12 +17,27 @@ 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 = 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()]
@@ -35,21 +51,9 @@ def create_iterator(dataset_name, configs, split):
35
  except Exception as e:
36
  print(f"⚠️ Σφάλμα φόρτωσης dataset για config {config}: {e}")
37
 
38
- def append_to_checkpoint(texts):
39
- """Αποθήκευση δεδομένων στο αρχείο checkpoint."""
40
- with open(CHECKPOINT_FILE, "a", encoding="utf-8") as f:
41
- for t in texts:
42
- f.write(t + "\n")
43
-
44
- def load_checkpoint():
45
- """Φόρτωση δεδομένων από το checkpoint αν υπάρχει."""
46
- if os.path.exists(CHECKPOINT_FILE):
47
- with open(CHECKPOINT_FILE, "r", encoding="utf-8") as f:
48
- return f.read().splitlines()
49
- return []
50
 
51
  def analyze_checkpoint(num_samples=1000):
52
- """Αναλύει τη γλωσσική κατανομή των δειγμάτων στο checkpoint."""
53
  if not os.path.exists(CHECKPOINT_FILE):
54
  return "Το αρχείο checkpoint δεν υπάρχει."
55
 
@@ -73,16 +77,20 @@ def analyze_checkpoint(num_samples=1000):
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
 
87
  dataset_iterator = create_iterator(dataset_name, configs, split)
88
  new_texts = []
@@ -91,15 +99,15 @@ def collect_samples(dataset_name, configs, split):
91
  if STOP_COLLECTION:
92
  progress_messages.append("⏹️ Η συλλογή σταμάτησε από το χρήστη.")
93
  break
94
-
95
  new_texts.append(text)
96
  total_processed += 1
97
 
98
- if len(new_texts) >= CHUNK_SIZE:
99
  append_to_checkpoint(new_texts)
100
  progress_messages.append(f"✅ Αποθηκεύτηκαν {total_processed} δείγματα στο checkpoint.")
101
  new_texts = []
102
-
103
  if total_processed >= MAX_SAMPLES:
104
  progress_messages.append("⚠️ Έφτασε το όριο δειγμάτων.")
105
  break
@@ -110,13 +118,17 @@ def collect_samples(dataset_name, configs, split):
110
 
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
 
@@ -134,54 +146,48 @@ def train_tokenizer_fn(dataset_name, configs, split, vocab_size, min_freq, test_
134
  decoded,
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")
160
  configs = gr.Textbox(value="20231101.el,20231101.en", label="Configs")
161
  split = gr.Dropdown(choices=["train"], value="train", label="Split")
 
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()
 
2
  import os
3
  import gradio as gr
4
  import requests
5
+ import time
6
  from io import BytesIO
7
  import matplotlib.pyplot as plt
8
  from datasets import load_dataset
 
17
  CHECKPOINT_FILE = "checkpoint.txt"
18
  TOKENIZER_DIR = "tokenizer_model"
19
  TOKENIZER_FILE = os.path.join(TOKENIZER_DIR, "tokenizer.json")
20
+ MAX_SAMPLES = 3000000 # Όριο δειγμάτων
 
21
 
22
  # Παγκόσμια μεταβλητή ελέγχου συλλογής
23
  STOP_COLLECTION = False
24
 
25
+
26
+ def load_checkpoint():
27
+ """Φόρτωση δεδομένων από το checkpoint αν υπάρχει."""
28
+ if os.path.exists(CHECKPOINT_FILE):
29
+ with open(CHECKPOINT_FILE, "r", encoding="utf-8") as f:
30
+ return f.read().splitlines()
31
+ return []
32
+
33
+
34
+ def append_to_checkpoint(texts):
35
+ """Αποθήκευση δεδομένων στο αρχείο checkpoint."""
36
+ with open(CHECKPOINT_FILE, "a", encoding="utf-8") as f:
37
+ for t in texts:
38
+ f.write(t + "\n")
39
+
40
+
41
  def create_iterator(dataset_name, configs, split):
42
  """Φορτώνει το dataset και αποδίδει τα κείμενα ως iterator."""
43
  configs_list = [c.strip() for c in configs.split(",") if c.strip()]
 
51
  except Exception as e:
52
  print(f"⚠️ Σφάλμα φόρτωσης dataset για config {config}: {e}")
53
 
 
 
 
 
 
 
 
 
 
 
 
 
54
 
55
  def analyze_checkpoint(num_samples=1000):
56
+ """Αναλύει τα πρώτα num_samples δείγματα από το checkpoint και επιστρέφει το ποσοστό γλωσσών."""
57
  if not os.path.exists(CHECKPOINT_FILE):
58
  return "Το αρχείο checkpoint δεν υπάρχει."
59
 
 
77
 
78
  report = "📊 Αποτελέσματα Ανάλυσης:\n"
79
  for lang, count in language_counts.items():
80
+ report += f" - {lang}: {count / total * 100:.2f}%\n"
81
 
82
  return report
83
 
84
+
85
+ def collect_samples(dataset_name, configs, split, chunk_size):
86
+ """
87
+ Ξεκινά τη συλλογή δειγμάτων από το dataset μέχρι να φτάσει το MAX_SAMPLES
88
+ ή μέχρι να ζητηθεί διακοπή (STOP_COLLECTION).
89
+ """
90
  global STOP_COLLECTION
91
+ STOP_COLLECTION = False # Βεβαιωνόμαστε ότι η συλλογή ξεκινάει κανονικά
92
  total_processed = len(load_checkpoint())
93
+ progress_messages = [f"📌 Ξεκινά η συλλογή... Υπάρχουν ήδη {total_processed} δείγματα στο checkpoint."]
94
 
95
  dataset_iterator = create_iterator(dataset_name, configs, split)
96
  new_texts = []
 
99
  if STOP_COLLECTION:
100
  progress_messages.append("⏹️ Η συλλογή σταμάτησε από το χρήστη.")
101
  break
102
+
103
  new_texts.append(text)
104
  total_processed += 1
105
 
106
+ if len(new_texts) >= chunk_size:
107
  append_to_checkpoint(new_texts)
108
  progress_messages.append(f"✅ Αποθηκεύτηκαν {total_processed} δείγματα στο checkpoint.")
109
  new_texts = []
110
+
111
  if total_processed >= MAX_SAMPLES:
112
  progress_messages.append("⚠️ Έφτασε το όριο δειγμάτων.")
113
  break
 
118
 
119
  return "\n".join(progress_messages)
120
 
121
+
122
  def train_tokenizer_fn(dataset_name, configs, split, vocab_size, min_freq, test_text):
123
+ """Εκπαιδεύει τον tokenizer χρησιμοποιώντας τα δεδομένα του checkpoint."""
124
+ print("🚀 Ξεκινά η εκπαίδευση...")
125
  all_texts = load_checkpoint()
126
  tokenizer = train_tokenizer(all_texts, vocab_size, min_freq, TOKENIZER_DIR)
127
 
128
+ # Φόρτωση εκπαιδευμένου tokenizer
129
  trained_tokenizer = Tokenizer.from_file(TOKENIZER_FILE)
130
+
131
+ # Δοκιμή
132
  encoded = trained_tokenizer.encode(test_text)
133
  decoded = trained_tokenizer.decode(encoded.ids)
134
 
 
146
  decoded,
147
  img_buffer.getvalue())
148
 
 
 
 
149
 
150
  def stop_collection():
151
+ """Σταματά τη συλλογή δειγμάτων."""
152
  global STOP_COLLECTION
153
  STOP_COLLECTION = True
154
  return "⏹️ Η συλλογή σταμάτησε από το χρήστη."
155
 
156
+
157
  def restart_collection():
158
+ """Διαγράφει το checkpoint και επανεκκινεί τη συλλογή."""
159
  global STOP_COLLECTION
160
  STOP_COLLECTION = False
161
  if os.path.exists(CHECKPOINT_FILE):
162
  os.remove(CHECKPOINT_FILE)
163
  return "🔄 Το checkpoint διαγράφηκε. Μπορείς να ξεκινήσεις νέα συλλογή."
164
 
165
+
166
  # Gradio Interface
167
  with gr.Blocks() as demo:
168
+ gr.Markdown("## Wikipedia Tokenizer Trainer with Logs & Control")
169
 
170
  with gr.Row():
171
  with gr.Column():
172
  dataset_name = gr.Textbox(value="wikimedia/wikipedia", label="Dataset Name")
173
  configs = gr.Textbox(value="20231101.el,20231101.en", label="Configs")
174
  split = gr.Dropdown(choices=["train"], value="train", label="Split")
175
+ chunk_size = gr.Slider(500, 10000, value=5000, label="Chunk Size")
176
  vocab_size = gr.Slider(20000, 100000, value=50000, label="Vocabulary Size")
177
  min_freq = gr.Slider(1, 100, value=3, label="Minimum Frequency")
178
  test_text = gr.Textbox(value="Η Ακρόπολη είναι σύμβολο της αρχαίας Ελλάδας.", label="Test Text")
 
179
  start_btn = gr.Button("Start Collection")
180
  stop_btn = gr.Button("Stop Collection")
 
181
  restart_btn = gr.Button("Restart Collection")
182
+ analyze_btn = gr.Button("Analyze Samples")
183
  train_btn = gr.Button("Train Tokenizer")
184
+
185
+ progress = gr.Textbox(label="Progress", interactive=False, lines=10)
186
+
187
+ start_btn.click(collect_samples, [dataset_name, configs, split, chunk_size], progress)
188
+ stop_btn.click(stop_collection, [], progress)
189
+ restart_btn.click(restart_collection, [], progress)
190
+ analyze_btn.click(analyze_checkpoint, [], progress)
191
+ train_btn.click(train_tokenizer_fn, [dataset_name, configs, split, vocab_size, min_freq, test_text], [progress])
 
 
 
 
 
 
 
192
 
193
  demo.launch()