nvidia/Riva-Translate-4B-Instruct-v2

Model

18

stars

30

commits

1

repos using this model

1

linked in READMEs

Jul 30, 2026

updated

conversational
endpoints_compatible
mistral
safetensors
text-generation
text-generation-inference
transformers

README

Riva-Translate-4B-Instruct-v2

Model Overview

The Riva-Translate-4B-Instruct-v2 Neural Machine Translation model translates text in English and 36 non-English languages. The supported languages are: English(en), Czech(cs), Danish(da), German(de), Greek(el), European Spanish(es-ES), LATAM Spanish(es-US), Finnish(fi), French(fr), Hungarian(hu), Italian(it), Lithuanian(lt), Latvian(lv), Dutch(nl), Norwegian(no), Polish(pl), European Portuguese(pt-PT), Brazilian Portuguese(pt-BR), Romanian(ro), Russian(ru), Slovak(sk), Swedish(sv), Simplified Chinese(zh-CN), Traditional Chinese(zh-TW), Japanese(ja), Hindi(hi), Korean(ko), Estonian(et), Slovenian(sl), Bulgarian(bg), Ukrainian(uk), Croatian(hr), Arabic(ar), Vietnamese(vi), Turkish(tr), Indonesian(id), Thai(th). It supports both sentence- and document-level translation. The model surpasses all in-house NMT models we've built so far.

Model Developer: NVIDIA

Model Dates: Riva-Translate-4B-Instruct-v2 was trained between Nov 2025 and May 2026.

License

GOVERNING TERMS: Use of the model is governed by the NVIDIA Open Model License Agreement ADDITIONAL INFORMATION: Apache License, Version 2.0.

Quick Start Guide

How to Choose the Language Pair

To select a language pair for translation, include one of the following tags in the system prompt:

  • en-zh-cn or en-zh: English to Simplified Chinese
  • en-zh-tw: English to Traditional Chinese
  • en-ar: English to Arabic
  • en-bg: English to Bulgarian
  • en-cs: English to Czech
  • en-da: English to Danish
  • en-de: English to German
  • en-el: English to Greek
  • en-es or en-es-es: English to European Spanish
  • en-es-us: English to Latin American Spanish
  • en-et: English to Estonian
  • en-fi: English to Finnish
  • en-fr: English to French
  • en-hi: English to Hindi
  • en-hr: English to Croatian
  • en-hu: English to Hungarian
  • en-id: English to Indonesian
  • en-it: English to Italian
  • en-ja: English to Japanese
  • en-ko: English to Korean
  • en-lt: English to Lithuanian
  • en-lv: English to Latvian
  • en-nl: English to Dutch
  • en-no: English to Norwegian
  • en-pl: English to Polish
  • en-pt or en-pt-pt: English to European Portuguese
  • en-pt-br: English to Brazilian Portuguese
  • en-ro: English to Romanian
  • en-ru: English to Russian
  • en-sk: English to Slovak
  • en-sl: English to Slovenian
  • en-sv: English to Swedish
  • en-th: English to Thai
  • en-tr: English to Turkish
  • en-uk: English to Ukrainian
  • en-vi: English to Vietnamese
  • zh-en or zh-cn-en: Simplified Chinese to English
  • zh-tw-en: Traditional Chinese to English
  • ar-en: Arabic to English
  • bg-en: Bulgarian to English
  • cs-en: Czech to English
  • da-en: Danish to English
  • de-en: German to English
  • el-en: Greek to English
  • es-en or es-es-en: European Spanish to English
  • es-us-en: Latin American Spanish to English
  • et-en: Estonian to English
  • fi-en: Finnish to English
  • fr-en: French to English
  • hi-en: Hindi to English
  • hr-en: Croatian to English
  • hu-en: Hungarian to English
  • id-en: Indonesian to English
  • it-en: Italian to English
  • ja-en: Japanese to English
  • ko-en: Korean to English
  • lt-en: Lithuanian to English
  • lv-en: Latvian to English
  • nl-en: Dutch to English
  • no-en: Norwegian to English
  • pl-en: Polish to English
  • pt-en or pt-pt-en: European Portuguese to English
  • pt-br-en: Brazilian Portuguese to English
  • ro-en: Romanian to English
  • ru-en: Russian to English
  • sk-en: Slovak to English
  • sl-en: Slovenian to English
  • sv-en: Swedish to English
  • th-en: Thai to English
  • tr-en: Turkish to English
  • uk-en: Ukrainian to English
  • vi-en: Vietnamese to English

Use it with Transformers

from transformers import AutoTokenizer, AutoModelForCausalLM


tokenizer = AutoTokenizer.from_pretrained("nvidia/Riva-Translate-4B-Instruct-v2")
model = AutoModelForCausalLM.from_pretrained("nvidia/Riva-Translate-4B-Instruct-v2")

messages = [
    {
        "role": "system",
        "content": "en-zh-cn",
    },
    {"role": "user", "content": "The GRACE mission is a collaboration between the NASA and German Aerospace Center.?"},
 ]
tokenized_chat = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True, return_tensors="pt").to(model.device)
outputs = model.generate(tokenized_chat,  max_new_tokens=128, pad_token_id=tokenizer.eos_token_id)
print(tokenizer.decode(outputs[0]))

Use it with vLLM

To install vllm, use the following pip command in a terminal within a supported environment.

pip install vllm: 0.19.1

Launch a vLLM server using the below python command. In this example, we use a context length of 8k as supported by the model.

FLASHINFER_DISABLE_VERSION_CHECK=1 python3 -m vllm.entrypoints.openai.api_server \
    --model nvidia/Riva-Translate-4B-Instruct-v2 \
    --dtype bfloat16 \
    --gpu-memory-utilization 0.95 \
    --max-model-len 8192 \
    --host 0.0.0.0 \
    --port 8000 \
    --tensor-parallel-size 1 \
    --served-model-name Riva-Translate-4B-Instruct-v2

Alternatively, you can use Docker to launch a vLLM server.

docker run --runtime nvidia --gpus all \
           -v ~/.cache/huggingface:/root/.cache/huggingface \
           -p 8000:8000 \
           --ipc=host \
           vllm/vllm-openai:v0.5.3.post1 \
           --model nvidia/Riva-Translate-4B-Instruct-v2 \
           --dtype bfloat16 \
           --gpu-memory-utilization 0.95 \
           --max-model-len 8192 \
           --host 0.0.0.0 \
           --port 8000 \
           --tensor-parallel-size 1 \
           --served-model-name Riva-Translate-4B-Instruct-v2


If you are using DGX Spark or Jetson Thor, please use this vllm container. On Jetson Thor, be sure to include --runtime nvidia when running the Docker container.

# On DGX SPark or Jetson Thor
docker run \
  --runtime nvidia \ # Remove this on DGX Spark
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  -p 8000:8000 \
  --ipc=host \
  nvcr.io/nvidia/vllm:25.12.post1-py3 \
  vllm serve nvidia/Riva-Translate-4B-Instruct-v2 \
    --dtype bfloat16 \
    --gpu-memory-utilization 0.95 \
    --max-model-len 8192 \
    --host 0.0.0.0 \
    --port 8000 \
    --tensor-parallel-size 1 \
    --served-model-name Riva-Translate-4B-Instruct-v2


On Jetson Thor, the previous vLLM cache is not currently cleaned automatically, so it must be cleared manually. Always run this command on the host before serving any model on Jetson Thor.

sudo sysctl -w vm.drop_caches=3

Here is an example client code for vLLM.

curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json"
-d '{
"model": "Riva-Translate-4B-Instruct-v2",
"messages": [
      {"role": "system", "content": "en-zh"},
      {"role": "user", "content": "The GRACE mission is a collaboration between the NASA and German Aerospace Center.?"}
    ]
}'

Chat Template Structure

{%- set language_pairs = {
  'en-zh-cn': {'source': 'English', 'target': 'Simplified Chinese'},
  'en-zh': {'source': 'English', 'target': 'Simplified Chinese'},
  'en-zh-tw': {'source': 'English', 'target': 'Traditional Chinese'},
  'en-ar': {'source': 'English', 'target': 'Arabic'},
  'en-de': {'source': 'English', 'target': 'German'},
  'en-es': {'source': 'English', 'target': 'European Spanish'},
  'en-es-es': {'source': 'English', 'target': 'European Spanish'},
  'en-es-us': {'source': 'English', 'target': 'Latin American Spanish'},
  'en-fr': {'source': 'English', 'target': 'French'},
  'en-ja': {'source': 'English', 'target': 'Japanese'},
  'en-ko': {'source': 'English', 'target': 'Korean'},
  'en-ru': {'source': 'English', 'target': 'Russian'},
  'en-pt': {'source': 'English', 'target': 'Brazilian Portuguese'},
  'en-pt-br': {'source': 'English', 'target': 'Brazilian Portuguese'},
  'en-pt-pt': {'source': 'English', 'target': 'European Portuguese'},
  'zh-en': {'source': 'Simplified Chinese', 'target': 'English'},
  'zh-cn-en': {'source': 'Simplified Chinese', 'target': 'English'},
  'zh-tw-en': {'source': 'Traditional Chinese', 'target': 'English'},
  'ar-en': {'source': 'Arabic', 'target': 'English'},
  'de-en': {'source': 'German', 'target': 'English'},
  'es-en': {'source': 'European Spanish', 'target': 'English'},
  'es-es-en': {'source': 'European Spanish', 'target': 'English'},
  'es-us-en': {'source': 'Latin American Spanish', 'target': 'English'},
  'fr-en': {'source': 'French', 'target': 'English'},
  'ja-en': {'source': 'Japanese', 'target': 'English'},
  'ko-en': {'source': 'Korean', 'target': 'English'},
  'ru-en': {'source': 'Russian', 'target': 'English'},
  'pt-en': {'source': 'Brazilian Portuguese', 'target': 'English'},
  'pt-br-en': {'source': 'Brazilian Portuguese', 'target': 'English'},
  'en-it': {'source': 'English', 'target': 'Italian'},
  'it-en': {'source': 'Italian', 'target': 'English'},
  'en-nl': {'source': 'English', 'target': 'Dutch'},
  'nl-en': {'source': 'Dutch', 'target': 'English'},
  'en-pl': {'source': 'English', 'target': 'Polish'},
  'pl-en': {'source': 'Polish', 'target': 'English'},
  'en-cs': {'source': 'English', 'target': 'Czech'},
  'cs-en': {'source': 'Czech', 'target': 'English'},
  'en-sv': {'source': 'English', 'target': 'Swedish'},
  'sv-en': {'source': 'Swedish', 'target': 'English'},
  'en-da': {'source': 'English', 'target': 'Danish'},
  'da-en': {'source': 'Danish', 'target': 'English'},
  'en-fi': {'source': 'English', 'target': 'Finnish'},
  'fi-en': {'source': 'Finnish', 'target': 'English'},
  'en-no': {'source': 'English', 'target': 'Norwegian'},
  'no-en': {'source': 'Norwegian', 'target': 'English'},
  'en-hu': {'source': 'English', 'target': 'Hungarian'},
  'hu-en': {'source': 'Hungarian', 'target': 'English'},
  'en-ro': {'source': 'English', 'target': 'Romanian'},
  'ro-en': {'source': 'Romanian', 'target': 'English'},
  'en-bg': {'source': 'English', 'target': 'Bulgarian'},
  'bg-en': {'source': 'Bulgarian', 'target': 'English'},
  'en-uk': {'source': 'English', 'target': 'Ukrainian'},
  'uk-en': {'source': 'Ukrainian', 'target': 'English'},
  'en-sk': {'source': 'English', 'target': 'Slovak'},
  'sk-en': {'source': 'Slovak', 'target': 'English'},
  'en-hr': {'source': 'English', 'target': 'Croatian'},
  'hr-en': {'source': 'Croatian', 'target': 'English'},
  'en-sl': {'source': 'English', 'target': 'Slovenian'},
  'sl-en': {'source': 'Slovenian', 'target': 'English'},
  'en-et': {'source': 'English', 'target': 'Estonian'},
  'et-en': {'source': 'Estonian', 'target': 'English'},
  'en-lv': {'source': 'English', 'target': 'Latvian'},
  'lv-en': {'source': 'Latvian', 'target': 'English'},
  'en-lt': {'source': 'English', 'target': 'Lithuanian'},
  'lt-en': {'source': 'Lithuanian', 'target': 'English'},
  'en-el': {'source': 'English', 'target': 'Greek'},
  'el-en': {'source': 'Greek', 'target': 'English'},
  'en-tr': {'source': 'English', 'target': 'Turkish'},
  'tr-en': {'source': 'Turkish', 'target': 'English'},
  'en-id': {'source': 'English', 'target': 'Indonesian'},
  'id-en': {'source': 'Indonesian', 'target': 'English'},
  'en-vi': {'source': 'English', 'target': 'Vietnamese'},
  'vi-en': {'source': 'Vietnamese', 'target': 'English'},
  'en-th': {'source': 'English', 'target': 'Thai'},
  'th-en': {'source': 'Thai', 'target': 'English'},
  'en-hi': {'source': 'English', 'target': 'Hindi'},
  'hi-en': {'source': 'Hindi', 'target': 'English'} 
} -%}

{%- set system_message = '' -%}
{%- set source_lang = '' -%}
{%- set target_lang = '' -%}

{%- if messages[0]['role'] == 'system' -%}
  {%- set lang_pair = messages[0]['content'] | trim -%}
  {%- set messages = messages[1:] -%}
  {%- if lang_pair in language_pairs -%}
    {%- set source_lang = language_pairs[lang_pair]['source'] -%}
    {%- set target_lang = language_pairs[lang_pair]['target'] -%}
    {%- set system_message = 'You are an expert at translating text from ' + source_lang + ' to ' + target_lang + '.' -%}
  {%- else -%}
    {%- set system_message = 'You are a translation expert.' -%}
  {%- endif -%}
{%- endif -%}

{{- '<s>System\n' + system_message + '</s>\n' -}}

{%- for message in messages -%}
  {%- if (message['role'] in ['user']) != (loop.index0 % 2 == 0) -%}
    {{- raise_exception('Conversation roles must alternate between user and assistant') -}}
  {%- elif message['role'] == 'user' -%}
    {%- set user_content = (
          target_lang
          and 'What is the ' + target_lang + ' translation of the sentence: ' + message['content'] | trim
          or message['content'] | trim
        ) -%}
    {{- '<s>User\n' + user_content + '</s>\n' -}}
  {%- elif message['role'] == 'assistant' -%}
    {{- '<s>Assistant\n' + message['content'] | trim + '</s>\n' -}}
  {%- endif -%}
{%- endfor -%}

{%- if add_generation_prompt -%}
  {{ '<s>Assistant\n' }}
{%- endif -%}

Evaluation

FLORES-101 — En→Any

Target LanguagesacreBLEUCOMET-DAXCOMET-XXL
Czech28.300.890.90
Danish42.000.820.95
German37.100.670.97
Greek22.100.710.84
European Spanish28.900.760.96
Latin America Spanish28.700.760.96
Finnish18.200.890.82
French48.700.830.94
Hungarian20.200.860.90
Italian27.900.750.93
Lithuanian21.400.880.84
Latvian24.800.830.80
Dutch24.100.610.93
Norwegian29.500.800.94
Polish18.200.720.87
European Portuguese44.000.880.96
Brazilian Portuguese48.000.910.96
Romanian36.500.880.91
Russian29.600.740.92
Slovak28.700.880.89
Swedish39.600.850.94
Simplified Chinese40.200.680.91
Traditional Chinese34.800.670.91
Japanese33.400.730.91
Hindi24.600.730.77
Korean29.300.730.91
Estonian21.200.950.81
Slovenian24.400.810.88
Bulgarian35.600.820.91
Ukrainian26.400.740.89
Croatian24.100.810.87
Arabic25.100.650.89
Vietnamese37.100.700.89
Turkish21.700.930.87
Indonesian41.600.850.94
Thai26.800.430.77
AVG30.360.780.90

FLORES-101 — Any→En

Source LanguagesacreBLEUCOMET-DAXCOMET-XXL
Czech40.600.750.94
Danish47.900.830.95
German44.600.770.96
Greek36.300.730.92
European Spanish32.800.750.95
Latin America Spanish32.800.750.95
Finnish33.400.750.89
French45.200.820.96
Hungarian35.500.740.92
Italian35.100.760.95
Lithuanian33.700.640.88
Latvian35.000.700.89
Dutch32.500.700.94
Norwegian43.400.800.94
Polish31.100.670.93
European Portuguese49.600.850.96
Brazilian Portuguese49.600.850.96
Romanian43.800.800.94
Russian36.700.680.94
Slovak39.100.730.93
Swedish47.500.830.95
Simplified Chinese30.000.720.96
Traditional Chinese29.000.700.94
Japanese28.000.690.93
Hindi38.700.740.91
Korean30.300.710.93
Estonian36.400.740.87
Slovenian34.900.690.91
Bulgarian41.300.730.94
Ukrainian40.000.700.93
Croatian37.600.700.91
Arabic40.700.720.92
Vietnamese36.700.730.94
Turkish37.000.750.91
Indonesian43.600.810.95
Thai29.000.660.90
AVG37.760.740.93

WMT24++ — En→Any

Target LanguagesacreBLEUCOMET-DAXCOMET-XXL
Czech21.800.610.73
Danish36.700.580.85
German27.500.450.90
Greek28.900.570.71
European Spanish41.700.650.87
Latin America Spanish41.500.650.86
Finnish21.200.730.73
French34.800.530.81
Hungarian18.100.590.76
Italian32.700.590.82
Lithuanian13.900.610.68
Latvian20.000.540.62
Dutch28.100.430.84
Norwegian37.400.700.86
Polish17.300.490.72
European Portuguese33.000.590.85
Brazilian Portuguese38.500.660.86
Romanian31.600.630.78
Russian20.700.420.79
Slovak19.700.580.72
Swedish35.900.640.85
Simplified Chinese34.900.470.80
Traditional Chinese32.500.540.82
Japanese23.100.460.80
Hindi12.200.390.61
Korean26.500.540.81
Estonian20.700.750.69
Slovenian23.000.560.73
Bulgarian29.100.590.76
Ukrainian23.700.520.76
Croatian21.200.520.72
Arabic9.700.230.73
Vietnamese31.400.400.77
Turkish19.900.610.71
Indonesian29.700.520.82
Thai21.600.240.65
AVG26.670.540.77

WMT24++ — Any→En

Source LanguagesacreBLEUCOMET-DAXCOMET-XXL
Czech34.400.560.84
Danish39.700.660.89
German33.400.590.90
Greek40.400.630.83
European Spanish43.100.670.90
Latin America Spanish43.100.670.90
Finnish32.700.620.81
French36.300.620.88
Hungarian28.800.550.82
Italian39.700.630.87
Lithuanian22.200.400.75
Latvian30.000.510.76
Dutch34.500.580.88
Norwegian44.900.720.89
Polish28.800.520.84
European Portuguese36.000.640.88
Brazilian Portuguese39.300.660.89
Romanian40.100.620.83
Russian27.200.400.84
Slovak29.500.540.83
Swedish42.100.700.89
Simplified Chinese23.600.530.88
Traditional Chinese29.500.610.90
Japanese21.700.470.83
Hindi20.900.540.84
Korean26.000.550.84
Estonian33.500.600.77
Slovenian33.400.520.81
Bulgarian36.700.600.84
Ukrainian33.200.520.81
Croatian33.600.510.80
Arabic22.500.310.75
Vietnamese29.500.500.86
Turkish30.000.590.81
Indonesian32.400.620.88
Thai23.800.480.83
AVG32.680.570.84

Inference

  • Engine: HF, vLLM
  • Test Hardware: NVIDIA A100, H100 80GB, Jetson Thor, DGX Spark

Ethical Considerations

NVIDIA believes Trustworthy AI is a shared responsibility and we have established policies and practices to enable development for a wide array of AI applications. When downloaded or used in accordance with our terms of service, developers should work with their internal model team to ensure this model meets requirements for the relevant industry and use case and addresses unforeseen product misuse.

We advise against circumvention of any provided safety guardrails contained in the Model without a substantially similar guardrail appropriate for your use case. For more details: Safety and Explainability Subcards.

For more detailed information on ethical considerations for this model, please see the Model Card++ Bias, and Privacy Subcards.

Please report model quality, risk, security vulnerabilities or NVIDIA AI Concerns here.

Technical Limitations & Mitigation:

Accuracy varies based on the characteristics of input (Domain, Use Case, Noise, Context, etc.). Grammar errors and semantic issues may be present. As a potential mitigation, the user can change the prompt to get a better translation.

Contributors

Mujojojo

30 commits

nvidia/Riva-Translate-4B-Instruct-v2

Model

18

stars

30

commits

1

repos using this model

1

linked in READMEs

Jul 30, 2026

updated

conversational
endpoints_compatible
mistral
safetensors
text-generation
text-generation-inference
transformers

README

Riva-Translate-4B-Instruct-v2

Model Overview

The Riva-Translate-4B-Instruct-v2 Neural Machine Translation model translates text in English and 36 non-English languages. The supported languages are: English(en), Czech(cs), Danish(da), German(de), Greek(el), European Spanish(es-ES), LATAM Spanish(es-US), Finnish(fi), French(fr), Hungarian(hu), Italian(it), Lithuanian(lt), Latvian(lv), Dutch(nl), Norwegian(no), Polish(pl), European Portuguese(pt-PT), Brazilian Portuguese(pt-BR), Romanian(ro), Russian(ru), Slovak(sk), Swedish(sv), Simplified Chinese(zh-CN), Traditional Chinese(zh-TW), Japanese(ja), Hindi(hi), Korean(ko), Estonian(et), Slovenian(sl), Bulgarian(bg), Ukrainian(uk), Croatian(hr), Arabic(ar), Vietnamese(vi), Turkish(tr), Indonesian(id), Thai(th). It supports both sentence- and document-level translation. The model surpasses all in-house NMT models we've built so far.

Model Developer: NVIDIA

Model Dates: Riva-Translate-4B-Instruct-v2 was trained between Nov 2025 and May 2026.

License

GOVERNING TERMS: Use of the model is governed by the NVIDIA Open Model License Agreement ADDITIONAL INFORMATION: Apache License, Version 2.0.

Quick Start Guide

How to Choose the Language Pair

To select a language pair for translation, include one of the following tags in the system prompt:

  • en-zh-cn or en-zh: English to Simplified Chinese
  • en-zh-tw: English to Traditional Chinese
  • en-ar: English to Arabic
  • en-bg: English to Bulgarian
  • en-cs: English to Czech
  • en-da: English to Danish
  • en-de: English to German
  • en-el: English to Greek
  • en-es or en-es-es: English to European Spanish
  • en-es-us: English to Latin American Spanish
  • en-et: English to Estonian
  • en-fi: English to Finnish
  • en-fr: English to French
  • en-hi: English to Hindi
  • en-hr: English to Croatian
  • en-hu: English to Hungarian
  • en-id: English to Indonesian
  • en-it: English to Italian
  • en-ja: English to Japanese
  • en-ko: English to Korean
  • en-lt: English to Lithuanian
  • en-lv: English to Latvian
  • en-nl: English to Dutch
  • en-no: English to Norwegian
  • en-pl: English to Polish
  • en-pt or en-pt-pt: English to European Portuguese
  • en-pt-br: English to Brazilian Portuguese
  • en-ro: English to Romanian
  • en-ru: English to Russian
  • en-sk: English to Slovak
  • en-sl: English to Slovenian
  • en-sv: English to Swedish
  • en-th: English to Thai
  • en-tr: English to Turkish
  • en-uk: English to Ukrainian
  • en-vi: English to Vietnamese
  • zh-en or zh-cn-en: Simplified Chinese to English
  • zh-tw-en: Traditional Chinese to English
  • ar-en: Arabic to English
  • bg-en: Bulgarian to English
  • cs-en: Czech to English
  • da-en: Danish to English
  • de-en: German to English
  • el-en: Greek to English
  • es-en or es-es-en: European Spanish to English
  • es-us-en: Latin American Spanish to English
  • et-en: Estonian to English
  • fi-en: Finnish to English
  • fr-en: French to English
  • hi-en: Hindi to English
  • hr-en: Croatian to English
  • hu-en: Hungarian to English
  • id-en: Indonesian to English
  • it-en: Italian to English
  • ja-en: Japanese to English
  • ko-en: Korean to English
  • lt-en: Lithuanian to English
  • lv-en: Latvian to English
  • nl-en: Dutch to English
  • no-en: Norwegian to English
  • pl-en: Polish to English
  • pt-en or pt-pt-en: European Portuguese to English
  • pt-br-en: Brazilian Portuguese to English
  • ro-en: Romanian to English
  • ru-en: Russian to English
  • sk-en: Slovak to English
  • sl-en: Slovenian to English
  • sv-en: Swedish to English
  • th-en: Thai to English
  • tr-en: Turkish to English
  • uk-en: Ukrainian to English
  • vi-en: Vietnamese to English

Use it with Transformers

from transformers import AutoTokenizer, AutoModelForCausalLM


tokenizer = AutoTokenizer.from_pretrained("nvidia/Riva-Translate-4B-Instruct-v2")
model = AutoModelForCausalLM.from_pretrained("nvidia/Riva-Translate-4B-Instruct-v2")

messages = [
    {
        "role": "system",
        "content": "en-zh-cn",
    },
    {"role": "user", "content": "The GRACE mission is a collaboration between the NASA and German Aerospace Center.?"},
 ]
tokenized_chat = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True, return_tensors="pt").to(model.device)
outputs = model.generate(tokenized_chat,  max_new_tokens=128, pad_token_id=tokenizer.eos_token_id)
print(tokenizer.decode(outputs[0]))

Use it with vLLM

To install vllm, use the following pip command in a terminal within a supported environment.

pip install vllm: 0.19.1

Launch a vLLM server using the below python command. In this example, we use a context length of 8k as supported by the model.

FLASHINFER_DISABLE_VERSION_CHECK=1 python3 -m vllm.entrypoints.openai.api_server \
    --model nvidia/Riva-Translate-4B-Instruct-v2 \
    --dtype bfloat16 \
    --gpu-memory-utilization 0.95 \
    --max-model-len 8192 \
    --host 0.0.0.0 \
    --port 8000 \
    --tensor-parallel-size 1 \
    --served-model-name Riva-Translate-4B-Instruct-v2

Alternatively, you can use Docker to launch a vLLM server.

docker run --runtime nvidia --gpus all \
           -v ~/.cache/huggingface:/root/.cache/huggingface \
           -p 8000:8000 \
           --ipc=host \
           vllm/vllm-openai:v0.5.3.post1 \
           --model nvidia/Riva-Translate-4B-Instruct-v2 \
           --dtype bfloat16 \
           --gpu-memory-utilization 0.95 \
           --max-model-len 8192 \
           --host 0.0.0.0 \
           --port 8000 \
           --tensor-parallel-size 1 \
           --served-model-name Riva-Translate-4B-Instruct-v2


If you are using DGX Spark or Jetson Thor, please use this vllm container. On Jetson Thor, be sure to include --runtime nvidia when running the Docker container.

# On DGX SPark or Jetson Thor
docker run \
  --runtime nvidia \ # Remove this on DGX Spark
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  -p 8000:8000 \
  --ipc=host \
  nvcr.io/nvidia/vllm:25.12.post1-py3 \
  vllm serve nvidia/Riva-Translate-4B-Instruct-v2 \
    --dtype bfloat16 \
    --gpu-memory-utilization 0.95 \
    --max-model-len 8192 \
    --host 0.0.0.0 \
    --port 8000 \
    --tensor-parallel-size 1 \
    --served-model-name Riva-Translate-4B-Instruct-v2


On Jetson Thor, the previous vLLM cache is not currently cleaned automatically, so it must be cleared manually. Always run this command on the host before serving any model on Jetson Thor.

sudo sysctl -w vm.drop_caches=3

Here is an example client code for vLLM.

curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json"
-d '{
"model": "Riva-Translate-4B-Instruct-v2",
"messages": [
      {"role": "system", "content": "en-zh"},
      {"role": "user", "content": "The GRACE mission is a collaboration between the NASA and German Aerospace Center.?"}
    ]
}'

Chat Template Structure

{%- set language_pairs = {
  'en-zh-cn': {'source': 'English', 'target': 'Simplified Chinese'},
  'en-zh': {'source': 'English', 'target': 'Simplified Chinese'},
  'en-zh-tw': {'source': 'English', 'target': 'Traditional Chinese'},
  'en-ar': {'source': 'English', 'target': 'Arabic'},
  'en-de': {'source': 'English', 'target': 'German'},
  'en-es': {'source': 'English', 'target': 'European Spanish'},
  'en-es-es': {'source': 'English', 'target': 'European Spanish'},
  'en-es-us': {'source': 'English', 'target': 'Latin American Spanish'},
  'en-fr': {'source': 'English', 'target': 'French'},
  'en-ja': {'source': 'English', 'target': 'Japanese'},
  'en-ko': {'source': 'English', 'target': 'Korean'},
  'en-ru': {'source': 'English', 'target': 'Russian'},
  'en-pt': {'source': 'English', 'target': 'Brazilian Portuguese'},
  'en-pt-br': {'source': 'English', 'target': 'Brazilian Portuguese'},
  'en-pt-pt': {'source': 'English', 'target': 'European Portuguese'},
  'zh-en': {'source': 'Simplified Chinese', 'target': 'English'},
  'zh-cn-en': {'source': 'Simplified Chinese', 'target': 'English'},
  'zh-tw-en': {'source': 'Traditional Chinese', 'target': 'English'},
  'ar-en': {'source': 'Arabic', 'target': 'English'},
  'de-en': {'source': 'German', 'target': 'English'},
  'es-en': {'source': 'European Spanish', 'target': 'English'},
  'es-es-en': {'source': 'European Spanish', 'target': 'English'},
  'es-us-en': {'source': 'Latin American Spanish', 'target': 'English'},
  'fr-en': {'source': 'French', 'target': 'English'},
  'ja-en': {'source': 'Japanese', 'target': 'English'},
  'ko-en': {'source': 'Korean', 'target': 'English'},
  'ru-en': {'source': 'Russian', 'target': 'English'},
  'pt-en': {'source': 'Brazilian Portuguese', 'target': 'English'},
  'pt-br-en': {'source': 'Brazilian Portuguese', 'target': 'English'},
  'en-it': {'source': 'English', 'target': 'Italian'},
  'it-en': {'source': 'Italian', 'target': 'English'},
  'en-nl': {'source': 'English', 'target': 'Dutch'},
  'nl-en': {'source': 'Dutch', 'target': 'English'},
  'en-pl': {'source': 'English', 'target': 'Polish'},
  'pl-en': {'source': 'Polish', 'target': 'English'},
  'en-cs': {'source': 'English', 'target': 'Czech'},
  'cs-en': {'source': 'Czech', 'target': 'English'},
  'en-sv': {'source': 'English', 'target': 'Swedish'},
  'sv-en': {'source': 'Swedish', 'target': 'English'},
  'en-da': {'source': 'English', 'target': 'Danish'},
  'da-en': {'source': 'Danish', 'target': 'English'},
  'en-fi': {'source': 'English', 'target': 'Finnish'},
  'fi-en': {'source': 'Finnish', 'target': 'English'},
  'en-no': {'source': 'English', 'target': 'Norwegian'},
  'no-en': {'source': 'Norwegian', 'target': 'English'},
  'en-hu': {'source': 'English', 'target': 'Hungarian'},
  'hu-en': {'source': 'Hungarian', 'target': 'English'},
  'en-ro': {'source': 'English', 'target': 'Romanian'},
  'ro-en': {'source': 'Romanian', 'target': 'English'},
  'en-bg': {'source': 'English', 'target': 'Bulgarian'},
  'bg-en': {'source': 'Bulgarian', 'target': 'English'},
  'en-uk': {'source': 'English', 'target': 'Ukrainian'},
  'uk-en': {'source': 'Ukrainian', 'target': 'English'},
  'en-sk': {'source': 'English', 'target': 'Slovak'},
  'sk-en': {'source': 'Slovak', 'target': 'English'},
  'en-hr': {'source': 'English', 'target': 'Croatian'},
  'hr-en': {'source': 'Croatian', 'target': 'English'},
  'en-sl': {'source': 'English', 'target': 'Slovenian'},
  'sl-en': {'source': 'Slovenian', 'target': 'English'},
  'en-et': {'source': 'English', 'target': 'Estonian'},
  'et-en': {'source': 'Estonian', 'target': 'English'},
  'en-lv': {'source': 'English', 'target': 'Latvian'},
  'lv-en': {'source': 'Latvian', 'target': 'English'},
  'en-lt': {'source': 'English', 'target': 'Lithuanian'},
  'lt-en': {'source': 'Lithuanian', 'target': 'English'},
  'en-el': {'source': 'English', 'target': 'Greek'},
  'el-en': {'source': 'Greek', 'target': 'English'},
  'en-tr': {'source': 'English', 'target': 'Turkish'},
  'tr-en': {'source': 'Turkish', 'target': 'English'},
  'en-id': {'source': 'English', 'target': 'Indonesian'},
  'id-en': {'source': 'Indonesian', 'target': 'English'},
  'en-vi': {'source': 'English', 'target': 'Vietnamese'},
  'vi-en': {'source': 'Vietnamese', 'target': 'English'},
  'en-th': {'source': 'English', 'target': 'Thai'},
  'th-en': {'source': 'Thai', 'target': 'English'},
  'en-hi': {'source': 'English', 'target': 'Hindi'},
  'hi-en': {'source': 'Hindi', 'target': 'English'} 
} -%}

{%- set system_message = '' -%}
{%- set source_lang = '' -%}
{%- set target_lang = '' -%}

{%- if messages[0]['role'] == 'system' -%}
  {%- set lang_pair = messages[0]['content'] | trim -%}
  {%- set messages = messages[1:] -%}
  {%- if lang_pair in language_pairs -%}
    {%- set source_lang = language_pairs[lang_pair]['source'] -%}
    {%- set target_lang = language_pairs[lang_pair]['target'] -%}
    {%- set system_message = 'You are an expert at translating text from ' + source_lang + ' to ' + target_lang + '.' -%}
  {%- else -%}
    {%- set system_message = 'You are a translation expert.' -%}
  {%- endif -%}
{%- endif -%}

{{- '<s>System\n' + system_message + '</s>\n' -}}

{%- for message in messages -%}
  {%- if (message['role'] in ['user']) != (loop.index0 % 2 == 0) -%}
    {{- raise_exception('Conversation roles must alternate between user and assistant') -}}
  {%- elif message['role'] == 'user' -%}
    {%- set user_content = (
          target_lang
          and 'What is the ' + target_lang + ' translation of the sentence: ' + message['content'] | trim
          or message['content'] | trim
        ) -%}
    {{- '<s>User\n' + user_content + '</s>\n' -}}
  {%- elif message['role'] == 'assistant' -%}
    {{- '<s>Assistant\n' + message['content'] | trim + '</s>\n' -}}
  {%- endif -%}
{%- endfor -%}

{%- if add_generation_prompt -%}
  {{ '<s>Assistant\n' }}
{%- endif -%}

Evaluation

FLORES-101 — En→Any

Target LanguagesacreBLEUCOMET-DAXCOMET-XXL
Czech28.300.890.90
Danish42.000.820.95
German37.100.670.97
Greek22.100.710.84
European Spanish28.900.760.96
Latin America Spanish28.700.760.96
Finnish18.200.890.82
French48.700.830.94
Hungarian20.200.860.90
Italian27.900.750.93
Lithuanian21.400.880.84
Latvian24.800.830.80
Dutch24.100.610.93
Norwegian29.500.800.94
Polish18.200.720.87
European Portuguese44.000.880.96
Brazilian Portuguese48.000.910.96
Romanian36.500.880.91
Russian29.600.740.92
Slovak28.700.880.89
Swedish39.600.850.94
Simplified Chinese40.200.680.91
Traditional Chinese34.800.670.91
Japanese33.400.730.91
Hindi24.600.730.77
Korean29.300.730.91
Estonian21.200.950.81
Slovenian24.400.810.88
Bulgarian35.600.820.91
Ukrainian26.400.740.89
Croatian24.100.810.87
Arabic25.100.650.89
Vietnamese37.100.700.89
Turkish21.700.930.87
Indonesian41.600.850.94
Thai26.800.430.77
AVG30.360.780.90

FLORES-101 — Any→En

Source LanguagesacreBLEUCOMET-DAXCOMET-XXL
Czech40.600.750.94
Danish47.900.830.95
German44.600.770.96
Greek36.300.730.92
European Spanish32.800.750.95
Latin America Spanish32.800.750.95
Finnish33.400.750.89
French45.200.820.96
Hungarian35.500.740.92
Italian35.100.760.95
Lithuanian33.700.640.88
Latvian35.000.700.89
Dutch32.500.700.94
Norwegian43.400.800.94
Polish31.100.670.93
European Portuguese49.600.850.96
Brazilian Portuguese49.600.850.96
Romanian43.800.800.94
Russian36.700.680.94
Slovak39.100.730.93
Swedish47.500.830.95
Simplified Chinese30.000.720.96
Traditional Chinese29.000.700.94
Japanese28.000.690.93
Hindi38.700.740.91
Korean30.300.710.93
Estonian36.400.740.87
Slovenian34.900.690.91
Bulgarian41.300.730.94
Ukrainian40.000.700.93
Croatian37.600.700.91
Arabic40.700.720.92
Vietnamese36.700.730.94
Turkish37.000.750.91
Indonesian43.600.810.95
Thai29.000.660.90
AVG37.760.740.93

WMT24++ — En→Any

Target LanguagesacreBLEUCOMET-DAXCOMET-XXL
Czech21.800.610.73
Danish36.700.580.85
German27.500.450.90
Greek28.900.570.71
European Spanish41.700.650.87
Latin America Spanish41.500.650.86
Finnish21.200.730.73
French34.800.530.81
Hungarian18.100.590.76
Italian32.700.590.82
Lithuanian13.900.610.68
Latvian20.000.540.62
Dutch28.100.430.84
Norwegian37.400.700.86
Polish17.300.490.72
European Portuguese33.000.590.85
Brazilian Portuguese38.500.660.86
Romanian31.600.630.78
Russian20.700.420.79
Slovak19.700.580.72
Swedish35.900.640.85
Simplified Chinese34.900.470.80
Traditional Chinese32.500.540.82
Japanese23.100.460.80
Hindi12.200.390.61
Korean26.500.540.81
Estonian20.700.750.69
Slovenian23.000.560.73
Bulgarian29.100.590.76
Ukrainian23.700.520.76
Croatian21.200.520.72
Arabic9.700.230.73
Vietnamese31.400.400.77
Turkish19.900.610.71
Indonesian29.700.520.82
Thai21.600.240.65
AVG26.670.540.77

WMT24++ — Any→En

Source LanguagesacreBLEUCOMET-DAXCOMET-XXL
Czech34.400.560.84
Danish39.700.660.89
German33.400.590.90
Greek40.400.630.83
European Spanish43.100.670.90
Latin America Spanish43.100.670.90
Finnish32.700.620.81
French36.300.620.88
Hungarian28.800.550.82
Italian39.700.630.87
Lithuanian22.200.400.75
Latvian30.000.510.76
Dutch34.500.580.88
Norwegian44.900.720.89
Polish28.800.520.84
European Portuguese36.000.640.88
Brazilian Portuguese39.300.660.89
Romanian40.100.620.83
Russian27.200.400.84
Slovak29.500.540.83
Swedish42.100.700.89
Simplified Chinese23.600.530.88
Traditional Chinese29.500.610.90
Japanese21.700.470.83
Hindi20.900.540.84
Korean26.000.550.84
Estonian33.500.600.77
Slovenian33.400.520.81
Bulgarian36.700.600.84
Ukrainian33.200.520.81
Croatian33.600.510.80
Arabic22.500.310.75
Vietnamese29.500.500.86
Turkish30.000.590.81
Indonesian32.400.620.88
Thai23.800.480.83
AVG32.680.570.84

Inference

  • Engine: HF, vLLM
  • Test Hardware: NVIDIA A100, H100 80GB, Jetson Thor, DGX Spark

Ethical Considerations

NVIDIA believes Trustworthy AI is a shared responsibility and we have established policies and practices to enable development for a wide array of AI applications. When downloaded or used in accordance with our terms of service, developers should work with their internal model team to ensure this model meets requirements for the relevant industry and use case and addresses unforeseen product misuse.

We advise against circumvention of any provided safety guardrails contained in the Model without a substantially similar guardrail appropriate for your use case. For more details: Safety and Explainability Subcards.

For more detailed information on ethical considerations for this model, please see the Model Card++ Bias, and Privacy Subcards.

Please report model quality, risk, security vulnerabilities or NVIDIA AI Concerns here.

Technical Limitations & Mitigation:

Accuracy varies based on the characteristics of input (Domain, Use Case, Noise, Context, etc.). Grammar errors and semantic issues may be present. As a potential mitigation, the user can change the prompt to get a better translation.

Contributors

Mujojojo

30 commits