Model reference · open weights

Omni-Embed-Mini

Embeddings MBZUAI Embeddings 1 build Non-commercial 0 dl/mo

Omni-Embed-Mini is an open-weight embedding model from MBZUAI. Omni-Embed-Mini-2.3B (BF16) weighs 4.3 GB; the smallest configuration that runs it is RTX 3060 12 GB.

For self-hosting, compare this build's requirements below with the GPU you plan to rent.

  • Omni-Embed-Mini is a 2.3B parameter feature-extraction model developed by MBZUAI that generates embeddings for text, speech, general audio, image, video, and visually-rich documents.
  • It uses a frozen Qwen3-VL backbone with added audio encoders and projectors to map all modalities into a shared 2048-dimensional cosine space.
  • The model supports Matryoshka truncation to dimensions of 128, 256, 512, 1024, or 2048 and is licensed under cc-by-nc-sa-4.0.

Summary of the MBZUAI/Omni-Embed-Mini-2.3B model card, 2026-10-01

What it is

Released byMBZUAI
Released2026-09-04
VRAM4.3 GB for the weights

What it runs on

Memory and cards for Omni-Embed-Mini-2.3B (BF16)

4.3 GBweights, file size
1.1 GBruntime overhead
CardRunsMemory
RTX 3060 12 GBfits11.6 GB
RTX 4060 Ti 16 GBfits15.4 GB
RTX 3090 24 GBfits23.4 GB
RTX 4090 24 GBfits23.4 GB
RTX 5090 32 GBfits31.0 GB
L40S 48 GBfits44.0 GB
A100 80 GBfits78.2 GB
H100 80 GBfits78.1 GB
RTX PRO 6000 Blackwell 96 GBfits93.8 GB
DGX Spark (GB10) 128 GB unifiedfits107 GB
H200 141 GBfits138 GB
B200 180 GBfits176 GB

From the model card

What MBZUAI says about Omni-Embed-Mini

Read the model card

2.3B parameters. Text, speech, general audio, image, video, and visually-rich documents in a single shared cosine space, from a backbone that is never updated.

Project page | Code | Sibling model: Omni-Embed-Mini-0.9B

What this is

Omni-Embed-Mini recasts cross-modal alignment as self-distillation through one shared frozen causal backbone. Every media sample is paired with a dense cascaded caption; the teacher target is the EOS-pooled embedding of that caption produced by the identical frozen backbone that processes the student input. Teacher and student therefore inhabit byte-identical geometry, and because no text-side parameter is ever updated, adding audio cannot degrade the inherited text and vision representations.

Only the audio projectors and small phased LoRA adapters on the audio encoders are trained. A Matryoshka SigLIP contrastive objective and an online hybrid hard-negative miner supply the contrastive signal. This variant keeps the Qwen3-VL native visual tower, so image, video, and document-page quality is inherited intact from the backbone while speech and audio are added on top.

Results

Six modalities, evaluated with the pipeline in the code repository.

ModalityBenchmarkMetric2.3B v12.3B v20.9B v10.9B v2
TextMTEB-v2 BEIR-8nDCG@1047.9449.57
SpeechMAEB (12 tasks)mean48.8643.28
AudioMAEB (10 tasks)mean33.4433.43
ImageMMEB-V2 (10 tasks)hit@164.8026.29
VideoMMEB-V2 (6 tasks)hit@155.1818.48
Vis-DocViDoRe-v3 (7 tasks)nDCG@558.1046.92

v1 and v2 are tagged revisions of this same repository, so revision="v1.0" pins the numbers in the v1 column.

Quick start

pip install "transformers>=5.0" torch pillow numpy soundfile huggingface_hub
import torch
from transformers import AutoModel, AutoProcessor

REPO = "MBZUAI/Omni-Embed-Mini-2.3B"

model = AutoModel.from_pretrained(
    REPO, revision="v1.0", trust_remote_code=True, dtype=torch.bfloat16,
).cuda().eval()
processor = AutoProcessor.from_pretrained(REPO, revision="v1.0", trust_remote_code=True)

# OpenAI-style multimodal messages: text, audio, image, video, doc, or any composition.
messages = [{"role": "user", "content": [
    {"type": "audio", "audio": "path/to/clip.wav"},
    {"type": "text",  "text":  "rain on a tin roof at night"},
]}]

inputs = processor.apply_chat_template(
    messages, role="passage", tokenize=True, return_tensors="pt",
).to("cuda")
with torch.no_grad():
    doc = model(**inputs).pooler_output          # (1, 2048), already L2-normalised

# Query side. role="query" applies the retrieval instruction template.
# text_recipe="chat" puts a text query in the same subspace as media documents;
# omit it only for pure text-to-text retrieval, which uses the native recipe.
query = processor.apply_chat_template(
    [{"role": "user", "content": "rain on a tin roof at night"}],
    role="query", tokenize=True, return_tensors="pt", text_recipe="chat",
).to("cuda")
with torch.no_grad():
    q = model(**query).pooler_output

print("cosine:", float(q @ doc.T))               # normalised, so dot == cosine

Matryoshka (truncatable) embeddings

model(**inputs, truncate_dim=N).pooler_output returns a prefix-truncated, renormalised vector. Slicing pooler_output yourself is not equivalent unless you renormalise after. Supported N: 128, 256, 512, 1024, 2048. Use a smaller N to cut index size at a modest recall cost.

Architecture

ComponentThis model
Backbone (frozen)Qwen/Qwen3-VL-Embedding-2B
Embedding dim2048
Visionnative Qwen3-VL visual tower (inside backbone/; no separate file)
Speech encoderopenai/whisper-small
Audio encodermispeech/dasheng-base
Matryoshka dims128, 256, 512, 1024, 2048
Videonative video path (video_as_images: false)

Trained parameters: audio projectors plus phase-2 LoRA adapters on the audio encoders (48 Whisper and 24 Dasheng adapted tensors, merged into the released weights). The backbone is frozen at every stage and ships unmodified apart from a vocabulary resize that adds the media placeholder tokens. There is no vision_encoder.pt, which is expected for this variant, whose vision weights live inside backbone/.

Files

config.json                 modeling_omni_embed.py      processing_omni_embed.py
configuration_omni_embed.py chat_template.jinja         processor_config.json
tokenizer.json              tokenizer_config.json
backbone/                   # frozen Qwen3-VL backbone (vocab-resized), safetensors
whisper_encoder.pt          dasheng_encoder.pt
projector_weights.pt        # projectors; LoRA already merged into the encoders

The .pt files are PyTorch pickles, and the custom modeling code requires trust_remote_code=True. Load only from a source you trust.

Citation

@inproceedings{omniembedmini2026,
  title     = {Omni-Embed-Mini: Binding Modalities Without Forgetting via Dense Distillation},
  author    = {TBD},
  booktitle = {TBD},
  year      = {2026},
  note      = {Camera-ready in preparation}
}

Quoted from the model card on Hugging Face. The full card is behind the Hugging Face link above.

© 2026 AxForge · EU-hosted AI infrastructure Pricing Docs Trust Privacy Terms