nvidia/Nemotron-3.5-Embed-1B-BF16 · Hugging Face

Reddit r/LocalLLaMA 模型

摘要

NVIDIA 发布 Nemotron-3.5-Embed-1B-BF16 多模态嵌入模型,支持文本、图像及图文混合输入的文档检索,文本检索覆盖 34 种语言,图像检索覆盖 18 种语言,可用于语义搜索和 RAG 工作流。模型采用 OpenMDW-1.1 许可,允许商用。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/10/16 01:42

nvidia/Nemotron-3.5-Embed-1B-BF16 · Hugging Face

来源: https://huggingface.co/nvidia/Nemotron-3.5-Embed-1B-BF16 NVIDIA Nemotron 3.5 Embed

Nemotron 3.5 Embed 1B BF16 (https://huggingface.co/nvidia/Nemotron-3.5-Embed-1B-BF16)Nemotron 3.5 Embed 1B NVFP4 (https://huggingface.co/nvidia/Nemotron-3.5-Embed-1B-NVFP4)Nemotron 3.5 Embed 8B BF16 (https://huggingface.co/nvidia/Nemotron-3.5-Embed-8B-BF16)

描述:

Nemotron-3.5-Embed-1B-BF16 是由 NVIDIA 开发的多功能嵌入模型,用于多模态和多语言问答检索。该模型可以对以图像、文本或图文组合形式呈现的文档页面进行嵌入。用户可以通过文本形式的查询检索文档。该模型支持包含文本、表格、图表和信息图的页面图像。在文本检索方面,该模型在 34 种语言上进行了评测:英语、阿拉伯语、阿萨姆语、孟加拉语、保加利亚语、中文、丹麦语、荷兰语、芬兰语、法语、德语、印地语、印度式英语、印尼语、意大利语、日语、韩语、马来语、马拉地语、尼泊尔语、挪威语、波斯语、葡萄牙语、罗马尼亚语、俄语、西班牙语、斯瓦希里语、瑞典语、泰米尔语、泰卢固语、泰语、乌克兰语、乌尔都语和越南语。在图像检索方面,该模型在 18 种语言上进行了评测:阿拉伯语、孟加拉语、中文、英语、波斯语、芬兰语、法语、德语、印地语、印尼语、日语、韩语、俄语、西班牙语、斯瓦希里语、泰卢固语、泰语和约鲁巴语。该模型可能支持这些评测集之外的更多语言。

此模型可用于商业或非商业用途。

许可证/使用条款:

下载条款: 模型的使用受 OpenMDW 许可协议 1.1 版本(OpenMDW-1.1)(https://openmdw.ai/license-1-1/) 管辖。 其他信息: Ministral-3-3B-Instruct-2512-BF16 (https://huggingface.co/mistralai/Ministral-3-3B-Instruct-2512-BF16) 和 Ministral-3-8B-Instruct-2512-BF16 (https://huggingface.co/mistralai/Ministral-3-8B-Instruct-2512-BF16) 基础模型受 Apache 许可协议 2.0 版本 (https://www.apache.org/licenses/LICENSE-2.0.txt) 管辖。

部署地域:

全球

用例:

Nemotron-3.5-Embed-1B-BF16 适用于希望利用最新密集检索技术,在大型语料库上构建多模态问答应用的用户。模型的输入为文本或文档图像,输出为固定大小的嵌入向量。该嵌入模型是一个双编码器,支持文本格式的上下文(例如查询、页面 OCR 文本或文档某一段落的文本)或文档页面图像作为输入。通常,嵌入模型首先用于对整个语料库(文档图像或文本块)进行嵌入(向量化),嵌入结果与原始内容(图像或文本)关联后存储在向量数据库中。然后在推理阶段,嵌入模型用于对查询进行嵌入。该模型从文本或图像输入生成密集向量嵌入,支持多模态检索、语义搜索以及(智能体驱动的)RAG 工作流。

发布日期:

于 2026 年 10 月 20 日发布至 Hugging Face,链接: https://huggingface.co/nvidia/Nemotron-3.5-Embed-1B-BF16

模型架构:

架构类型: Transformer 网络架构: Nemotron-3.5-Embed-1B-BF16 由一个从 mistralai/Ministral-3-3B-Instruct-2512-BF16 (https://huggingface.co/mistralai/Ministral-3-3B-Instruct-2512-BF16) 初始化的 Pixtral 视觉编码器和一个从 nvidia/Nemotron-3-Embed-1B-BF16 (https://huggingface.co/nvidia/Nemotron-3-Embed-1B-BF16) 初始化的语言模型组成。 模型参数量: 1.55B

Nemotron-3.5-Embed-1B-BF16 模型是从 Nemotron-3.5-Embed-8B-BF16 (https://huggingface.co/nvidia/Nemotron-3.5-Embed-8B-BF16) 嵌入教师模型蒸馏而来,蒸馏过程中在多语言文本和图像检索数据上使用了组合余弦距离(COS)和均方误差(MSE)损失。其语言模型组件从 Nemotron-3-Embed-1B-BF16 (https://huggingface.co/nvidia/Nemotron-3-Embed-1B-BF16) 初始化,并在蒸馏过程中保持冻结。因此,Nemotron-3.5-Embed-1B-BF16 与 Nemotron-3-Embed-1B-BF16 共享相同的文本嵌入空间,同时新增了图像检索能力。视觉编码器和多模态投影层在图像和图文组合数据集上进行了微调。

输入:

输入类型: 文本、图像 输入格式: 文本:字符串;图像:红、绿、蓝(RGB) 输入参数: 文本:一维(1D),图像:二维(2D) 其他输入相关属性: 模型支持图像和/或文本输入。对于查询,模型仅接受文本输入。对于文档,模型接受图像、文本或图像+文本的组合。图像默认 longest_edge 为 1,120 像素,最大可提高到 1,540 像素。模型的最大上下文长度为 32,768 个 token。

输出:

输出类型: 嵌入 输出格式: 向量 输出参数: 每个输入对应一个一维(1D)向量 其他输出相关属性: Token 级别的隐藏状态经过均值池化后,再进行 L2 归一化,生成一个 2048 维的嵌入向量。模型还支持通过从末尾截断向量来实现动态嵌入大小(例如保留前 1024 或 512 维)。截断后的嵌入在截断后进行 L2 归一化的情况下,仍能有效用于检索。

我们的 AI 模型经过设计和/或优化,可在 NVIDIA GPU 加速系统上运行。通过利用 NVIDIA 的硬件(例如 GPU 核心)和软件框架(例如 CUDA 库),与纯 CPU 方案相比,模型可以实现更快的训练和推理速度。

安装

为 Transformers 和 Sentence Transformers 示例创建 Python 3.12 环境:

uv venv --python 3.12 .venv-transformers
source .venv-transformers/bin/activate
uv pip install torch "transformers>=5.5.0,<5.17.0" accelerate pillow packaging ninja
uv pip install flash-attn --no-build-isolation

示例使用 Flash Attention 2。Transformers 的版本上限是为了避免 Pixtral Flash Attention 回归问题。该检查点使用 TokenizersBackend,不需要 mistral_common。

模型训练和评测使用了 transformers==5.12.1。示例输出可能因硬件和运行时环境而异。

Transformers 用法

为文本查询以及包含文本、图像或图文组合的文档生成嵌入。

import torch
import torch.nn.functional as F
from PIL import Image
from transformers import AutoModel, AutoProcessor
from transformers.image_utils import load_image

MODEL_PATH = "nvidia/Nemotron-3.5-Embed-1B-BF16"  # 或本地检查点目录
DOCUMENT_NAMES = ["nemo_image_text", "nemo_text", "nemo_image", "biology_text"]
IMAGE_URL = "https://docs.nvidia.com/nemo-framework/user-guide/24.07/_images/nemo-llm-mm-stack.png"
MAX_MODEL_LEN = 32768
DEVICE = "cuda:0"

def main() -> None:
    if not torch.cuda.is_available():
        raise RuntimeError("This bfloat16 example requires a CUDA GPU.")

    processor = AutoProcessor.from_pretrained(MODEL_PATH)

    model = AutoModel.from_pretrained(
        MODEL_PATH,
        dtype=torch.bfloat16,
        device_map={"": DEVICE},
        attn_implementation="flash_attention_2",
    ).eval()

    def embed(
        prefix: str,
        text: str | None = None,
        image: Image.Image | None = None,
    ) -> torch.Tensor:
        content = [] if image is None else [{"type": "image", "image": image}]

        if text is not None:
            content.append({"type": "text", "text": text})

        inputs = processor.apply_chat_template(
            [
                {"role": "system", "content": prefix},
                {"role": "user", "content": content},
            ],
            tokenize=True,
            return_dict=True,
            return_tensors="pt",
        )
        if inputs["input_ids"].shape[-1] > MAX_MODEL_LEN:
            raise ValueError("Input exceeds 32768 tokens; shorten the text or resize the image.")
        inputs = inputs.to(DEVICE)

        if image is not None:
            inputs["pixel_values"] = inputs["pixel_values"].to(model.dtype)

        with torch.inference_mode():
            hidden = model(**inputs).last_hidden_state
            mask = inputs["attention_mask"].unsqueeze(-1)
            embedding = (hidden * mask).sum(1) / mask.sum(1)

        return F.normalize(embedding.float(), dim=-1)

    image = load_image(IMAGE_URL)
    query_embedding = embed("query:", "What is NVIDIA NeMo Framework?")
    nemo_text = "NeMo Framework offers comprehensive functionalities for developing both LLMs and Multimodal Models."
    biology_text = "A biological foundation model designed to analyze and generate DNA, RNA, and protein sequences."

    document_embeddings = torch.cat(
        [
            embed("passage:", nemo_text, image),
            embed("passage:", nemo_text),
            embed("passage:", image=image),
            embed("passage:", biology_text),
        ]
    )
    scores = query_embedding @ document_embeddings.T
    print(f"query_embedding.shape={tuple(query_embedding.shape)}")
    print(f"document_embeddings.shape={tuple(document_embeddings.shape)}")
    for name, score in zip(DOCUMENT_NAMES, scores[0]):
        print(f"{name}_similarity={score.item():.6f}")

if __name__ == "__main__":
    main()

示例输出(分数可能因硬件和运行时环境而异):

query_embedding.shape=(1, 2048)
document_embeddings.shape=(4, 2048)
nemo_image_text_similarity=0.521734
nemo_text_similarity=0.457723
nemo_image_similarity=0.509049
biology_text_similarity=0.112573

Sentence Transformers 用法

在同一环境中,安装 Sentence Transformers:

uv pip install "sentence-transformers[image]>5.4" "transformers<5.17.0"

使用 Sentence Transformers 为文本、图像或图文组合生成嵌入。

import torch
from sentence_transformers import SentenceTransformer
from transformers.image_utils import load_image

MODEL_PATH = "nvidia/Nemotron-3.5-Embed-1B-BF16"  # 或本地检查点目录
DOCUMENT_NAMES = ["nemo_image_text", "nemo_text", "nemo_image", "biology_text"]
DEVICE = "cuda:0"
IMAGE_URL = "https://docs.nvidia.com/nemo-framework/user-guide/24.07/_images/nemo-llm-mm-stack.png"

def main() -> None:
    """使用导出的 Sentence Transformers 检查点运行文本和多模态检索。"""
    if not torch.cuda.is_available():
        raise RuntimeError("This bfloat16 example requires a CUDA GPU.")

    model = SentenceTransformer(
        MODEL_PATH,
        device=DEVICE,
        model_kwargs={
            "attn_implementation": "flash_attention_2",
            "dtype": torch.bfloat16,
        },
    )

    query = "What is NVIDIA NeMo Framework?"
    nemo_text = "NeMo Framework offers comprehensive functionalities for developing both LLMs and Multimodal Models."
    biology_text = "A biological foundation model designed to analyze and generate DNA, RNA, and protein sequences."
    image = load_image(IMAGE_URL)

    query_embedding = model.encode_query([query], convert_to_tensor=True)
    text_embeddings = model.encode_document([nemo_text, biology_text], convert_to_tensor=True)
    image_embedding = model.encode_document([image], convert_to_tensor=True)
    multimodal_embedding = model.encode_document([{"image": image, "text": nemo_text}], convert_to_tensor=True)

    document_embeddings = torch.cat(
        [
            multimodal_embedding,
            text_embeddings[:1],
            image_embedding,
            text_embeddings[1:],
        ]
    )
    scores = model.similarity(query_embedding, document_embeddings)

    print(f"query_embedding.shape={tuple(query_embedding.shape)}")
    print(f"document_embeddings.shape={tuple(document_embeddings.shape)}")
    for name, score in zip(DOCUMENT_NAMES, scores[0]):
        print(f"{name}_similarity={score.item():.6f}")

if __name__ == "__main__":
    main()

示例输出(分数可能因硬件和运行时环境而异):

query_embedding.shape=(1, 2048)
document_embeddings.shape=(4, 2048)
nemo_image_text_similarity=0.521878
nemo_text_similarity=0.457693
nemo_image_similarity=0.509208
biology_text_similarity=0.112972

vLLM 用法

使用 vLLM Python API 或 HTTP 服务器为文本、图像以及图文组合输入生成嵌入。

依赖

为 vLLM 创建单独的 Python 环境。将 MODEL_PATH 设置为 Hugging Face 模型 ID 或本地检查点目录:

uv venv --python 3.12 .venv-vllm
source .venv-vllm/bin/activate
uv pip install "vllm==0.31.0" "transformers<5.17.0" pillow httpx numpy
export MODEL_PATH="nvidia/Nemotron-3.5-Embed-1B-BF16"

这些示例使用 vLLM 0.31.0。图像预处理使用检查点中配置的最长边限制 1,120 像素。32,768 个 token 的上下文包括文本和图像 token。

离线 Python

使用 query: 表示文本查询,passage: 表示文档。使用模型的聊天模板格式化每个输入,图像通过 multi_modal_data 传入:

import os

import numpy as np
from transformers import AutoProcessor
from transformers.image_utils import load_image
from vllm import LLM
from vllm.config import PoolerConfig

MODEL_PATH = os.environ["MODEL_PATH"]
DOCUMENT_NAMES = ["nemo_image_text", "nemo_text", "nemo_image", "biology_text"]
IMAGE_URL = "https://docs.nvidia.com/nemo-framework/user-guide/24.07/_images/nemo-llm-mm-stack.png"
MAX_MODEL_LEN = 32768

def main() -> None:
    processor = AutoProcessor.from_pretrained(MODEL_PATH)
    model = LLM(
        model=MODEL_PATH,
        dtype="bfloat16",
        pooler_config=PoolerConfig(
            task="embed",
            pooling_type="MEAN",
            use_activation=True,
        ),
        max_model_len=MAX_MODEL_LEN,
    )
    image = load_image(IMAGE_URL)
    nemo_text = "NeMo Framework offers comprehensive functionalities for developing both LLMs and Multimodal Models."
    biology_text = "A biological foundation model designed to analyze and generate DNA, RNA, and protein sequences."
    samples = [
        ("query:", "What is NVIDIA NeMo Framework?", None),
        ("passage:", nemo_text, image),
        ("passage:", nemo_text, None),
        ("passage:", None, image),
        ("passage:", biology_text, None),
    ]
    prompts = []
    for prefix, text, image in samples:
        content = [] if image is None else [{"type": "image", "image": image}]
        if text is not None:
            content.append({"type": "text", "text": text})
        conversation = [
            {"role": "system", "content": prefix},
            {"role": "user", "content": content},
        ]
        prompt = {"prompt": processor.apply_chat_template(conversation, tokenize=False)}
        if image is not None:
            prompt["multi_modal_data"] = {"image": image}
        prompts.append(prompt)

    # 保留模板输出

相似文章

nvidia/Nemotron-3-Embed-1B-BF16

Hugging Face Models Trending

NVIDIA发布了Nemotron-3-Embed-1B-BF16,一款针对检索和语义相似度优化的多语言文本嵌入模型,在34种语言上实现了RAG系统的最优性能。

Nemotron-3-Embed 1B/8B

Reddit r/LocalLLaMA

NVIDIA 发布了 Nemotron-3-Embed 1B 和 8B 模型,这是最先进的多语言文本嵌入模型,用于检索和语义相似度,针对 RAG 系统进行了优化。

nvidia/NVIDIA-Nemotron-Parse-2.0 · Hugging Face

Reddit r/LocalLLaMA

NVIDIA 发布 Nemotron Parse 2.0,这是一个文档图像解析模型,可将扫描的 PDF 和图像转换为带有布局、边界框和阅读顺序的结构化文本,并增加了多语言 OCR 改进和图表感知解析功能。

Nvidia 发布 Nemotron 3.5 Super VL(5 分钟阅读)

TLDR AI

NVIDIA 发布 Nemotron 3.5 Super VL,一款 120B 参数的多模态混合专家(MoE)模型,每 token 激活 12B 参数,面向企业级智能体工作流,支持文本、图像、文档和视频理解,单 GPU 上吞吐量较同类开源模型提升高达 5 倍,并可通过 NeMo 进行后训练定制。