salmankhanpm commited on
Commit
929a20d
·
verified ·
1 Parent(s): a92795e

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +202 -0
app.py ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from cProfile import label
2
+ import logging
3
+ from pydoc import text
4
+ from turtle import title
5
+
6
+ import tiktoken
7
+ from transformers import AutoTokenizer
8
+
9
+ import gradio as gr
10
+
11
+ import os
12
+ from dotenv import load_dotenv
13
+ load_dotenv()
14
+
15
+ HF_TOKEN = os.getenv("HF_TOKEN") or None
16
+
17
+ logger = logging.getLogger(__name__) # noqa
18
+
19
+
20
+ def load_test_phrases(filename):
21
+ with open(f"./data/{filename}", "r", encoding="utf-8") as file:
22
+ return file.read().splitlines()
23
+
24
+
25
+ models = ["HuggingFaceTB/SmolLM2-135M-Instruct", # SmolLM2
26
+ "meta-llama/Llama-3.2-3B-Instruct", # LLAMA-3
27
+ "Telugu-LLM-Labs/Telugu-Llama2-7B-v0-Instruct", # LLama 2 Finetuned for Improving Telugu
28
+ "CohereForAI/aya-23-8B", # AYA
29
+ "google/gemma-3-4b-it", # GEMMA 3
30
+ "sarvamai/sarvam-1", # SarvamAI
31
+ "gpt-4o", # GPT4o
32
+ "Qwen/Qwen3-4B", # Qwen
33
+ "TWO/sutra-mlt256-v2"] # SUTRA
34
+
35
+ test_phrase_set = [
36
+ "ఐదు వాక్యాలలో న్యూట్రాన్ స్కాటరింగ్ గురించి నాకు వివరణ ఇవ్వండి",
37
+ "నటుడు బిల్ ముర్రే ఇంటి చిరునామా 445 నార్త్ బెడ్ఫోర్డ్ డ్రైవ్, లాస్ ఏంజిల్స్, CA 90049.",
38
+ "హే, వీబ్ అంటే ఏమిటో మీకు తెలుసా?",
39
+ "నాకు మరింత వివరాలు ఇవ్వండి",
40
+ "కుక్కలు మరియు పిల్లుల మధ్య రెండు తేడాలు వాటి ప్రవర్తన మరియు వాటి శారీరక లక్షణాలు. కుక్కలు సాధారణంగా మరింత సామాజికంగా మరియు శిక్షణ పొందగలవు, అయితే పిల్లులు మరింత స్వతంత్రంగా ఉంటాయి. అదనంగా, పిల్లులతో పోలిస్తే కుక్కలు సాధారణంగా పెద్ద పరిమాణంలో ఉంటాయి.",
41
+ "మేము టెక్స్ట్ మరియు వాయిస్‌కి మించి ఆంగ్లానికి మించిన అన్ని భాషల కోసం AIని రూపొందిస్తున్నాము. మేము అందరి కోసం AIని నిర్మిస్తున్నాము.",
42
+ ]
43
+
44
+ test_phrase_set_long_1 = load_test_phrases('multilingualphrases01.txt')
45
+ test_phrase_set_long_2 = load_test_phrases('multilingualphrases02.txt')
46
+ test_phrase_set_long_3 = load_test_phrases('multilingualphrases03.txt')
47
+
48
+ # Cache tokenizers at the top level to avoid reloading on every call
49
+ hf_tokenizers = {}
50
+ for model in models:
51
+ print("Loading tokenizer for", model)
52
+ if 'gpt' not in model:
53
+ hf_tokenizers[model] = AutoTokenizer.from_pretrained(model)
54
+ else:
55
+ hf_tokenizers[model] = tiktoken.encoding_for_model(model)
56
+
57
+
58
+ def generate_tokens_as_table(text):
59
+ table = []
60
+ for model in models:
61
+ tokenizer = hf_tokenizers[model]
62
+ if 'gpt' not in model:
63
+ tokens = tokenizer.encode(text, add_special_tokens=False)
64
+ else:
65
+ tokens = tokenizer.encode(text)
66
+ decoded = [tokenizer.decode([t]) for t in tokens]
67
+ table.append([model] + decoded)
68
+ return table
69
+
70
+ def baseline_tokeizer_extractor(text):
71
+ word_count = len(text.split(' '))
72
+ base_tokenizer = hf_tokenizers[models[-1]]
73
+ base_tokens = base_tokenizer.encode(text)
74
+ base_tokens_count = len(base_tokens)
75
+ vocab_size = base_tokenizer.vocab_size
76
+
77
+ return [models[-1], vocab_size, word_count, base_tokens_count, f"{base_tokens_count / word_count:0.2f}" ]
78
+
79
+
80
+ def generate_tokenizer_table(text):
81
+ if not text:
82
+ return []
83
+
84
+ token_counts = {model: 0 for model in models}
85
+ vocab_size = {model: 0 for model in models}
86
+
87
+ for model in models:
88
+ tokenizer = hf_tokenizers[model]
89
+ if 'gpt' not in model:
90
+ vocab_size[model] = tokenizer.vocab_size
91
+ token_counts[model] = len(tokenizer.encode(text, add_special_tokens=True))
92
+ else:
93
+ vocab_size[model] = tokenizer.n_vocab
94
+ token_counts[model] = len(tokenizer.encode(text))
95
+
96
+ word_count = len(text.split(' '))
97
+
98
+
99
+
100
+ base_tokenizer = baseline_tokeizer_extractor(text)
101
+
102
+ output = []
103
+ for m in models:
104
+ # if m == models[-1]:
105
+ # row = [m, vocab_size[m], word_count, token_counts[m], f"{token_counts[m] / word_count:0.2f}", "1.0"]
106
+ # else:
107
+ row = [m, vocab_size[m], word_count, token_counts[m], f"{token_counts[m] / word_count:0.2f}", f"{token_counts[m] / base_tokenizer[3]:0.2f}"]
108
+
109
+ output.append(row)
110
+
111
+ return output
112
+
113
+
114
+
115
+ def generate_split_token_table(text):
116
+ if not text:
117
+ return gr.Dataframe()
118
+
119
+ table = generate_tokenizer_table(text)
120
+ return gr.Dataframe(
121
+ table,
122
+ headers=['tokenizer', 'v size', '#word', '#token', '#tokens/word', "NSL Value"],
123
+ datatype=["str", "number", "str"],
124
+ row_count=len(models),
125
+ col_count=(6, "fixed"),
126
+ )
127
+
128
+ def generate_baseline_tokenizer_insights(text):
129
+ word_count = len(text.split(' '))
130
+ base_tokenizer = hf_tokenizers[models[-1]]
131
+ base_tokens = base_tokenizer.encode(text)
132
+ base_tokens_count = len(base_tokens)
133
+
134
+ # Table should be a list of rows (list of lists)
135
+ table = [[models[-1], base_tokenizer.vocab_size, word_count, base_tokens_count, f"{base_tokens_count / word_count:0.2f}"]]
136
+
137
+ return gr.Dataframe(
138
+ table,
139
+ headers=['tokenizer', 'v size', '#words', '#token', '#tokens/word'],
140
+ datatype=["str", "number", "number", "number", "str"],
141
+ row_count=1,
142
+ col_count=(5, "fixed"),
143
+ )
144
+
145
+ def generate_tokens_table(text):
146
+ table = generate_tokens_as_table(text)
147
+ cols = len(table[0])
148
+ return gr.Dataframe(
149
+ table,
150
+ headers=['model'] + [str(i) for i in range(cols - 1)],
151
+ row_count=2,
152
+ col_count=(cols, "fixed"),
153
+ )
154
+
155
+
156
+ with gr.Blocks() as sutra_tokenize:
157
+ gr.Markdown(
158
+ """
159
+ ## Tokenize a sentence with various tokenizers and inspect how it's broken down.
160
+ """)
161
+ examples = test_phrase_set
162
+ textbox = gr.Textbox(label="Input Text")
163
+ with gr.Row():
164
+ submit_button = gr.Button("Submit")
165
+ gr.Examples(examples=examples, inputs=[textbox])
166
+ example_display = gr.Textbox(label="Selected Example", interactive=False)
167
+ textbox.change(lambda x: x, inputs=[textbox], outputs=[example_display])
168
+ baseline_tokenizer = gr.Dataframe(label="Baseline Tokenizer")
169
+ output_detailed = gr.Dataframe(label="Detailed Token Table")
170
+ output_tokens = gr.Dataframe(label="Token Table")
171
+
172
+ submit_button.click(lambda x: x, inputs=[textbox], outputs=[textbox])
173
+ submit_button.click(generate_baseline_tokenizer_insights, inputs=[textbox], outputs=[baseline_tokenizer])
174
+ submit_button.click(generate_split_token_table, inputs=[textbox], outputs=[output_detailed])
175
+ submit_button.click(generate_tokens_table, inputs=[textbox], outputs=[output_tokens])
176
+
177
+
178
+
179
+ if __name__ == '__main__':
180
+ with gr.Blocks(analytics_enabled=False) as demo:
181
+ with gr.Row():
182
+ gr.Markdown(
183
+ """
184
+ # Telugu Tokenizer Sentence Inspector & Evaluation.
185
+ ### Using Two SUTRA Tokenizer as Baseline.
186
+ #### Paper :
187
+ ### [EVALUATING TOKENIZER PERFORMANCE OF LARGE LANGUAGE MODELS ACROSS OFFICIAL INDIAN LANGUAGES](https://arxiv.org/pdf/2411.12240v2) \n
188
+ ### [PERFORMANCE EVALUATION OF TOKENIZERS IN LARGE LANGUAGE MODELS FOR THE ASSAMESE LANGUAGE](https://arxiv.org/pdf/2410.03718)
189
+ ####
190
+
191
+ """
192
+ )
193
+ with gr.Row():
194
+ gr.TabbedInterface(
195
+ interface_list=[sutra_tokenize],
196
+ tab_names=["Tokenize Text"]
197
+ )
198
+
199
+ demo.queue(default_concurrency_limit=5).launch(
200
+ server_name="0.0.0.0",
201
+ allowed_paths=["/"],
202
+ )