mmBERT-Embed-32K-2D-Matryoshka
A multilingual embedding model with 32K context window and 2D Matryoshka support for flexible efficiency-quality tradeoffs.
Model Highlights
Key Results
What is 2D Matryoshka?
This model supports two dimensions of flexibility:
- Dimension Reduction (Matryoshka): Truncate embeddings to smaller dimensions with minimal quality loss
- Layer Reduction (Adaptive): Use intermediate layer outputs for faster inference
Usage
Basic Usage (Sentence Transformers)
Matryoshka Dimension Reduction
Long Context (up to 32K tokens)
Layer Reduction (Advanced)
For latency-critical applications, you can extract embeddings from intermediate layers:
Evaluation Results
MTEB Benchmark (24 tasks)
STS Benchmark
2D Matryoshka Quality Matrix (STS)
Long-Context Retrieval (4K tokens)
Throughput (AMD MI300X)
Latency Comparison vs BGE-M3 and Qwen3-Embedding-0.6B
mmBERT-Embed is significantly faster due to:
- Flash Attention 2 - BGE-M3 lacks FA2 (O(n) vs O(n²) attention)
- Encoder architecture - Qwen3 uses decoder with causal masking
- Smaller model - 307M vs 569M/600M params
Batch Size = 1
Batch Size = 8
Key insight: The FA2 advantage grows with sequence length and batch size:
- At short sequences (512), BGE-M3 is faster (no FA2 overhead)
- At 2K+ tokens, mmBERT pulls ahead significantly
- At 4K batch=8: mmBERT is 3.1× faster than BGE-M3
Benchmarked on AMD MI300X, bf16 precision.
Training
Data
Trained on BAAI/bge-m3-data (73GB, 279 JSONL files) with:
- Multilingual triplets (query, positive, negative)
- Diverse domains and languages
Configuration
- Base Model: vllm-sr/mmbert-32k-yarn
- Loss: Matryoshka2dLoss (combines AdaptiveLayerLoss + MatryoshkaLoss)
- Matryoshka Dimensions: [768, 512, 256, 128, 64]
- Epochs: 1
- Batch Size: 16 (effective 32 with gradient accumulation)
- Learning Rate: 2e-5
- Max Sequence Length: 32,768
- Hardware: AMD Instinct MI300X
Use Cases
When to Use mmBERT-Embed
- Multilingual RAG for 1800+ languages (especially low-resource languages not covered by Qwen3 or BGE-M3)
- Long-document retrieval where chunking loses cross-section relationships
- Edge deployment where 307M params matters vs 600M+
- Flexible inference where you need to trade quality for speed/storage at runtime
When to Use Alternatives
- Maximum quality on major languages: Qwen3-Embed-8B
- Production stability: BGE-M3 (more battle-tested)
- Very short texts only: Smaller models may suffice
Limitations
- Layer reduction quality (56% at 6L) is lower than full model; use for latency-critical applications where moderate quality is acceptable
- MTEB mean (61.4) is slightly below BGE-M3 (64.5) but with 4× longer context and 2D flexibility
- Optimized for retrieval tasks; may need fine-tuning for other downstream tasks
Citation
ONNX Models for Production Deployment
Pre-exported ONNX models are available for production deployment with ONNX Runtime. Each layer model enables true early-exit speedup.
Available Models
Benchmarked on AMD MI300X with ROCm, fp16 precision, batch=1, dynamic sequence length.
Batch Performance (batch=8)
Download ONNX Models
Usage with ONNX Runtime (Python)
Usage with Rust (ort crate)
Recommended Layer Selection
Why Separate ONNX Models?
Unlike PyTorch where you can use output_hidden_states=True for runtime layer selection, ONNX graphs are static DAGs - all nodes execute regardless of which output you read. Separate model files are required for true early-exit speedup.
License
Apache 2.0