Update app.py
Browse files
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 |
-
|
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 |
-
"""Αναλύει
|
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"
|
77 |
|
78 |
return report
|
79 |
|
80 |
-
|
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) >=
|
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("🚀 Ξεκινά η
|
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 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
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()
|