Mamadou2727 commited on
Commit
f89c72b
·
verified ·
1 Parent(s): eaf4084
Files changed (1) hide show
  1. app.py +36 -31
app.py CHANGED
@@ -2,65 +2,70 @@ import gradio as gr
2
  import torch
3
  from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
4
 
5
- # 1) Load both model & tokenizer from your fine-tuned checkpoint
6
- MODEL_ID = "Mamadou2727/Feriji_model"
7
- tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
8
- model = AutoModelForSeq2SeqLM.from_pretrained(MODEL_ID)
9
 
10
- # 2) Move model to the right device
 
 
 
 
 
 
 
11
  device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
12
  model.to(device)
13
  model.eval()
14
 
15
- # 3) Use ISO 639-3 for Zarma
16
  LANG_CODES = {
17
  "French": "fr",
18
  "Zarma": "yo"
19
  }
20
 
21
- def translate(text, num_return_sequences):
22
- src = LANG_CODES["French"]
23
- tgt = LANG_CODES["Zarma"]
24
-
25
- # tell the tokenizer which languages we're using
26
- tokenizer.src_lang = src
27
- tokenizer.tgt_lang = tgt
28
 
29
- # tokenize & move inputs to device
30
  inputs = tokenizer(text, return_tensors="pt", padding=True).to(device)
31
 
32
- # generate
33
  with torch.no_grad():
34
  outputs = model.generate(
35
  **inputs,
36
- forced_bos_token_id=tokenizer.lang_code_to_id[tgt],
37
- num_beams=num_return_sequences,
38
- num_return_sequences=num_return_sequences,
39
- length_penalty=1.0, # more standard for translation
40
  early_stopping=True
41
  )
42
 
43
- # decode & join
44
  translations = tokenizer.batch_decode(outputs, skip_special_tokens=True)
45
  return "\n\n".join(translations)
46
 
47
-
48
- # 4) Gradio interface
49
- markdown = r"""
50
- # FERIJI Translator: French ⇄ Zarma
51
- *Beta version – academic & research use only.*
52
- """
53
-
54
  with gr.Blocks() as app:
55
- gr.Markdown(markdown)
 
 
 
 
 
56
 
57
  with gr.Row():
58
  inp = gr.Textbox(lines=7, label="Français / French")
59
- k = gr.Slider(1, 5, value=1, step=1, label="Nombre de séquences retournées")
 
 
 
60
  out = gr.Textbox(lines=7, label="Zarma")
61
 
62
  btn = gr.Button("Traduire")
63
- btn.click(translate, inputs=[inp, k], outputs=out, api_name="predict")
64
 
65
- # On HF Spaces you can just launch without share=True
66
  app.launch()
 
2
  import torch
3
  from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
4
 
5
+ # 1) Load the base M2M100 tokenizer (avoids the “non-consecutive added token” error)
6
+ BASE_MODEL = "facebook/m2m100_418M"
7
+ tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL)
 
8
 
9
+ # 2) Load your fine-tuned French⇄Zarma model
10
+ FINETUNED_MODEL = "Mamadou2727/Feriji_model"
11
+ model = AutoModelForSeq2SeqLM.from_pretrained(FINETUNED_MODEL)
12
+
13
+ # 3) Ensure the model’s embedding matrix matches the tokenizer vocab size
14
+ model.resize_token_embeddings(len(tokenizer))
15
+
16
+ # 4) Move model to GPU if available
17
  device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
18
  model.to(device)
19
  model.eval()
20
 
21
+ # 5) Correct ISO 639-3 code for Zarma (“dje”)
22
  LANG_CODES = {
23
  "French": "fr",
24
  "Zarma": "yo"
25
  }
26
 
27
+ def translate(text: str, num_seqs: int):
28
+ # set source & target language codes
29
+ tokenizer.src_lang = LANG_CODES["French"]
30
+ tokenizer.tgt_lang = LANG_CODES["Zarma"]
 
 
 
31
 
32
+ # tokenize & move to device
33
  inputs = tokenizer(text, return_tensors="pt", padding=True).to(device)
34
 
35
+ # generate translations
36
  with torch.no_grad():
37
  outputs = model.generate(
38
  **inputs,
39
+ forced_bos_token_id=tokenizer.lang_code_to_id[LANG_CODES["Zarma"]],
40
+ num_beams=num_seqs,
41
+ num_return_sequences=num_seqs,
42
+ length_penalty=1.0,
43
  early_stopping=True
44
  )
45
 
46
+ # decode & join multiple hypotheses
47
  translations = tokenizer.batch_decode(outputs, skip_special_tokens=True)
48
  return "\n\n".join(translations)
49
 
50
+ # 6) Build Gradio app
 
 
 
 
 
 
51
  with gr.Blocks() as app:
52
+ gr.Markdown(
53
+ """
54
+ # FERIJI Translator: French ⇄ Zarma
55
+ *Beta version – academic & research use only.*
56
+ """
57
+ )
58
 
59
  with gr.Row():
60
  inp = gr.Textbox(lines=7, label="Français / French")
61
+ beams = gr.Slider(
62
+ label="Nombre de séquences retournées",
63
+ minimum=1, maximum=5, value=1, step=1
64
+ )
65
  out = gr.Textbox(lines=7, label="Zarma")
66
 
67
  btn = gr.Button("Traduire")
68
+ btn.click(fn=translate, inputs=[inp, beams], outputs=out, api_name="predict")
69
 
70
+ # On HF Spaces you don’t need share=True
71
  app.launch()