Why This Matters for Global RAG and Search
If you've ever tried to build a retrieval-augmented generation (RAG) pipeline for a multilingual corpus, you know the pain: most open-source embedding models either support English only, or they're too large to run on commodity hardware. The new Granite Embedding Multilingual R2 models from IBM aim to solve exactly that.
Released under Apache 2.0, these two models — a 97M-parameter compact version and a 311M full-size version — are built on ModernBERT, a refreshed encoder architecture that brings Flash Attention 2.0, rotary position embeddings, and a 32,768-token context window. That's a 64x increase over the previous R1 generation.
For developers building cross-lingual search, multilingual RAG, or code retrieval tools, this is a significant step forward. The 97M model, in particular, punches far above its weight class: it scores 60.3 on MTEB Multilingual Retrieval, beating models three times its size like multilingual-e5-base (52.7) and gte-multilingual-base (57.2).

Benchmark Breakdown and Code Example
How the Models Stack Up
| Model | Params (M) | MTEB Multilingual Retrieval | Code Retrieval | LongEmbed |
|---|---|---|---|---|
granite-embedding-97m-multilingual-r2 | 97 | 60.3 | 60.4 | 65.6 |
granite-embedding-311m-multilingual-r2 | 311 | 65.2 | 63.8 | 71.7 |
multilingual-e5-small | 118 | 50.9 | 53.5 | 38.8 |
jina-embeddings-v5-text-nano | 212 | 63.3 | 71.2 | 63.6 |
harrier-oss-v1-270m | 268 | 66.4 | 62.4 | 64.9 |
The 97M model delivers +9.4 points over multilingual-e5-small on multilingual retrieval, and the 311M model leads on LongEmbed (71.7) — a direct payoff of the 32K context window.
Quick Start: Sentence Transformers
from sentence_transformers import SentenceTransformer, util
# Load the compact 97M model
model = SentenceTransformer("ibm-granite/granite-embedding-97m-multilingual-r2")
# Multilingual queries and passages
queries = [
"What is the tallest mountain in Japan?",
"ドイツの首都はどこですか?",
]
passages = [
"富士山は、静岡県と山梨県にまたがる活火山で、標高3776.12 mで日本最高峰の独立峰である。",
"Berlin ist die Hauptstadt und ein Land der Bundesrepublik Deutschland.",
]
q_emb = model.encode(queries)
p_emb = model.encode(passages)
print(util.cos_sim(q_emb, p_emb))
# Each query matches its correct passage across languages
Matryoshka Embeddings (311M only)
The 311M model supports dimension truncation — you can cut from 768 down to 128 dimensions with minimal quality loss:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("ibm-granite/granite-embedding-311m-multilingual-r2")
# Full 768-dimensional embeddings
full = model.encode(["example text"])
print(full.shape) # (1, 768)
# Truncated to 384 dimensions
small = model.encode(["example text"], truncate_dim=384)
print(small.shape) # (1, 384)
At 256 dimensions, the model retains 99.2% of its full retrieval quality — a 3x storage reduction with almost no downside.

Limitations and Caveats
No model is perfect, and these Granite embeddings come with tradeoffs:
-
Cross-lingual transfer gap on the 97M model: On Belebele (cross-lingual retrieval across 122 languages), the 97M R2 scores 52.9 — actually 2.2 points lower than its R1 predecessor (55.1). The pruning and vocabulary reduction (from 250K to 180K tokens) sacrificed some narrow cross-lingual capability for gains on the broader MTEB multilingual set. If your use case demands deep cross-lingual transfer across many language pairs, the 311M model is the better choice.
-
No Matryoshka on the 97M model: The compact model outputs fixed 384-dimensional embeddings. If you need flexible dimension tradeoffs, you must use the 311M version.
-
Speed vs. quality tradeoff: The 311M model encodes ~1,800 documents/second on an H100, while the 97M does ~2,500 docs/sec. For production indexing at scale, the 97M is faster, but the 311M gives better quality on long documents.
-
Dependency on community adoption: While the models are Apache 2.0 and drop-in replacements for frameworks like LangChain and LlamaIndex, their long-term viability depends on community maintenance by IBM. Always have a fallback model in your pipeline.
Next Steps for Learning
- Try the models interactively: IBM has a Hugging Face Spaces demo where you can test the 97M model on CPU.
- Read the technical report: The full training methodology, per-language evaluations, and pruning ablations are available in the Granite Multilingual Embedding R2 report.
- For framework maintainers: If you're considering adopting these as a default in your RAG library, open an issue on the GitHub repo. IBM says they're happy to help with integration.

Conclusion: A Strong Contender for Multilingual RAG
The Granite Embedding Multilingual R2 models are a serious option for any developer building multilingual search or RAG systems. The 97M model is the best open sub-100M multilingual embedder on the market right now, and the 311M model competes with — and in some areas beats — models like jina-embeddings-v5-text-nano and harrier-oss-v1-270m.
The Apache 2.0 license, drop-in compatibility with major frameworks, and ONNX/OpenVINO CPU support make them enterprise-ready. If you're currently using paraphrase-multilingual-MiniLM-L12-v2 as a default, the 97M Granite model is a +23.7 point improvement on multilingual retrieval — a one-line swap for dramatically better results.
For a deeper dive into production AI agent patterns, check out our guide on ADK Go 1.0: Production AI Agents with OpenTelemetry. And if you're more into frontend, see how to build accessible pie charts in CSS.