Yehor commited on
Commit
22ea572
·
1 Parent(s): 313730b
Files changed (4) hide show
  1. README.md +3 -15
  2. app.py +47 -147
  3. justfile +3 -0
  4. requirements.txt +2 -0
README.md CHANGED
@@ -8,27 +8,15 @@ sdk_version: 5.38.0
8
  pinned: false
9
  ---
10
 
 
 
11
  ## Install
12
 
13
- ```shell
14
  uv venv --python 3.10
15
 
16
  source .venv/bin/activate
17
 
18
  uv pip install -r requirements.txt
19
-
20
- # in development mode
21
  uv pip install -r requirements-dev.txt
22
  ```
23
-
24
- ## Build image
25
-
26
- ```shell
27
- docker build -t en-uk-translator .
28
- ```
29
-
30
- ## Run
31
-
32
- ```shell
33
- docker run -it --rm -p 8888:7860 en-uk-translator
34
- ```
 
8
  pinned: false
9
  ---
10
 
11
+ Translate from English to Ukrainian.
12
+
13
  ## Install
14
 
15
+ ```bash
16
  uv venv --python 3.10
17
 
18
  source .venv/bin/activate
19
 
20
  uv pip install -r requirements.txt
 
 
21
  uv pip install -r requirements-dev.txt
22
  ```
 
 
 
 
 
 
 
 
 
 
 
 
app.py CHANGED
@@ -1,10 +1,6 @@
1
  import sys
2
  import time
3
 
4
- from importlib.metadata import version
5
- from gradio.utils import is_zero_gpu_space
6
- from gradio.themes import Base
7
-
8
  try:
9
  import spaces
10
  except ImportError:
@@ -14,6 +10,11 @@ import torch
14
  import torchaudio
15
  import gradio as gr
16
  import torchaudio.transforms as T
 
 
 
 
 
17
 
18
  from transformers import (
19
  AutoModelForCausalLM,
@@ -122,18 +123,6 @@ This space translates your text, audio, image from English to Ukrainian. Also, c
122
  """.strip()
123
 
124
 
125
- translated_text_value = """
126
- Choose an example below the Translate button or type your text.
127
- """.strip()
128
-
129
- translated_audio_value = """
130
- Choose an example below the Translate button or upload your audio.
131
- """.strip()
132
-
133
- translated_image_value = """
134
- Choose an example below the Translate button or upload your image.
135
- """.strip()
136
-
137
  tech_env = f"""
138
  #### Environment
139
 
@@ -155,6 +144,39 @@ tech_libraries = f"""
155
  """.strip()
156
 
157
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
  @spaces.GPU
159
  def inference_text(text, progress=gr.Progress()):
160
  if not text:
@@ -176,36 +198,7 @@ def inference_text(text, progress=gr.Progress()):
176
  non_empty_sentences, desc="Translating...", unit="sentence"
177
  ):
178
  t0 = time.time()
179
-
180
- prompt = "Translate the text to Ukrainian:\n" + sentence
181
-
182
- input_ids = tokenizer.apply_chat_template(
183
- [{"role": "user", "content": prompt}],
184
- add_generation_prompt=True,
185
- return_tensors="pt",
186
- tokenize=True,
187
- ).to(model.device)
188
-
189
- output = model.generate(
190
- input_ids,
191
- max_new_tokens=2048,
192
- # Greedy Search
193
- do_sample=False,
194
- repetition_penalty=1.05,
195
- # Sampling
196
- # do_sample=True,
197
- # temperature=0.1,
198
- # # top_k=1,
199
- # min_p=0.9,
200
- # repetition_penalty=1.05,
201
- )
202
-
203
- prompt_len = input_ids.shape[1]
204
- generated_tokens = output[:, prompt_len:]
205
- translated_text = tokenizer.batch_decode(
206
- generated_tokens, skip_special_tokens=True
207
- )[0]
208
-
209
  elapsed_time = round(time.time() - t0, 2)
210
 
211
  translated_text = translated_text.strip()
@@ -219,15 +212,7 @@ def inference_text(text, progress=gr.Progress()):
219
 
220
  gr.Info("Finished!", duration=2)
221
 
222
- result_texts = []
223
-
224
- for result in results:
225
- result_texts.append(f"{result['translated_text']}\n")
226
-
227
- sum_elapsed_text = sum([result["elapsed_time"] for result in results])
228
- print(f"Elapsed time: {round(sum_elapsed_text, 4)} seconds")
229
-
230
- return "\n".join(result_texts)
231
 
232
 
233
  @spaces.GPU
@@ -287,39 +272,9 @@ def inference_audio(audio, progress=gr.Progress()):
287
  non_empty_sentences, desc="Translating...", unit="sentence"
288
  ):
289
  t0 = time.time()
290
-
291
- prompt = "Translate the text to Ukrainian:\n" + sentence
292
-
293
- input_ids = tokenizer.apply_chat_template(
294
- [{"role": "user", "content": prompt}],
295
- add_generation_prompt=True,
296
- return_tensors="pt",
297
- tokenize=True,
298
- ).to(model.device)
299
-
300
- output = model.generate(
301
- input_ids,
302
- max_new_tokens=2048,
303
- # Greedy Search
304
- do_sample=False,
305
- repetition_penalty=1.05,
306
- # Sampling
307
- # do_sample=True,
308
- # temperature=0.1,
309
- # # top_k=1,
310
- # min_p=0.9,
311
- # repetition_penalty=1.05,
312
- )
313
-
314
- prompt_len = input_ids.shape[1]
315
- generated_tokens = output[:, prompt_len:]
316
- translated_text = tokenizer.batch_decode(
317
- generated_tokens, skip_special_tokens=True
318
- )[0]
319
-
320
  elapsed_time = round(time.time() - t0, 2)
321
 
322
- translated_text = translated_text.strip()
323
  results.append(
324
  {
325
  "sentence": sentence,
@@ -330,15 +285,7 @@ def inference_audio(audio, progress=gr.Progress()):
330
 
331
  gr.Info("Finished!", duration=2)
332
 
333
- result_texts = []
334
-
335
- for result in results:
336
- result_texts.append(f"{result['sentence']}: {result['translated_text']}\n")
337
-
338
- sum_elapsed_text = sum([result["elapsed_time"] for result in results])
339
- print(f"Elapsed time: {round(sum_elapsed_text, 4)} seconds")
340
-
341
- return "\n".join(result_texts)
342
 
343
 
344
  @spaces.GPU
@@ -365,39 +312,9 @@ def inference_image(image, progress=gr.Progress()):
365
 
366
  for sentence in progress.tqdm(sentences, desc="Translating...", unit="sentence"):
367
  t0 = time.time()
368
-
369
- prompt = "Translate the text to Ukrainian:\n" + sentence
370
-
371
- input_ids = tokenizer.apply_chat_template(
372
- [{"role": "user", "content": prompt}],
373
- add_generation_prompt=True,
374
- return_tensors="pt",
375
- tokenize=True,
376
- ).to(model.device)
377
-
378
- output = model.generate(
379
- input_ids,
380
- max_new_tokens=2048,
381
- # Greedy Search
382
- do_sample=False,
383
- repetition_penalty=1.05,
384
- # Sampling
385
- # do_sample=True,
386
- # temperature=0.1,
387
- # # top_k=1,
388
- # min_p=0.9,
389
- # repetition_penalty=1.05,
390
- )
391
-
392
- prompt_len = input_ids.shape[1]
393
- generated_tokens = output[:, prompt_len:]
394
- translated_text = tokenizer.batch_decode(
395
- generated_tokens, skip_special_tokens=True
396
- )[0]
397
-
398
  elapsed_time = round(time.time() - t0, 2)
399
 
400
- translated_text = translated_text.strip()
401
  results.append(
402
  {
403
  "sentence": sentence,
@@ -408,15 +325,7 @@ def inference_image(image, progress=gr.Progress()):
408
 
409
  gr.Info("Finished!", duration=2)
410
 
411
- result_texts = []
412
-
413
- for result in results:
414
- result_texts.append(f"> {result['sentence']}: {result['translated_text']}\n")
415
-
416
- sum_elapsed_text = sum([result["elapsed_time"] for result in results])
417
- print(f"Elapsed time: {round(sum_elapsed_text, 4)} seconds")
418
-
419
- return "\n".join(result_texts)
420
 
421
 
422
  def create_app():
@@ -430,11 +339,8 @@ def create_app():
430
  gr.Markdown(description_head)
431
  gr.Markdown("## Usage")
432
 
433
- translated_text = gr.Textbox(
434
  label="Translated text",
435
- placeholder=translated_text_value,
436
- show_copy_button=True,
437
- lines=5,
438
  )
439
 
440
  text = gr.Textbox(label="Text", autofocus=True, lines=5)
@@ -457,11 +363,8 @@ def create_audio_app():
457
  gr.Markdown(description_head)
458
  gr.Markdown("## Usage")
459
 
460
- translated_text = gr.Textbox(
461
  label="Translated text",
462
- placeholder=translated_audio_value,
463
- show_copy_button=True,
464
- lines=5,
465
  )
466
 
467
  audio = gr.Audio(label="Audio file", sources="upload", type="filepath")
@@ -486,11 +389,8 @@ def create_image_app():
486
  gr.Markdown(description_head)
487
  gr.Markdown("## Usage")
488
 
489
- translated_text = gr.Textbox(
490
  label="Translated text",
491
- placeholder=translated_image_value,
492
- show_copy_button=True,
493
- lines=5,
494
  )
495
 
496
  image = gr.Image(label="Image file", sources="upload", type="filepath")
 
1
  import sys
2
  import time
3
 
 
 
 
 
4
  try:
5
  import spaces
6
  except ImportError:
 
10
  import torchaudio
11
  import gradio as gr
12
  import torchaudio.transforms as T
13
+ import polars as pl
14
+
15
+ from importlib.metadata import version
16
+ from gradio.utils import is_zero_gpu_space
17
+ from gradio.themes import Base
18
 
19
  from transformers import (
20
  AutoModelForCausalLM,
 
123
  """.strip()
124
 
125
 
 
 
 
 
 
 
 
 
 
 
 
 
126
  tech_env = f"""
127
  #### Environment
128
 
 
144
  """.strip()
145
 
146
 
147
+ def translate(text: str) -> str:
148
+ prompt = "Translate the text to Ukrainian:\n" + text
149
+
150
+ input_ids = tokenizer.apply_chat_template(
151
+ [{"role": "user", "content": prompt}],
152
+ add_generation_prompt=True,
153
+ return_tensors="pt",
154
+ tokenize=True,
155
+ ).to(model.device)
156
+
157
+ output = model.generate(
158
+ input_ids,
159
+ max_new_tokens=2048,
160
+ # Greedy Search
161
+ do_sample=False,
162
+ repetition_penalty=1.05,
163
+ # Sampling
164
+ # do_sample=True,
165
+ # temperature=0.1,
166
+ # # top_k=1,
167
+ # min_p=0.9,
168
+ # repetition_penalty=1.05,
169
+ )
170
+
171
+ prompt_len = input_ids.shape[1]
172
+ generated_tokens = output[:, prompt_len:]
173
+ translated_text = tokenizer.batch_decode(
174
+ generated_tokens, skip_special_tokens=True
175
+ )[0]
176
+
177
+ return translated_text.strip()
178
+
179
+
180
  @spaces.GPU
181
  def inference_text(text, progress=gr.Progress()):
182
  if not text:
 
198
  non_empty_sentences, desc="Translating...", unit="sentence"
199
  ):
200
  t0 = time.time()
201
+ translated_text = translate(sentence)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
202
  elapsed_time = round(time.time() - t0, 2)
203
 
204
  translated_text = translated_text.strip()
 
212
 
213
  gr.Info("Finished!", duration=2)
214
 
215
+ return pl.DataFrame(results)
 
 
 
 
 
 
 
 
216
 
217
 
218
  @spaces.GPU
 
272
  non_empty_sentences, desc="Translating...", unit="sentence"
273
  ):
274
  t0 = time.time()
275
+ translated_text = translate(sentence)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
276
  elapsed_time = round(time.time() - t0, 2)
277
 
 
278
  results.append(
279
  {
280
  "sentence": sentence,
 
285
 
286
  gr.Info("Finished!", duration=2)
287
 
288
+ return pl.DataFrame(results)
 
 
 
 
 
 
 
 
289
 
290
 
291
  @spaces.GPU
 
312
 
313
  for sentence in progress.tqdm(sentences, desc="Translating...", unit="sentence"):
314
  t0 = time.time()
315
+ translated_text = translate(sentence)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
316
  elapsed_time = round(time.time() - t0, 2)
317
 
 
318
  results.append(
319
  {
320
  "sentence": sentence,
 
325
 
326
  gr.Info("Finished!", duration=2)
327
 
328
+ return pl.DataFrame(results)
 
 
 
 
 
 
 
 
329
 
330
 
331
  def create_app():
 
339
  gr.Markdown(description_head)
340
  gr.Markdown("## Usage")
341
 
342
+ translated_text = gr.DataFrame(
343
  label="Translated text",
 
 
 
344
  )
345
 
346
  text = gr.Textbox(label="Text", autofocus=True, lines=5)
 
363
  gr.Markdown(description_head)
364
  gr.Markdown("## Usage")
365
 
366
+ translated_text = gr.DataFrame(
367
  label="Translated text",
 
 
 
368
  )
369
 
370
  audio = gr.Audio(label="Audio file", sources="upload", type="filepath")
 
389
  gr.Markdown(description_head)
390
  gr.Markdown("## Usage")
391
 
392
+ translated_text = gr.DataFrame(
393
  label="Translated text",
 
 
 
394
  )
395
 
396
  image = gr.Image(label="Image file", sources="upload", type="filepath")
justfile ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ default:
2
+ ruff check
3
+ ruff format
requirements.txt CHANGED
@@ -8,3 +8,5 @@ torchaudio
8
  accelerate
9
 
10
  python-doctr
 
 
 
8
  accelerate
9
 
10
  python-doctr
11
+
12
+ polars