Instructions to use Sunbird/Sunflower-Gemma4-E2B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use Sunbird/Sunflower-Gemma4-E2B with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="Sunbird/Sunflower-Gemma4-E2B") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("Sunbird/Sunflower-Gemma4-E2B") model = AutoModelForMultimodalLM.from_pretrained("Sunbird/Sunflower-Gemma4-E2B", device_map="auto") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=40) print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use Sunbird/Sunflower-Gemma4-E2B with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "Sunbird/Sunflower-Gemma4-E2B" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "Sunbird/Sunflower-Gemma4-E2B", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker
docker model run hf.co/Sunbird/Sunflower-Gemma4-E2B
- SGLang
How to use Sunbird/Sunflower-Gemma4-E2B with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "Sunbird/Sunflower-Gemma4-E2B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "Sunbird/Sunflower-Gemma4-E2B", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "Sunbird/Sunflower-Gemma4-E2B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "Sunbird/Sunflower-Gemma4-E2B", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }' - Docker Model Runner
How to use Sunbird/Sunflower-Gemma4-E2B with Docker Model Runner:
docker model run hf.co/Sunbird/Sunflower-Gemma4-E2B
Sunflower-Gemma4-E2B
This is a preview release. The model weights will change between now and the stable release. Benchmark numbers, prompt behaviour, and output quality may all shift. Please don't pin production systems to this checkpoint — treat it as a preview for evaluation and feedback.
Sunflower-Gemma4-E2B is a multimodal adaptation of Google's Gemma 4 E2B IT optimised to understand text and speech across 69 African languages. The model is tuned for text translation, speech transcription, instruction-following, and multi-turn chat. It supports text, image, and audio inputs (up to 30s of 16kHz audio), generating text output.
Try it
▶ Open the Colab Demo Notebook
Supported Languages
Coverage varies considerably by language, roughly tracking the amount of training data available.
Translation & Speech Evaluation Covers: Acholi, Afrikaans, Akan, Alur, Amharic, Bambara, Bari, Bemba, Berber, Chichewa, Dagaare, Dagbani, Dinka, Ewe, French, Fulani, Hausa, Igbo, Ik, Ikposo, Jopadhola, Kabyle, Kakwa, Kalenjin, Kanuri, Karamojong, Kikuyu, Kinyarwanda, Kirundi, Kumam, Kupsabiny, Kwamba, Lango, Lendu, Lingala, Lubwisi, Luganda, Lugbara, Lugungu, Lugwere, Luhya, Lumasaba, Lunyole, Luo, Lusoga, Ma'di, Malagasy, Ndebele, Nigerian Pidgin, Oromo, Pokot, Rukiga, Rukonjo, Runyankole, Runyoro, Ruruuli, Rutooro, Samia, Shona, Somali, Sotho, Swahili, Tswana, Wolof, Xhosa, Yoruba, and Zulu.
Note: A language's presence in this list means it was evaluated; it does not imply equal quality across all languages. See evaluation metrics below for details on performance.
Inference
Sunflower-Gemma4-E2B follows standard Transformers patterns, but expects specific prompt formats for translation and speech transcription. Like Qwen, the base model supports a reasoning phase, but we recommend setting enable_thinking=False for standard translation tasks.
Text Translation
Translation expects a fixed instruction template:
Translate from English to {language name}: {text}
messages = [
{"role": "system", "content": "You are Sunflower, a helpful assistant made by Sunbird AI who knows many African languages."},
{"role": "user", "content": "Translate from English to Luganda: Where is the nearest hospital?"}
]
Tip: Use do_sample=False (greedy decoding) and temperature=0 for translation tasks.
Audio Transcription
The model was trained with prompts that explicitly name the spoken language. Convert audio to a 16 kHz mono waveform and keep it to 30 seconds or less.
messages = [
{"role": "system", "content": "You are Sunflower, a helpful assistant made by Sunbird AI who knows many African languages."},
{
"role": "user",
"content": [
{"type": "audio", "audio": audio_array}, # 16kHz mono numpy array
{"type": "text", "text": "Please transcribe this Luganda audio."},
],
},
]
vLLM (Text-Only Inference)
vLLM is highly recommended for fast deployments. Because this is a multimodal model, text-only vLLM setup requires disabling vision/audio inputs to save memory.
import os
os.environ["VLLM_ENABLE_V1_MULTIPROCESSING"] = "0"
from vllm import LLM, SamplingParams
from transformers import AutoProcessor
MODEL_ID = "Sunbird/Sunflower-Gemma4-E2B"
llm = LLM(
MODEL_ID,
dtype="bfloat16",
max_model_len=1024,
limit_mm_per_prompt={"image": 0, "audio": 0}, # Text-only mode
enforce_eager=True,
)
processor = AutoProcessor.from_pretrained(MODEL_ID)
def make_prompt(text, target_lang):
messages = [
{"role": "system", "content": "You are Sunflower, a helpful assistant made by Sunbird AI who knows many African languages."},
{"role": "user", "content": f"Translate from English to {target_lang}: {text}"}
]
return processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
sampling = SamplingParams(temperature=0.0, max_tokens=256)
examples = [
("Good morning, how are you?", "Luganda"),
("The children are going to school today.", "Acholi"),
("I would like to buy three kilograms of rice.", "Swahili"),
]
outputs = llm.generate([make_prompt(t, l) for t, l in examples], sampling)
for (text, lang), out in zip(examples, outputs):
print(f"[{lang}] {text}\n -> {out.outputs[0].text.strip()}\n")
Transformers (Multimodal / Audio)
import torch
import librosa
import numpy as np
from transformers import AutoModelForMultimodalLM, AutoProcessor
MODEL_ID = "Sunbird/Sunflower-Gemma4-E2B"
dtype = torch.bfloat16 if torch.cuda.is_bf16_supported() else torch.float16
processor = AutoProcessor.from_pretrained(MODEL_ID)
model = AutoModelForMultimodalLM.from_pretrained(
MODEL_ID, dtype=dtype, device_map="auto", attn_implementation="sdpa"
).eval()
# Load Audio
audio, _ = librosa.load("audio.wav", sr=16_000, mono=True)
audio = np.asarray(audio, dtype=np.float32)
if len(audio) > 480_000:
raise ValueError("Please provide no more than 30 seconds of audio.")
messages = [
{"role": "system", "content": "You are Sunflower, a helpful assistant made by Sunbird AI who knows many African languages."},
{"role": "user", "content": [
{"type": "audio", "audio": audio},
{"type": "text", "text": "Please transcribe this Luganda audio."}
]}
]
prompt = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = processor(
text=[prompt], audio=[audio], return_tensors="pt",
text_kwargs={"padding": False, "truncation": False, "add_special_tokens": False},
audio_kwargs={"max_length": 480_000}
).to(model.device)
inputs["input_features"] = inputs["input_features"].to(dtype=dtype)
with torch.inference_mode():
output = model.generate(**inputs, max_new_tokens=256, do_sample=False)
new_tokens = output[0][inputs["input_ids"].shape[-1]:]
raw_response = processor.decode(new_tokens, skip_special_tokens=False)
print(processor.parse_response(raw_response)["content"])
Training
The model was adapted via the following stages:
- Continued pretraining on multilingual African-language text (documents, parallel text, transcripts, web, and synthetic text).
- Speech SFT on audio-transcription examples.
- Mixed text-and-audio SFT on translation, instruction, and speech-transcription tasks.
- GRPO post-training to improve translation and general response quality using task-specific reward signals.
Evaluation
Text Translation
Translation quality measured as chrF on the Sunbird/salt69 test split (100 examples per language).
| Languages | Directions | Macro BLEU | Macro chrF | Mean Length Ratio |
|---|---|---|---|---|
| 69 | 138 | 12.20 | 0.3413 | 1.06 |
Click to view full per-language translation results
| Code | Language | EN→X BLEU | EN→X chrF | X→EN BLEU | X→EN chrF | Mean chrF |
|---|---|---|---|---|---|---|
| afr | Afrikaans | 57.68 | 0.7747 | 57.86 | 0.7649 | 0.7698 |
| pcm | Nigerian Pidgin | 32.76 | 0.6438 | 48.27 | 0.7306 | 0.6872 |
| fra | French | 34.08 | 0.6008 | 40.55 | 0.6532 | 0.6270 |
| swa | Swahili | 30.77 | 0.6126 | 38.06 | 0.6270 | 0.6198 |
| zul | Zulu | 19.95 | 0.5949 | 34.19 | 0.5887 | 0.5918 |
| nya | Chichewa | 25.38 | 0.6288 | 31.98 | 0.5537 | 0.5913 |
| xho | Xhosa | 15.57 | 0.5595 | 29.89 | 0.5357 | 0.5476 |
| som | Somali | 15.22 | 0.5180 | 31.48 | 0.5647 | 0.5413 |
| mlg | Malagasy | 19.62 | 0.5458 | 23.64 | 0.4907 | 0.5182 |
| nbl | Ndebele | 12.35 | 0.5109 | 29.58 | 0.5239 | 0.5174 |
| ibo | Igbo | 29.19 | 0.5273 | 24.54 | 0.4913 | 0.5093 |
| lin | Lingala | 23.92 | 0.5414 | 23.37 | 0.4670 | 0.5042 |
| kin | Kinyarwanda | 17.54 | 0.5148 | 25.29 | 0.4906 | 0.5027 |
| sot | Sotho | 21.60 | 0.5077 | 26.18 | 0.4950 | 0.5013 |
| hau | Hausa | 20.52 | 0.5102 | 24.03 | 0.4885 | 0.4993 |
| amh | Amharic | 14.52 | 0.3752 | 32.33 | 0.5735 | 0.4743 |
| lug | Luganda | 14.99 | 0.5089 | 22.69 | 0.4384 | 0.4737 |
| tsn | Tswana | 21.32 | 0.5051 | 20.01 | 0.4370 | 0.4710 |
| sna | Shona | 9.52 | 0.4642 | 23.02 | 0.4762 | 0.4702 |
| run | Kirundi | 10.80 | 0.4388 | 23.95 | 0.4554 | 0.4471 |
| nyo | Runyoro | 12.07 | 0.4644 | 18.33 | 0.4224 | 0.4434 |
| nyn | Runyankole | 9.33 | 0.4415 | 15.84 | 0.4114 | 0.4264 |
| yor | Yoruba | 19.98 | 0.3985 | 20.58 | 0.4467 | 0.4226 |
| cgg | Rukiga | 8.30 | 0.4172 | 16.60 | 0.4139 | 0.4155 |
| xog | Lusoga | 7.48 | 0.4086 | 15.87 | 0.3784 | 0.3935 |
| ttj | Rutooro | 8.18 | 0.3906 | 14.71 | 0.3868 | 0.3887 |
| ewe | Ewe | 13.83 | 0.4096 | 10.80 | 0.3265 | 0.3680 |
| ruc | Ruruuli | 5.14 | 0.3643 | 15.93 | 0.3628 | 0.3636 |
| kik | Kikuyu | 6.41 | 0.3459 | 14.91 | 0.3739 | 0.3599 |
| luo | Luo | 9.89 | 0.3885 | 12.86 | 0.3255 | 0.3570 |
| ach | Acholi | 10.98 | 0.4167 | 10.99 | 0.2872 | 0.3519 |
| orm | Oromo | 6.10 | 0.3643 | 8.88 | 0.2961 | 0.3302 |
| aka | Akan | 9.37 | 0.3244 | 10.23 | 0.3186 | 0.3215 |
| gwr | Lugwere | 3.98 | 0.3349 | 9.97 | 0.3074 | 0.3211 |
| bem | Bemba | 5.01 | 0.3305 | 10.24 | 0.3084 | 0.3195 |
| laj | Lango | 6.32 | 0.3329 | 9.13 | 0.2715 | 0.3022 |
| kdi | Kumam | 6.10 | 0.3176 | 7.24 | 0.2739 | 0.2957 |
| rub | Lugungu | 3.35 | 0.2826 | 9.40 | 0.3040 | 0.2933 |
| nuj | Lunyole | 4.38 | 0.2994 | 7.73 | 0.2608 | 0.2801 |
| koo | Rukonjo | 2.72 | 0.3139 | 7.14 | 0.2415 | 0.2777 |
| tlj | Lubwisi | 2.75 | 0.2743 | 8.86 | 0.2780 | 0.2762 |
| myx | Lumasaba | 3.18 | 0.2784 | 8.34 | 0.2674 | 0.2729 |
| lsm | Samia | 3.42 | 0.2859 | 9.46 | 0.2595 | 0.2727 |
| alz | Alur | 3.86 | 0.2605 | 5.24 | 0.2423 | 0.2514 |
| adh | Jopadhola | 4.52 | 0.2624 | 6.54 | 0.2371 | 0.2498 |
| lgg | Lugbara | 4.68 | 0.2869 | 4.00 | 0.2114 | 0.2491 |
| kab | Kabyle | 5.10 | 0.2313 | 6.91 | 0.2438 | 0.2375 |
| teo | Ateso | 3.38 | 0.2498 | 5.13 | 0.2187 | 0.2343 |
| wol | Wolof | 3.99 | 0.2148 | 5.60 | 0.2309 | 0.2228 |
| bfa | Bari | 2.88 | 0.1759 | 6.28 | 0.2441 | 0.2100 |
| rwm | Kwamba | 1.87 | 0.2103 | 5.19 | 0.2068 | 0.2086 |
| ful | Fulani | 3.24 | 0.1802 | 6.16 | 0.2354 | 0.2078 |
| dag | Dagbani | 3.71 | 0.2026 | 5.77 | 0.2106 | 0.2066 |
| bam | Bambara | 5.34 | 0.1920 | 4.87 | 0.2170 | 0.2045 |
| keo | Kakwa | 2.42 | 0.1812 | 4.37 | 0.2086 | 0.1949 |
| ber | Berber | 3.26 | 0.1749 | 4.08 | 0.1973 | 0.1861 |
| mhi | Ma'di | 2.29 | 0.1575 | 4.82 | 0.2127 | 0.1851 |
| luy | Luhya | 0.98 | 0.1500 | 5.49 | 0.2198 | 0.1849 |
| led | Lendu | 1.83 | 0.1356 | 3.69 | 0.2203 | 0.1779 |
| kdj | Karamojong | 1.50 | 0.1586 | 3.69 | 0.1842 | 0.1714 |
| pok | Pokot | 1.19 | 0.1231 | 3.60 | 0.1817 | 0.1524 |
| ikx | Ik | 0.90 | 0.1060 | 4.69 | 0.1970 | 0.1515 |
| kpz | Kupsabiny | 0.72 | 0.0973 | 3.68 | 0.1915 | 0.1444 |
| dga | Dagaare | 1.02 | 0.0952 | 3.79 | 0.1912 | 0.1432 |
| luc | Aringa | 1.07 | 0.0909 | 4.49 | 0.1908 | 0.1409 |
| kau | Kanuri | 0.68 | 0.0848 | 4.09 | 0.1971 | 0.1409 |
| kln | Kalenjin | 0.78 | 0.1094 | 4.14 | 0.1715 | 0.1405 |
| din | Dinka | 1.24 | 0.0859 | 2.97 | 0.1869 | 0.1364 |
| kpo | Ikposo | 0.14 | 0.0401 | 1.71 | 0.1526 | 0.0964 |
Speech Transcription
Reported ASR results span 110 dataset configurations from Sunbird/speech. Performance varies substantially by language and recording source.
| Languages | Scored Examples | Macro Language WER | Macro Language CER | Macro Mean Utterance WER | Macro Mean Utterance CER |
|---|---|---|---|---|---|
| 51 | 5201 | 0.4720 | 0.1890 | 0.5110 | 0.2016 |
Click to view full per-language transcription results
(Rates shown on a 0–1 scale; lower is better. WER can exceed 1.0 when insertions outnumber reference words.)
| Code | Language | Scored | Corpus WER | Corpus CER |
|---|---|---|---|---|
| ach | Acholi | 92 | 0.4086 | 0.1758 |
| afr | Afrikaans | 170 | 0.1413 | 0.0646 |
| aka | Akan | 50 | 0.4182 | 0.1779 |
| amh | Amharic | 250 | 0.3256 | 0.1474 |
| bam | Bambara | 149 | 0.6919 | 0.3454 |
| bem | Bemba | 100 | 0.5718 | 0.1392 |
| ber | Berber | 50 | 0.5000 | 0.1924 |
| cgg | Rukiga | 49 | 0.4254 | 0.1295 |
| dag | Dagbani | 100 | 0.4627 | 0.1871 |
| dga | Dagaare | 50 | 0.3920 | 0.1738 |
| eng | English | 100 | 0.1515 | 0.0819 |
| ewe | Ewe | 78 | 0.5833 | 0.2704 |
| fra | French | 50 | 0.1029 | 0.0525 |
| ful | Fulani | 149 | 0.5396 | 0.2009 |
| hau | Hausa | 287 | 0.2367 | 0.0844 |
| ibo | Igbo | 247 | 0.5664 | 0.2802 |
| kab | Kabyle | 50 | 0.7273 | 0.3696 |
| kau | Kanuri | 50 | 0.6795 | 0.2133 |
| kik | Kikuyu | 50 | 0.3798 | 0.1893 |
| kin | Kinyarwanda | 100 | 0.4653 | 0.1787 |
| kln | Kalenjin | 100 | 0.6164 | 0.1815 |
| koo | Rukonjo | 47 | 0.7333 | 0.2119 |
| kpo | Ikposo | 50 | 0.7418 | 0.3416 |
| led | Lendu | 50 | 0.5656 | 0.2646 |
| lgg | Lugbara | 50 | 0.3575 | 0.0990 |
| lin | Lingala | 193 | 0.3886 | 0.1800 |
| lth | Thur | 41 | 0.4299 | 0.2430 |
| lug | Luganda | 266 | 0.4999 | 0.1669 |
| luo | Luo | 149 | 0.3495 | 0.1096 |
| luy | Luhya | 50 | 0.4335 | 0.1015 |
| mlg | Malagasy | 49 | 0.3359 | 0.1561 |
| myx | Lumasaba | 45 | 0.6237 | 0.1814 |
| nbl | Ndebele | 10 | 0.5043 | 0.2032 |
| nya | Chichewa | 98 | 0.5949 | 0.2212 |
| nyn | Runyankole | 94 | 0.4977 | 0.1613 |
| orm | Oromo | 119 | 0.4602 | 0.1488 |
| pcm | Nigerian Pidgin | 100 | 0.3856 | 0.3043 |
| ruc | Ruruuli | 38 | 0.6701 | 0.1932 |
| rwm | Kwamba | 49 | 1.2251 | 0.7426 |
| sna | Shona | 147 | 0.3025 | 0.0951 |
| som | Somali | 149 | 0.4731 | 0.1898 |
| sot | Sotho | 94 | 0.3946 | 0.1780 |
| swa | Swahili | 99 | 0.1619 | 0.0585 |
| teo | Ateso | 50 | 0.4567 | 0.1516 |
| tsn | Tswana | 98 | 0.2225 | 0.0826 |
| ttj | Rutooro | 49 | 0.5753 | 0.2050 |
| wol | Wolof | 135 | 0.5280 | 0.2602 |
| xho | Xhosa | 126 | 0.4323 | 0.1247 |
| xog | Lusoga | 43 | 0.4995 | 0.1378 |
| yor | Yoruba | 249 | 0.5311 | 0.2042 |
| zul | Zulu | 143 | 0.3090 | 0.0863 |
Limitations
- Preview weights: Output will change before the stable release.
- Uneven multilingual quality: Lower-resource languages have substantially lower automatic scores. The low-resource end of the table is genuinely weak, and output there should be verified by a speaker before use.
- Translation variants: BLEU and chrF compare against a single reference and can penalize acceptable wording, dialect, or orthographic variants.
- Speech variation: Accent, dialect, code-switching, background noise, and domain vocabulary can materially affect transcription.
- Language prompting: The model was trained with language-specific transcription prompts and may perform poorly when the spoken language is omitted or named incorrectly.
- Hallucinations: Like any LLM, it can produce fluent, confident, but incorrect translations or transcripts. This matters more in low-resource languages where errors are harder for non-speakers to spot.
License
Released under the Apache 2.0 license, matching the Gemma 4 base model.
Citation
@misc{sunbird2026sunflowergemma4e2b,
title = {Sunflower-Gemma4-E2B},
author = {{Sunbird AI}},
year = {2026},
howpublished = {\url{https://huggingface.co/Sunbird/Sunflower-Gemma4-E2B}},
note = {Preview release: Multilingual text and speech model for African languages}
}
- Downloads last month
- 264