模型摘要: Granite-Embedding-97M-Multilingual-R2 是 Granite Embeddings 系列中的一个拥有 9700 万参数的密集嵌入模型,旨在以最低的计算成本提供高质量的多语言文本嵌入。它生成 384 维向量,上下文长度最多可达 32,768 个标记。该模型支持200 多种语言(基于底层编码器的多语言预训练语料库),其中52 种语言和编程语言得到增强支持,并接受了显式的检索对和跨语言训练。所有训练数据均使用宽松的、企业友好的许可证,以及 IBM 收集和生成的数据集。
Granite Embedding 97M Multilingual R2 在 Multilingual MTEB Retrieval(18 项任务) 上得分为59.6——这是所有 1 亿参数以下开源多语言嵌入模型中的最高检索分数,比其尺寸类别中的次优模型(multilingual-e5-small,50.9 分)高出8.7 分——同时比全尺寸的 granite-embedding-311m-multilingual-r2 大约小 3 倍。该多语言 R2 模型在多语言信息检索基准、代码检索、长文档搜索、对话多轮以及推理检索任务中均表现出强劲性能。
该模型采用双编码器架构,可从查询、段落、代码和文档等文本输入生成高质量嵌入,通过余弦相似度实现无缝比较。granite-embedding-97m-multilingual-r2 结合了对比微调、知识蒸馏、模型剪枝和词汇选择等技术,在确保紧凑模型大小的同时,优化了多种语言间查询和段落嵌入的强对齐。
Granite Embedding Multilingual R2 版本包含两个基于 ModernBERT 架构的多语言嵌入模型:
底层编码器在200多种语言的文本上进行了预训练,我们可提供适用于其中任何语言的通用嵌入。此外,我们为52种语言和编程语言提供增强支持,这些语言和代码接收了专门的检索对和跨语言训练数据,能在检索任务上生成更高质量的嵌入。
阿尔巴尼亚语(sq)、阿拉伯语(ar)、阿塞拜疆语(az)、孟加拉语(bn)、保加利亚语(bg)、加泰罗尼亚语(ca)、中文(zh)、克罗地亚语(hr)、捷克语(cs)、丹麦语(da)、荷兰语(nl)、英语(en)、爱沙尼亚语(et)、芬兰语(fi)、法语(fr)、格鲁吉亚语(ka)、德语(de)、希腊语(el)、希伯来语(he)、印地语(hi)、匈牙利语(hu)、冰岛语(is)、印度尼西亚语(id)、意大利语(it)、日语(ja)、哈萨克语(kk)、高棉语(km)、韩语(ko)、拉脱维亚语(lv)、立陶宛语(lt)、马来语(ms)、马拉地语(mr)、挪威语(no)、波斯语(fa)、波兰语(pl)、葡萄牙语(pt)、罗马尼亚语(ro)、俄语(ru)、塞尔维亚语(sr)、斯洛伐克语(sk)、斯洛文尼亚语(sl)、西班牙语(es)、斯瓦希里语(sw)、瑞典语(sv)、他加禄语(tl)、泰卢固语(te)、泰语(th)、土耳其语(tr)、乌克兰语(uk)、乌尔都语(ur)、乌兹别克语(uz)、越南语(vi)。
此外,模型还在编程语言(Python、Go、Java、JavaScript、PHP、Ruby、SQL、C、C++)上进行了训练,并支持跨语言代码检索。
预期用途:该模型旨在为给定文本生成固定长度的向量表示,可用于跨多种语言的文本相似度计算、检索和搜索应用。
为实现高效推理,这些模型支持 Flash Attention 2。安装该组件为可选操作,但能加快编码速度:
pip install flash_attn与 Sentence Transformers 配合使用:
该模型与 SentenceTransformer 库兼容,且使用起来非常简单:
首先,安装 sentence transformers 库
pip install sentence_transformers然后可使用该模型对文本对进行编码,并计算其表示形式之间的相似度。
from sentence_transformers import SentenceTransformer, util
model_path = "ibm-granite/granite-embedding-97m-multilingual-r2"
# Load the Sentence Transformer model
model = SentenceTransformer(model_path)
input_queries = [
'What is the tallest mountain in Japan?', # English query
'Wer hat das Lied Achy Breaky Heart geschrieben?', # German query
'ドイツの首都はどこですか?', # Japanese query
]
input_passages = [
"富士山は、静岡県と山梨県にまたがる活火山で、標高3776.12 mで日本最高峰の独立峰である。", # Japanese passage
"Achy Breaky Heart is a country song written by Don Von Tress. Originally titled Don't Tell My Heart and performed by The Marcy Brothers in 1991.", # English passage
"Berlin ist die Hauptstadt und ein Land der Bundesrepublik Deutschland. Die Stadt ist mit rund 3,7 Millionen Einwohnern die bevölkerungsreichste Kommune Deutschlands.", # German passage
]
# Cross-lingual retrieval: each query should score highest with its matching passage in a different language
query_embeddings = model.encode(input_queries)
passage_embeddings = model.encode(input_passages)
# calculate cosine similarity — expect high scores on the diagonal (EN→JA, DE→EN, JA→DE)
print(util.cos_sim(query_embeddings, passage_embeddings))
# output: tensor([[0.8869, 0.6658, 0.7213],
# [0.6792, 0.9577, 0.6420],
# [0.7534, 0.6771, 0.9112]])使用 Hugging Face Transformers:
以下是使用 Transformers 库和 PyTorch 运行 granite-embedding-97m-multilingual-r2 模型的简单示例。如需包含段落编码和余弦相似度的完整检索流程,请参见上文的 Sentence Transformers 示例。
首先,安装所需的库
pip install transformers torch该模型随后可用于对文本进行编码
import torch
from transformers import AutoModel, AutoTokenizer
model_path = "ibm-granite/granite-embedding-97m-multilingual-r2"
# Load the model and tokenizer
model = AutoModel.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)
model.eval()
input_queries = [
'What is the tallest mountain in Japan?', # English query
'Wer hat das Lied Achy Breaky Heart geschrieben?', # German query
'ドイツの首都はどこですか?', # Japanese query
]
# tokenize inputs
tokenized_queries = tokenizer(input_queries, padding=True, truncation=True, return_tensors='pt')
# encode queries
with torch.no_grad():
model_output = model(**tokenized_queries)
# Perform pooling. granite-embedding-97m-multilingual-r2 uses CLS Pooling
query_embeddings = model_output[0][:, 0]
# normalize the embeddings
query_embeddings = torch.nn.functional.normalize(query_embeddings, dim=1)ONNX 和 OpenVINO:
预转换的 ONNX 和 OpenVINO 模型与 PyTorch 权重一同发布,用于生产环境部署。可通过 Sentence Transformers 中的 backend 参数直接加载这些模型:
from sentence_transformers import SentenceTransformer
# ONNX backend
model = SentenceTransformer("ibm-granite/granite-embedding-97m-multilingual-r2", backend="onnx")
embeddings = model.encode(["example text"])
# OpenVINO backend
model = SentenceTransformer("ibm-granite/granite-embedding-97m-multilingual-r2", backend="openvino")
embeddings = model.encode(["example text"])
# OpenVINO INT8 quantized backend (smaller & faster on CPU)
model = SentenceTransformer(
"ibm-granite/granite-embedding-97m-multilingual-r2",
backend="openvino",
model_kwargs={"file_name": "openvino/openvino_model_qint8_quantized.xml"},
)
embeddings = model.encode(["example text"])ONNX 模型兼容任何 ONNX Runtime 后端(CPU、CUDA、TensorRT、DirectML)。OpenVINO 模型针对英特尔硬件进行了优化,包括 CPU 和集成 GPU。
vLLM:
可使用 vLLM 将模型部署为嵌入端点:
vllm serve ibm-granite/granite-embedding-97m-multilingual-r2 --task embedllama.cpp(GGUF):
该模型可转换为 GGUF 格式,以便与 llama.cpp 配合使用:
# Convert to GGUF
python convert_hf_to_gguf.py ibm-granite/granite-embedding-97m-multilingual-r2 \
--outfile granite-embedding-97m-multilingual-r2.gguf
# Generate embeddings
llama-embedding -m granite-embedding-97m-multilingual-r2.gguf -p "example text"注意:Ollama 当前不支持基于 ModernBERT 的模型。
Granite-Embedding-97M-Multilingual-R2 以极低的计算成本实现了出色的检索质量。该模型拥有 9700 万参数和 384 维嵌入,在准确率与效率之间取得了令人瞩目的平衡:其检索质量与 gte-multilingual-base(一个 3.05 亿参数的模型)相当,而编码速度快了近 3 倍;与前代模型 granite-embedding-107m-multilingual 相比,平均得分提升了 14.5 分。
在多语言 MTEB 检索、MTEB 英文检索、MTEB 代码检索、长文档搜索(LongEmbed)以及推理即检索(RaR-b)基准测试中的性能。分数为各任务的平均值,分值越高越好。吞吐量(每秒处理文档数)是在单个 NVIDIA H100 GPU 上使用 512 令牌块的滑动窗口测量得出的。
granite-embedding-97m-multilingual-r2 以每秒近 2900 个文档的速度,实现了与其 R1 前代模型相当的吞吐量,同时在多语言检索方面得分提升了近 10 分。它保留了全尺寸 3.11 亿参数模型的大部分检索质量,而模型体积缩小约 3 倍,吞吐量提高约 1.5 倍。
| 模型 | 参数(百万) | 嵌入维度 | MTEB 多语言检索 (18) | MTEB 检索(英文,v2)(10) | MTEB(代码,v1)(12) | LongEmbed (6) | RaR-b (17) | 平均值 | 吞吐量(文档/秒) |
|---|---|---|---|---|---|---|---|---|---|
| granite-embedding-107m-multilingual | 107 | 384 | 48.1 | 47.9 | 40.7 | 34.3 | 17.1 | 37.6 | 3337 |
| granite-embedding-278m-multilingual | 278 | 768 | 52.2 | 51.5 | 48.5 | 37.7 | 18.9 | 41.8 | 2185 |
| granite-embedding-311m-multilingual-r2 | 311 | 768 | 64.0 | 52.6 | 63.9 | 71.7 | 28.0 | 56.0 | 1944 |
| granite-embedding-97m-multilingual-r2 | 97 | 384 | 59.6 | 50.1 | 60.5 | 65.5 | 24.9 | 52.1 | 2894 |
Granite Embedding Multilingual R2 版本包含两个多语言嵌入模型,均基于 ModernBERT 架构构建。97M 模型是通过对 311M 模型进行层剪枝(从 22 层减至 12 层)和词汇选择(从 262K 个令牌减至 180K 个令牌)得到的,并使用了一个专为多语言覆盖而训练的紧凑型分词器,以减小模型尺寸。97M 模型采用 SiLU 激活函数(源自剪枝后的架构),而非全尺寸模型中使用的 GeGLU。
| 特性 | granite-embedding-97m-multilingual-r2 | granite-embedding-311m-multilingual-r2 |
|---|---|---|
| 嵌入维度 | 384 | 768 |
| 层数 | 12 | 22 |
| 注意力头数 | 12 | 12 |
| 中间层维度 | 1536 | 1152 |
| 激活函数 | SiLU | GeGLU |
| 词汇表大小 | 180,000 | 262,152 |
| 最大序列长度 | 32,768 | 32,768 |
| Matryoshka 维度 | — | 768, 512, 384, 256, 128 |
| 参数数量 | ~97M | ~311M |
Granite Embedding Multilingual R2 模型融合了 ModernBERT 架构的关键增强特性,包括:
97M 模型是通过层剪枝和词汇选择构建的,以较大的 granite-embedding-311m-multilingual-r2 为起点,将 transformer 层数从 22 层减至 12 层。一个经过专门训练的紧凑型多语言分词器(180K 词汇量)在显著减少参数数量的同时,保持了广泛的多语言覆盖能力。剪枝后的模型随后通过多教师模型知识蒸馏和对比微调进行训练,以恢复检索质量,在尺寸缩小 3 倍的情况下,保留了全尺寸模型的大部分性能。
所有训练数据均来自具有宽松、商业友好许可的来源,这使得 Granite Embedding R2 适合无限制的企业部署。
训练数据来自四个关键来源:
在治理方面,我们所有的数据都经过数据审批流程,该流程需接受技术、业务和治理审查。这一全面流程会获取有关数据的关键信息,包括但不限于其内容描述、所有权、预期用途、数据分类、许可信息、使用限制、数据获取方式,以及对敏感信息(例如个人信息)的评估。
我们使用 IBM 的计算集群 BlueVela Cluster 训练了 Granite Embedding Multilingual R2 模型,该集群配备了 NVIDIA H100 80GB GPU。该集群为在多个 GPU 上训练我们的模型提供了可扩展且高效的基础设施。
Granite Embedding 97M Multilingual R2 利用具有宽松许可的开源数据和精选专有数据来提升性能。基础语言模型的训练数据经过过滤,以去除包含仇恨、辱骂和亵渎内容的文本,不过此类过滤的效果在不同语系之间可能存在差异。
作为一个剪枝模型,granite-embedding-97m-multilingual-r2 以牺牲部分准确性为代价,换取了显著更快的推理速度和更低的资源需求。不同语言的性能表现各异:资源丰富的语言以及 52 种语言增强支持集中的语言通常能取得更好的结果,而低资源语言依赖跨语言迁移,可能表现出较低的检索质量——这种影响在这个较小的模型中比在全尺寸的 311M 变体中更为明显。词汇量的减少(从 262K 令牌减少到 180K 令牌)也可能影响某些语言的令牌化效率。较长的文本将被截断至 32,768 令牌的上下文限制。
@misc{granite-embedding-97m-multilingual-r2,
title={Granite Embedding Multilingual R2 Models},
author={IBM Granite Embedding Team},
year={2026},
}