File size: 12,528 Bytes
56f497c 70ebea3 a103fac 9ddff3b cae0132 56f497c cae0132 4596a5d 8b76c73 4894c8f 2da2e03 e647eeb 590c882 282f817 a770d4a 4ac6a8d c00f03b 0a4ba41 9b5378d db28f50 a770d4a cc8d7bd 9b5378d e13fba3 310e819 0b61062 0d866f3 326c762 0d866f3 590c882 0d866f3 326c762 78a6dc6 cc8d7bd 3be98e3 cc8d7bd 4ac6a8d e165775 1800b84 4ac6a8d ca788da 4ac6a8d b1a4240 79ff2d1 b1a4240 8010198 9b5378d 4b5e076 9b5378d e647eeb 8010198 9b5378d 70ebea3 4dfd4b1 135432f 481d87b 135432f 481d87b 135432f 481d87b 135432f 481d87b 4dfd4b1 481d87b 135432f 481d87b 4596a5d 0b61062 ad4a802 56f497c 8b76c73 56f497c 8b76c73 e13fba3 8b76c73 ad4a802 395e0a2 ad4a802 cc8d7bd 0d866f3 3be98e3 cc8d7bd 50f4453 cc8d7bd 4ac6a8d b1a4240 4ac6a8d b1a4240 9b5378d 8010198 310e819 6dc437d d2894fa cae0132 44aa6cb d2894fa cae0132 d2894fa 310e819 d2894fa a770d4a fc2994c a770d4a d2894fa 56f497c bf6322b 56f497c 72e8644 2045817 72e8644 60b55c4 16105d3 4fd4915 b98b60d 56f497c 2169b22 56f497c e647eeb 56f497c e647eeb 2169b22 56f497c 7b79ed9 fc2994c 6f52ad9 56f497c 16105d3 56f497c 8b76c73 e06dabc 16105d3 7175c9b 56f497c e06dabc 56f497c b98b60d 56f497c 28cef2e 16105d3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 |
import gradio as gr
import spaces
import torch
from transformers import T5Tokenizer, T5ForConditionalGeneration, AutoTokenizer, AutoModelForSeq2SeqLM, AutoModelForCausalLM, AutoModel, pipeline
import languagecodes
favourite_langs = {"German": "de", "Romanian": "ro", "English": "en", "-----": "-----"}
all_langs = languagecodes.iso_languages
# Language options as list, add favourite languages first
options = list(favourite_langs.keys())
options.extend(list(all_langs.keys()))
models = ["Helsinki-NLP",
"t5-small", "t5-base", "t5-large",
"google/flan-t5-small", "google/flan-t5-base", "google/flan-t5-large", "google/flan-t5-xl",
"facebook/nllb-200-distilled-600M",
"facebook/nllb-200-distilled-1.3B",
"facebook/mbart-large-50-many-to-many-mmt",
"bigscience/mt0-small",
"bigscience/mt0-base",
"bigscience/mt0-large",
"bigscience/mt0-xl",
"bigscience/bloomz-560m",
"bigscience/bloomz-1b1",
"bigscience/bloomz-1b7",
"bigscience/bloomz-3b",
"utter-project/EuroLLM-1.7B",
"Unbabel/Tower-Plus-2B",
"Unbabel/TowerInstruct-7B-v0.2",
"Unbabel/TowerInstruct-Mistral-7B-v0.2",
"openGPT-X/Teuken-7B-instruct-commercial-v0.4"
]
def model_to_cuda(model):
# Move the model to GPU if available
if torch.cuda.is_available():
model = model.to('cuda')
print("CUDA is available! Using GPU.")
else:
print("CUDA not available! Using CPU.")
return model
def flan(model_name, sl, tl, input_text):
tokenizer = T5Tokenizer.from_pretrained(model_name, legacy=False)
model = T5ForConditionalGeneration.from_pretrained(model_name)
input_text = f"translate {sl} to {tl}: {input_text}"
input_ids = tokenizer(input_text, return_tensors="pt").input_ids
outputs = model.generate(input_ids)
return tokenizer.decode(outputs[0], skip_special_tokens=True).strip()
def teuken(model_name, sl, tl, input_text):
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# model_name = "openGPT-X/Teuken-7B-instruct-commercial-v0.4"
model = AutoModelForCausalLM.from_pretrained(
model_name,
trust_remote_code=True,
torch_dtype=torch.bfloat16,
)
model = model.to(device).eval()
tokenizer = AutoTokenizer.from_pretrained(
model_name,
use_fast=False,
trust_remote_code=True,
)
translation_prompt = f"Translate the following text from {sl} into {tl}: {input_text}"
messages = [{"role": "User", "content": translation_prompt}]
prompt_ids = tokenizer.apply_chat_template(messages, chat_template=sl.upper(), tokenize=True, add_generation_prompt=True, return_tensors="pt")
prediction = model.generate(
prompt_ids.to(model.device),
max_length=512,
do_sample=True,
top_k=50,
top_p=0.95,
temperature=0.7,
num_return_sequences=1,
)
translation = tokenizer.decode(prediction[0].tolist())
return translation
def bigscience(model_name, sl, tl, input_text):
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
inputs = tokenizer.encode(f"Translate to {tl}: {input_text}.", return_tensors="pt")
outputs = model.generate(inputs)
translation = tokenizer.decode(outputs[0])
translation = translation.replace('<pad> ', '').replace('</s>', '')
return translation
def bloomz(model_name, sl, tl, input_text):
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
inputs = tokenizer.encode(f"Translate from {sl} to {tl}: {input_text}. Translation:", return_tensors="pt")
outputs = model.generate(inputs)
translation = tokenizer.decode(outputs[0])
translation = translation.replace('<pad> ', '').replace('</s>', '')
return translation
def eurollm(model_name, sl, tl, input_text):
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
prompt = f"{sl}: {input_text} {tl}:"
inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=512)
output = tokenizer.decode(outputs[0], skip_special_tokens=True)
result = output.rsplit(f'{tl}:')[-1].strip()
return result
def nllb(model_name, sl, tl, input_text):
tokenizer = AutoTokenizer.from_pretrained(model_name, src_lang=sl)
model = AutoModelForSeq2SeqLM.from_pretrained(model_name, device_map="auto")
translator = pipeline('translation', model=model, tokenizer=tokenizer, src_lang=sl, tgt_lang=tl)
translated_text = translator(input_text, max_length=512)
return translated_text[0]['translation_text']
@spaces.GPU
def translate_text(input_text: str, sselected_language: str, tselected_language: str, model_name: str) -> tuple[str, str]:
"""
Translates the input text from the source language to the target language using a specified model.
Parameters:
input_text (str): The source text to be translated
sselected_language (str): The source language of the input text
tselected_language (str): The target language in which the input text is translated
model_name (str): The selected translation model name
Returns:
tuple:
translated_text(str): The input text translated to the selected target language
message_text(str): A descriptive message summarizing the translation process. Example: "Translated from English to German with Helsinki-NLP."
Example:
>>> translate_text("Hello world", "English", "German", "Helsinki-NLP")
("Hallo Welt", "Translated from English to German with Helsinki-NLP.")
"""
sl = all_langs[sselected_language]
tl = all_langs[tselected_language]
message_text = f'Translated from {sselected_language} to {tselected_language} with {model_name}'
print(message_text)
if model_name == "Helsinki-NLP":
try:
model_name = f"Helsinki-NLP/opus-mt-{sl}-{tl}"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = model_to_cuda(AutoModelForSeq2SeqLM.from_pretrained(model_name))
except EnvironmentError:
try:
model_name = f"Helsinki-NLP/opus-tatoeba-{sl}-{tl}"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = model_to_cuda(AutoModelForSeq2SeqLM.from_pretrained(model_name))
except EnvironmentError as error:
return f"Error finding model: {model_name}! Try other available language combination.", error
if 'eurollm' in model_name.lower():
translated_text = eurollm(model_name, sselected_language, tselected_language, input_text)
return translated_text, message_text
if 'flan' in model_name.lower():
translated_text = flan(model_name, sselected_language, tselected_language, input_text)
return translated_text, message_text
if 'teuken' in model_name.lower():
translated_text = teuken(model_name, sselected_language, tselected_language, input_text)
return translated_text, message_text
if 'mt0' in model_name.lower():
translated_text = bigscience(model_name, sselected_language, tselected_language, input_text)
return translated_text, message_text
if 'bloomz' in model_name.lower():
translated_text = bloomz(model_name, sselected_language, tselected_language, input_text)
return translated_text, message_text
if 'nllb' in model_name.lower():
nnlbsl, nnlbtl = languagecodes.nllb_language_codes[sselected_language], languagecodes.nllb_language_codes[tselected_language]
translated_text = nllb(model_name, nnlbsl, nnlbtl, input_text)
return translated_text, message_text
if model_name.startswith('facebook/mbart-large'):
from transformers import MBartForConditionalGeneration, MBart50TokenizerFast
model = MBartForConditionalGeneration.from_pretrained("facebook/mbart-large-50-many-to-many-mmt")
tokenizer = MBart50TokenizerFast.from_pretrained("facebook/mbart-large-50-many-to-many-mmt")
# translate source to target
tokenizer.src_lang = languagecodes.mbart_large_languages[sselected_language]
encoded = tokenizer(input_text, return_tensors="pt")
generated_tokens = model.generate(
**encoded,
forced_bos_token_id=tokenizer.lang_code_to_id[languagecodes.mbart_large_languages[tselected_language]]
)
return tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)[0], message_text
if 'Unbabel' in model_name:
pipe = pipeline("text-generation", model=model_name, torch_dtype=torch.bfloat16, device_map="auto")
messages = [{"role": "user",
"content": f"Translate the following text from {sselected_language} into {tselected_language}.\n{sselected_language}: {input_text}.\n{tselected_language}:"}]
prompt = pipe.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=False)
outputs = pipe(prompt, max_new_tokens=256, do_sample=False)
translated_text = outputs[0]["generated_text"]
start_marker = "<end_of_turn>"
if start_marker in translated_text:
translated_text = translated_text.split(start_marker)[1].strip()
return translated_text, message_text
if model_name.startswith('t5'):
tokenizer = T5Tokenizer.from_pretrained(model_name)
model = T5ForConditionalGeneration.from_pretrained(model_name, device_map="auto")
if model_name.startswith("Helsinki-NLP"):
prompt = input_text
else:
prompt = f"translate {sselected_language} to {tselected_language}: {input_text}"
input_ids = tokenizer.encode(prompt, return_tensors="pt")
output_ids = model.generate(input_ids, max_length=512)
translated_text = tokenizer.decode(output_ids[0], skip_special_tokens=True)
message_text = f'Translated from {sselected_language} to {tselected_language} with {model_name}.'
print(f'Translating from {sselected_language} to {tselected_language} with {model_name}:', f'{input_text} = {translated_text}', sep='\n')
return translated_text, message_text
# Define a function to swap dropdown values
def swap_languages(src_lang, tgt_lang):
return tgt_lang, src_lang
def create_interface():
with gr.Blocks() as interface:
gr.Markdown("### Machine Text Translation")
with gr.Row():
input_text = gr.Textbox(label="Enter text to translate:", placeholder="Type your text here, maximum 512 tokens")
with gr.Row():
sselected_language = gr.Dropdown(choices=options, value = options[0], label="Source language", interactive=True)
tselected_language = gr.Dropdown(choices=options, value = options[1], label="Target language", interactive=True)
swap_button = gr.Button("Swap Languages", size="md")
swap_button.click(fn=swap_languages, inputs=[sselected_language, tselected_language], outputs=[sselected_language, tselected_language], api_name=False, show_api=False)
model_name = gr.Dropdown(choices=models, label=f"Select model. Default is {models[0]}.", value = models[0], interactive=True)
translate_button = gr.Button("Translate")
translated_text = gr.Textbox(label="Translated text:", placeholder="Display field for translation", interactive=False, show_copy_button=True)
message_text = gr.Textbox(label="Messages:", placeholder="Display field for status and error messages", interactive=False,
value=f'Default translation settings: from {sselected_language.value} to {tselected_language.value} with {model_name.value}.')
allmodels = gr.Textbox(label="Models:", interactive=False, show_copy_button=True, value=', '.join(models))
translate_button.click(
fn=translate_text,
inputs=[input_text, sselected_language, tselected_language, model_name],
outputs=[translated_text, message_text]
)
return interface
interface = create_interface()
if __name__ == "__main__":
interface.launch(mcp_server=True)
# interface.queue().launch(server_name="0.0.0.0", show_error=True, server_port=7860, mcp_server=True) |