tymbos commited on
Commit
1e3138f
·
verified ·
1 Parent(s): b1e98c8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +28 -48
app.py CHANGED
@@ -9,7 +9,8 @@ from datasets import load_dataset
9
  from train_tokenizer import train_tokenizer
10
  from tokenizers import Tokenizer
11
  from langdetect import detect, DetectorFactory
12
- from PIL import Image # Προσθήκη για σωστή διαχείριση εικόνας στο Gradio
 
13
 
14
  # Για επαναληψιμότητα στο langdetect
15
  DetectorFactory.seed = 0
@@ -23,6 +24,10 @@ MAX_SAMPLES = 3000000 # Όριο δειγμάτων
23
  # Παγκόσμια μεταβλητή ελέγχου συλλογής
24
  STOP_COLLECTION = False
25
 
 
 
 
 
26
 
27
  def load_checkpoint():
28
  """Φόρτωση δεδομένων από το checkpoint αν υπάρχει."""
@@ -53,107 +58,83 @@ def create_iterator(dataset_name, configs, split):
53
  print(f"⚠️ Σφάλμα φόρτωσης dataset για config {config}: {e}")
54
 
55
 
56
- def analyze_checkpoint(num_samples=1000):
57
- """Αναλύει τα πρώτα num_samples δείγματα από το checkpoint και επιστρέφει το ποσοστό γλωσσών."""
58
- if not os.path.exists(CHECKPOINT_FILE):
59
- return "Το αρχείο checkpoint δεν υπάρχει."
60
-
61
- with open(CHECKPOINT_FILE, "r", encoding="utf-8") as f:
62
- lines = f.read().splitlines()
63
-
64
- sample_lines = lines[:num_samples] if len(lines) >= num_samples else lines
65
-
66
- language_counts = {}
67
- total = 0
68
- for line in sample_lines:
69
- try:
70
- lang = detect(line)
71
- language_counts[lang] = language_counts.get(lang, 0) + 1
72
- total += 1
73
- except Exception:
74
- continue
75
-
76
- if total == 0:
77
- return "Δεν βρέθηκαν έγκυρα δείγματα για ανάλυση."
78
-
79
- report = "📊 Αποτελέσματα Ανάλυσης:\n"
80
- for lang, count in language_counts.items():
81
- report += f" - {lang}: {count / total * 100:.2f}%\n"
82
-
83
- return report
84
-
85
-
86
  def collect_samples(dataset_name, configs, split, chunk_size):
87
  """Ξεκινά τη συλλογή δειγμάτων από το dataset."""
88
  global STOP_COLLECTION
89
  STOP_COLLECTION = False
90
  total_processed = len(load_checkpoint())
91
- progress_messages = [f"📌 Ξεκινά η συλλογή... Υπάρχουν ήδη {total_processed} δείγματα στο checkpoint."]
92
-
 
 
93
  dataset_iterator = create_iterator(dataset_name, configs, split)
94
  new_texts = []
95
-
96
  for text in dataset_iterator:
97
  if STOP_COLLECTION:
98
  progress_messages.append("⏹️ Η συλλογή σταμάτησε από το χρήστη.")
 
99
  break
100
 
101
  new_texts.append(text)
102
  total_processed += 1
103
-
104
  if len(new_texts) >= chunk_size:
105
  append_to_checkpoint(new_texts)
106
  progress_messages.append(f"✅ Αποθηκεύτηκαν {total_processed} δείγματα στο checkpoint.")
 
107
  new_texts = []
108
 
109
  if total_processed >= MAX_SAMPLES:
110
  progress_messages.append("⚠️ Έφτασε το όριο δειγμάτων.")
 
111
  break
112
 
113
  if new_texts:
114
  append_to_checkpoint(new_texts)
115
  progress_messages.append(f"✅ Τελικό batch αποθηκεύτηκε ({total_processed} δείγματα).")
116
-
 
117
  return "\n".join(progress_messages)
118
 
119
 
120
  def train_tokenizer_fn(dataset_name, configs, split, vocab_size, min_freq, test_text):
121
  """Εκπαιδεύει τον tokenizer χρησιμοποιώντας τα δεδομένα του checkpoint."""
122
- print("🚀 Ξεκινά η εκπαίδευση...")
123
  all_texts = load_checkpoint()
124
  tokenizer = train_tokenizer(all_texts, vocab_size, min_freq, TOKENIZER_DIR)
125
 
126
  # Φόρτωση εκπαιδευμένου tokenizer
127
  trained_tokenizer = Tokenizer.from_file(TOKENIZER_FILE)
128
-
129
  # Δοκιμή
130
  encoded = trained_tokenizer.encode(test_text)
131
  decoded = trained_tokenizer.decode(encoded.ids)
132
-
133
  # Γράφημα κατανομής tokens
134
  token_lengths = [len(t) for t in encoded.tokens]
135
  fig = plt.figure()
136
  plt.hist(token_lengths, bins=20)
137
  plt.xlabel('Μήκος Token')
138
  plt.ylabel('Συχνότητα')
139
-
140
  # Αποθήκευση και μετατροπή εικόνας
141
  img_buffer = BytesIO()
142
  plt.savefig(img_buffer, format='png')
143
  plt.close()
144
 
145
  img_buffer.seek(0)
146
- img = Image.open(img_buffer) # Επιστροφή σωστής εικόνας
147
 
148
- return (f"✅ Εκπαίδευση ολοκληρώθηκε!\nΑποθηκεύτηκε στον φάκελο: {TOKENIZER_DIR}",
149
- decoded,
150
- img)
151
 
152
 
153
  def stop_collection():
154
  """Σταματά τη συλλογή δειγμάτων."""
155
  global STOP_COLLECTION
156
  STOP_COLLECTION = True
 
157
  return "⏹️ Η συλλογή σταμάτησε από το χρήστη."
158
 
159
 
@@ -163,7 +144,8 @@ def restart_collection():
163
  STOP_COLLECTION = False
164
  if os.path.exists(CHECKPOINT_FILE):
165
  os.remove(CHECKPOINT_FILE)
166
- return "🔄 Το checkpoint διαγράφηκε. Μπορείς να ξεκινήσεις νέα συλλογή."
 
167
 
168
 
169
  # Gradio Interface
@@ -175,14 +157,13 @@ with gr.Blocks() as demo:
175
  dataset_name = gr.Textbox(value="wikimedia/wikipedia", label="Dataset Name")
176
  configs = gr.Textbox(value="20231101.el,20231101.en", label="Configs")
177
  split = gr.Dropdown(choices=["train"], value="train", label="Split")
178
- chunk_size = gr.Slider(500, 50000, value=50000, label="Chunk Size")
179
  vocab_size = gr.Slider(20000, 100000, value=50000, label="Vocabulary Size")
180
  min_freq = gr.Slider(1, 100, value=3, label="Minimum Frequency")
181
  test_text = gr.Textbox(value="Η Ακρόπολη είναι σύμβολο της αρχαίας Ελλάδας.", label="Test Text")
182
  start_btn = gr.Button("Start Collection")
183
  stop_btn = gr.Button("Stop Collection")
184
  restart_btn = gr.Button("Restart Collection")
185
- analyze_btn = gr.Button("Analyze Samples")
186
  train_btn = gr.Button("Train Tokenizer")
187
 
188
  progress = gr.Textbox(label="Progress", interactive=False, lines=10)
@@ -192,7 +173,6 @@ with gr.Blocks() as demo:
192
  start_btn.click(collect_samples, [dataset_name, configs, split, chunk_size], progress)
193
  stop_btn.click(stop_collection, [], progress)
194
  restart_btn.click(restart_collection, [], progress)
195
- analyze_btn.click(analyze_checkpoint, [], progress)
196
  train_btn.click(train_tokenizer_fn, [dataset_name, configs, split, vocab_size, min_freq, test_text],
197
  [progress, decoded_text, token_distribution])
198
 
 
9
  from train_tokenizer import train_tokenizer
10
  from tokenizers import Tokenizer
11
  from langdetect import detect, DetectorFactory
12
+ from PIL import Image
13
+ from datetime import datetime
14
 
15
  # Για επαναληψιμότητα στο langdetect
16
  DetectorFactory.seed = 0
 
24
  # Παγκόσμια μεταβλητή ελέγχου συλλογής
25
  STOP_COLLECTION = False
26
 
27
+ # Καταγραφή εκκίνησης
28
+ startup_log = f"===== Application Startup at {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} =====\n"
29
+ print(startup_log)
30
+
31
 
32
  def load_checkpoint():
33
  """Φόρτωση δεδομένων από το checkpoint αν υπάρχει."""
 
58
  print(f"⚠️ Σφάλμα φόρτωσης dataset για config {config}: {e}")
59
 
60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  def collect_samples(dataset_name, configs, split, chunk_size):
62
  """Ξεκινά τη συλλογή δειγμάτων από το dataset."""
63
  global STOP_COLLECTION
64
  STOP_COLLECTION = False
65
  total_processed = len(load_checkpoint())
66
+ progress_messages = [f"🚀 Ξεκινά η συλλογή δεδομένων... Υπάρχουν ήδη {total_processed} δείγματα στο checkpoint."]
67
+
68
+ print(progress_messages[-1])
69
+
70
  dataset_iterator = create_iterator(dataset_name, configs, split)
71
  new_texts = []
72
+
73
  for text in dataset_iterator:
74
  if STOP_COLLECTION:
75
  progress_messages.append("⏹️ Η συλλογή σταμάτησε από το χρήστη.")
76
+ print(progress_messages[-1])
77
  break
78
 
79
  new_texts.append(text)
80
  total_processed += 1
81
+
82
  if len(new_texts) >= chunk_size:
83
  append_to_checkpoint(new_texts)
84
  progress_messages.append(f"✅ Αποθηκεύτηκαν {total_processed} δείγματα στο checkpoint.")
85
+ print(progress_messages[-1])
86
  new_texts = []
87
 
88
  if total_processed >= MAX_SAMPLES:
89
  progress_messages.append("⚠️ Έφτασε το όριο δειγμάτων.")
90
+ print(progress_messages[-1])
91
  break
92
 
93
  if new_texts:
94
  append_to_checkpoint(new_texts)
95
  progress_messages.append(f"✅ Τελικό batch αποθηκεύτηκε ({total_processed} δείγματα).")
96
+ print(progress_messages[-1])
97
+
98
  return "\n".join(progress_messages)
99
 
100
 
101
  def train_tokenizer_fn(dataset_name, configs, split, vocab_size, min_freq, test_text):
102
  """Εκπαιδεύει τον tokenizer χρησιμοποιώντας τα δεδομένα του checkpoint."""
103
+ print("🚀 Ξεκινά η διαδικασία εκπαίδευσης...")
104
  all_texts = load_checkpoint()
105
  tokenizer = train_tokenizer(all_texts, vocab_size, min_freq, TOKENIZER_DIR)
106
 
107
  # Φόρτωση εκπαιδευμένου tokenizer
108
  trained_tokenizer = Tokenizer.from_file(TOKENIZER_FILE)
109
+
110
  # Δοκιμή
111
  encoded = trained_tokenizer.encode(test_text)
112
  decoded = trained_tokenizer.decode(encoded.ids)
113
+
114
  # Γράφημα κατανομής tokens
115
  token_lengths = [len(t) for t in encoded.tokens]
116
  fig = plt.figure()
117
  plt.hist(token_lengths, bins=20)
118
  plt.xlabel('Μήκος Token')
119
  plt.ylabel('Συχνότητα')
120
+
121
  # Αποθήκευση και μετατροπή εικόνας
122
  img_buffer = BytesIO()
123
  plt.savefig(img_buffer, format='png')
124
  plt.close()
125
 
126
  img_buffer.seek(0)
127
+ img = Image.open(img_buffer)
128
 
129
+ print("✅ Εκπαίδευση ολοκληρώθηκε! Το tokenizer αποθηκεύτηκε στο tokenizer_model.")
130
+ return ("✅ Εκπαίδευση ολοκληρώθηκε!", decoded, img)
 
131
 
132
 
133
  def stop_collection():
134
  """Σταματά τη συλλογή δειγμάτων."""
135
  global STOP_COLLECTION
136
  STOP_COLLECTION = True
137
+ print("⏹️ Η συλλογή σταμάτησε από το χρήστη.")
138
  return "⏹️ Η συλλογή σταμάτησε από το χρήστη."
139
 
140
 
 
144
  STOP_COLLECTION = False
145
  if os.path.exists(CHECKPOINT_FILE):
146
  os.remove(CHECKPOINT_FILE)
147
+ print("🔄 Το checkpoint διαγράφηκε. Έτοιμο για νέα συλλογή.")
148
+ return "🔄 Το checkpoint διαγράφηκε. Έτοιμο για νέα συλλογή."
149
 
150
 
151
  # Gradio Interface
 
157
  dataset_name = gr.Textbox(value="wikimedia/wikipedia", label="Dataset Name")
158
  configs = gr.Textbox(value="20231101.el,20231101.en", label="Configs")
159
  split = gr.Dropdown(choices=["train"], value="train", label="Split")
160
+ chunk_size = gr.Slider(500, 10000, value=5000, label="Chunk Size")
161
  vocab_size = gr.Slider(20000, 100000, value=50000, label="Vocabulary Size")
162
  min_freq = gr.Slider(1, 100, value=3, label="Minimum Frequency")
163
  test_text = gr.Textbox(value="Η Ακρόπολη είναι σύμβολο της αρχαίας Ελλάδας.", label="Test Text")
164
  start_btn = gr.Button("Start Collection")
165
  stop_btn = gr.Button("Stop Collection")
166
  restart_btn = gr.Button("Restart Collection")
 
167
  train_btn = gr.Button("Train Tokenizer")
168
 
169
  progress = gr.Textbox(label="Progress", interactive=False, lines=10)
 
173
  start_btn.click(collect_samples, [dataset_name, configs, split, chunk_size], progress)
174
  stop_btn.click(stop_collection, [], progress)
175
  restart_btn.click(restart_collection, [], progress)
 
176
  train_btn.click(train_tokenizer_fn, [dataset_name, configs, split, vocab_size, min_freq, test_text],
177
  [progress, decoded_text, token_distribution])
178