1from transformers import AutoTokenizer
2from optimum.onnxruntime import ORTModelForSeq2SeqLM
3
4model_id = "sotalab/nllb-trilingual-en-vi-ja-onnx"
5
6tokenizer = AutoTokenizer.from_pretrained(model_id)
7model = ORTModelForSeq2SeqLM.from_pretrained(
8 model_id,
9 encoder_file_name="encoder_model_quantized.onnx",
10 decoder_file_name="decoder_model_quantized.onnx",
11 decoder_with_past_file_name="decoder_with_past_model_quantized.onnx",
12)
13
14def translate(text, src_lang, tgt_lang):
15 tokenizer.src_lang = src_lang
16 inputs = tokenizer(text, return_tensors="pt", max_length=256, truncation=True)
17 tgt_lang_id = tokenizer.convert_tokens_to_ids(tgt_lang)
18
19 outputs = model.generate(
20 **inputs,
21 forced_bos_token_id=tgt_lang_id,
22 max_new_tokens=256,
23 num_beams=1,
24 )
25 return tokenizer.decode(outputs[0], skip_special_tokens=True)
26
27# English to Vietnamese
28print(translate("Hello, how are you?", "eng_Latn", "vie_Latn"))
29# Output: Chào, bạn khỏe không?
30
31# English to Japanese
32print(translate("Hello, how are you?", "eng_Latn", "jpn_Jpan"))
33# Output: こんにちは、お元気ですか?
34
35# Vietnamese to Japanese
36print(translate("Tôi thích học tiếng Nhật.", "vie_Latn", "jpn_Jpan"))
37# Output: 私は日本語を学ぶのが好きです。
1def translate_batch(texts, src_lang, tgt_lang):
2 tokenizer.src_lang = src_lang
3 inputs = tokenizer(texts, return_tensors="pt", padding=True, truncation=True, max_length=256)
4 tgt_lang_id = tokenizer.convert_tokens_to_ids(tgt_lang)
5
6 outputs = model.generate(**inputs, forced_bos_token_id=tgt_lang_id, max_new_tokens=256, num_beams=1)
7 return [tokenizer.decode(out, skip_special_tokens=True) for out in outputs]
8
9texts = ["Good morning", "How are you?", "Thank you very much"]
10results = translate_batch(texts, "eng_Latn", "vie_Latn")
11for text, result in zip(texts, results):
12 print(f"{text} → {result}")
1class TrilingualTranslator:
2 LANG_CODES = {"en": "eng_Latn", "vi": "vie_Latn", "ja": "jpn_Jpan"}
3
4 def __init__(self, model_id="sotalab/nllb-trilingual-en-vi-ja-onnx"):
5 from transformers import AutoTokenizer
6 from optimum.onnxruntime import ORTModelForSeq2SeqLM
7
8 self.tokenizer = AutoTokenizer.from_pretrained(model_id)
9 self.model = ORTModelForSeq2SeqLM.from_pretrained(
10 model_id,
11 encoder_file_name="encoder_model_quantized.onnx",
12 decoder_file_name="decoder_model_quantized.onnx",
13 decoder_with_past_file_name="decoder_with_past_model_quantized.onnx",
14 )
15
16 def translate(self, text, src="en", tgt="vi"):
17 src_code = self.LANG_CODES[src]
18 tgt_code = self.LANG_CODES[tgt]
19
20 self.tokenizer.src_lang = src_code
21 inputs = self.tokenizer(text, return_tensors="pt", max_length=256, truncation=True)
22 tgt_lang_id = self.tokenizer.convert_tokens_to_ids(tgt_code)
23
24 outputs = self.model.generate(**inputs, forced_bos_token_id=tgt_lang_id, max_new_tokens=256, num_beams=1)
25 return self.tokenizer.decode(outputs[0], skip_special_tokens=True)
26
27# Usage
28translator = TrilingualTranslator()
29print(translator.translate("Hello world", "en", "vi"))
30print(translator.translate("Hello world", "en", "ja"))
This model is released for Research Only.
1@misc{nllb-trilingual-2024,
2 author = {SotaLab},
3 title = {NLLB Trilingual Translation Model (EN-VI-JA) - INT8 ONNX},
4 year = {2024},
5 publisher = {Hugging Face},
6 url = {https://huggingface.co/sotalab/nllb-trilingual-en-vi-ja-onnx}
7}