tymbos commited on
Commit
e42fc15
·
verified ·
1 Parent(s): 4410500

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +47 -29
app.py CHANGED
@@ -1,14 +1,15 @@
1
  # -*- coding: utf-8 -*-
2
  import os
3
  import gradio as gr
 
4
  import time
5
- import datetime
6
  from io import BytesIO
7
  import matplotlib.pyplot as plt
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
 
13
  # Για επαναληψιμότητα στο langdetect
14
  DetectorFactory.seed = 0
@@ -22,10 +23,6 @@ MAX_SAMPLES = 3000000 # Όριο δειγμάτων
22
  # Παγκόσμια μεταβλητή ελέγχου συλλογής
23
  STOP_COLLECTION = False
24
 
25
- # ===== ΕΜΦΑΝΙΣΗ LOG ΕΚΚΙΝΗΣΗΣ =====
26
- startup_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
27
- print(f"\n===== Application Startup at {startup_time} =====\n")
28
-
29
 
30
  def load_checkpoint():
31
  """Φόρτωση δεδομένων από το checkpoint αν υπάρχει."""
@@ -56,59 +53,76 @@ def create_iterator(dataset_name, configs, split):
56
  print(f"⚠️ Σφάλμα φόρτωσης dataset για config {config}: {e}")
57
 
58
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
  def collect_samples(dataset_name, configs, split, chunk_size):
60
- """
61
- Ξεκινά τη συλλογή δειγμάτων από το dataset μέχρι να φτάσει το MAX_SAMPLES
62
- ή μέχρι να ζητηθεί διακοπή (STOP_COLLECTION).
63
- """
64
  global STOP_COLLECTION
65
  STOP_COLLECTION = False
66
  total_processed = len(load_checkpoint())
67
-
68
- # LOG: Ξεκίνησε η διαδικασία συλλογής
69
- print(f"🚀 Ξεκινά η συλλογή δεδομένων... Υπάρχουν ήδη {total_processed} δείγματα στο checkpoint.")
70
-
71
  progress_messages = [f"📌 Ξεκινά η συλλογή... Υπάρχουν ήδη {total_processed} δείγματα στο checkpoint."]
 
72
  dataset_iterator = create_iterator(dataset_name, configs, split)
73
  new_texts = []
74
 
75
  for text in dataset_iterator:
76
  if STOP_COLLECTION:
77
  progress_messages.append("⏹️ Η συλλογή σταμάτησε από το χρήστη.")
78
- print("⏹️ Η συλλογή σταμάτησε από το χρήστη.")
79
  break
80
 
81
  new_texts.append(text)
82
  total_processed += 1
83
-
84
  if len(new_texts) >= chunk_size:
85
  append_to_checkpoint(new_texts)
86
  progress_messages.append(f"✅ Αποθηκεύτηκαν {total_processed} δείγματα στο checkpoint.")
87
- print(f"✅ Αποθηκεύτηκαν {total_processed} δείγματα στο checkpoint.")
88
  new_texts = []
89
 
90
  if total_processed >= MAX_SAMPLES:
91
  progress_messages.append("⚠️ Έφτασε το όριο δειγμάτων.")
92
- print("⚠️ Έφτασε το όριο δειγμάτων.")
93
  break
94
 
95
  if new_texts:
96
  append_to_checkpoint(new_texts)
97
  progress_messages.append(f"✅ Τελικό batch αποθηκεύτηκε ({total_processed} δείγματα).")
98
- print(f"✅ Τελικό batch αποθηκεύτηκε ({total_processed} δείγματα).")
99
-
100
  return "\n".join(progress_messages)
101
 
102
 
103
  def train_tokenizer_fn(dataset_name, configs, split, vocab_size, min_freq, test_text):
104
  """Εκπαιδεύει τον tokenizer χρησιμοποιώντας τα δεδομένα του checkpoint."""
105
- print("\n🚀 Ξεκινά η διαδικασία εκπαίδευσης...")
106
  all_texts = load_checkpoint()
107
  tokenizer = train_tokenizer(all_texts, vocab_size, min_freq, TOKENIZER_DIR)
108
 
109
- # LOG: Τέλος εκπαίδευσης
110
- print(f"✅ Εκπαίδευση ολοκληρώθηκε! Το tokenizer αποθηκεύτηκε στο {TOKENIZER_DIR}.")
111
-
112
  # Φόρτωση εκπαιδευμένου tokenizer
113
  trained_tokenizer = Tokenizer.from_file(TOKENIZER_FILE)
114
 
@@ -122,20 +136,24 @@ def train_tokenizer_fn(dataset_name, configs, split, vocab_size, min_freq, test_
122
  plt.hist(token_lengths, bins=20)
123
  plt.xlabel('Μήκος Token')
124
  plt.ylabel('Συχνότητα')
 
 
125
  img_buffer = BytesIO()
126
  plt.savefig(img_buffer, format='png')
127
  plt.close()
128
-
 
 
 
129
  return (f"✅ Εκπαίδευση ολοκληρώθηκε!\nΑποθηκεύτηκε στον φάκελο: {TOKENIZER_DIR}",
130
  decoded,
131
- img_buffer.getvalue())
132
 
133
 
134
  def stop_collection():
135
  """Σταματά τη συλλογή δειγμάτων."""
136
  global STOP_COLLECTION
137
  STOP_COLLECTION = True
138
- print("⏹️ Η συλλογή σταμάτησε από το χρήστη.")
139
  return "⏹️ Η συλλογή σταμάτησε από το χρήστη."
140
 
141
 
@@ -145,7 +163,6 @@ def restart_collection():
145
  STOP_COLLECTION = False
146
  if os.path.exists(CHECKPOINT_FILE):
147
  os.remove(CHECKPOINT_FILE)
148
- print("🔄 Το checkpoint διαγράφηκε. Έτοιμο για νέα συλλογή.")
149
  return "🔄 Το checkpoint διαγράφηκε. Μπορείς να ξεκινήσεις νέα συλλογή."
150
 
151
 
@@ -158,13 +175,14 @@ with gr.Blocks() as demo:
158
  dataset_name = gr.Textbox(value="wikimedia/wikipedia", label="Dataset Name")
159
  configs = gr.Textbox(value="20231101.el,20231101.en", label="Configs")
160
  split = gr.Dropdown(choices=["train"], value="train", label="Split")
161
- chunk_size = gr.Slider(500, 50000, value=50000, label="Chunk Size")
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
  start_btn = gr.Button("Start Collection")
166
  stop_btn = gr.Button("Stop Collection")
167
  restart_btn = gr.Button("Restart Collection")
 
168
  train_btn = gr.Button("Train Tokenizer")
169
 
170
  progress = gr.Textbox(label="Progress", interactive=False, lines=10)
@@ -174,8 +192,8 @@ with gr.Blocks() as demo:
174
  start_btn.click(collect_samples, [dataset_name, configs, split, chunk_size], progress)
175
  stop_btn.click(stop_collection, [], progress)
176
  restart_btn.click(restart_collection, [], progress)
 
177
  train_btn.click(train_tokenizer_fn, [dataset_name, configs, split, vocab_size, min_freq, test_text],
178
  [progress, decoded_text, token_distribution])
179
 
180
- print("\nGradio Interface is launching...")
181
  demo.launch()
 
1
  # -*- coding: utf-8 -*-
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
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
  # Παγκόσμια μεταβλητή ελέγχου συλλογής
24
  STOP_COLLECTION = False
25
 
 
 
 
 
26
 
27
  def load_checkpoint():
28
  """Φόρτωση δεδομένων από το checkpoint αν υπάρχει."""
 
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
 
 
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
  STOP_COLLECTION = False
164
  if os.path.exists(CHECKPOINT_FILE):
165
  os.remove(CHECKPOINT_FILE)
 
166
  return "🔄 Το checkpoint διαγράφηκε. Μπορείς να ξεκινήσεις νέα συλλογή."
167
 
168
 
 
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, 10000, value=5000, 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
  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
 
 
199
  demo.launch()