316 1 week ago

Nemotron-3.5-Embed 1B and 8B: multilingual text + image embedding models for retrieval and RAG. 32,768 tokens context, 34 languages, bundled vision projector.

vision embedding 1b 8b
ollama pull maternion/nemotron-3.5-embed:1b

Details

1 week ago

f3cd20857117 · 2.1GB

mistral3
·
1.14B
·
Q8_0
clip
·
414M
·
BF16
{{ .Prompt }}

Readme

Nemotron-3.5-Embed 1B & 8B

Ollama builds of NVIDIA’s Nemotron-3.5-Embed family: multilingual multimodal (text + image) embedding models. Converted to GGUF with llama.cpp, then quantized. Both sizes expose the same Ollama API and accept text, images, or text + image.

Multimodal. Every tag bundles its BF16 Pixtral vision projector (mmproj), so ollama show reports the vision capability and /api/embed accepts image input via map-shaped entries: {"text": "...", "image": "<base64>"}. Text-only inputs work as before.

Tags

Sizes are what ollama list reports and include the bundled projector.

1B

Tag Quantization Size
maternion/nemotron-3.5-embed:1b Q8_0 (default) 2.1 GB
maternion/nemotron-3.5-embed:1b-q8_0 Q8_0 2.1 GB
maternion/nemotron-3.5-embed:1b-q6_k Q6_K 1.8 GB
maternion/nemotron-3.5-embed:1b-bf16 BF16 3.1 GB

All include the BF16 Pixtral projector (clip, 413.79M parameters).

8B

Tag Quantization Size
maternion/nemotron-3.5-embed:8b Q4_K_M (default) 5.8 GB
maternion/nemotron-3.5-embed:8b-q4_k_m Q4_K_M 5.8 GB
maternion/nemotron-3.5-embed:8b-q8_0 Q8_0 9.3 GB
maternion/nemotron-3.5-embed:8b-q6_k Q6_K 7.4 GB
maternion/nemotron-3.5-embed:8b-bf16 BF16 16 GB

All include the BF16 Pixtral projector (clip, 428.48M parameters).

The :8b alias points at Q4_K_M, the same way :1b points at Q8_0.

Model details

1B

  • Parameters: 1.55B total (the text tower is ~1.1B in the GGUF)
  • Text architecture: Ministral-3 (16 layers, hidden 2048, 24 attention heads / 8 KV heads)
  • Vision projector: Pixtral, 413.79M parameters, 24 blocks, image size 1540 px (preproc 1120 px), projection dim 2048
  • Embedding: 2048-dim, mean-pooled, L2-normalized
  • Context: 32,768 tokens
  • Languages: 34 (en, ar, as, bn, bg, zh, da, nl, fi, fr, de, hi, id, it, ja, ko, ms, mr, ne, no, fa, pt, ro, ru, es, sw, sv, ta, te, th, uk, ur, vi)

8B

  • Parameters: 8.38B total
  • Text architecture: Ministral-3 (34 layers, hidden 4096, 32 attention heads / 8 KV heads, head_dim 128, FFN 14336, vocab 131072)
  • Vision projector: Pixtral, 428.48M parameters, 24 blocks, image size 1540 px (preproc 1120 px), projection dim 4096
  • Embedding: 4096-dim, mean-pooled, L2-normalized
  • Context: 32,768 tokens
  • Languages: 34 for text (same list as 1B), 18 for images
  • The text tower is the frozen Nemotron-3-Embed-8B model, so it shares the embedding space of that text-only model

Both sizes support dynamic embedding sizes: truncate the vector from the end (for example to 1024 or 512 dimensions) and re-normalize. Truncated embeddings remain effective for retrieval.

Choosing a size

1B 8B
Default tag :1b (Q8_0, 2.1 GB) :8b (Q4_K_M, 5.8 GB)
Best for CPU, edge, high-throughput indexing best retrieval quality
NDCG@10 (ViDoRe V3 image+text) 58.82 61.47

Do not mix sizes in one index. A 1B vector and an 8B vector are not comparable. Index and query with the same tag.

Usage

CLI

ollama run maternion/nemotron-3.5-embed:1b "query: What is NVIDIA NeMo Framework?"
ollama run maternion/nemotron-3.5-embed:8b "query: What is NVIDIA NeMo Framework?"

This prints the raw vector. Use the HTTP API for real workloads.

Use the model’s task prefixes:

  • queries: query:
  • documents: passage:

HTTP API

Docs: https://docs.ollama.com/api/embed

Single input:

curl http://localhost:11434/api/embed -d '{
  "model": "maternion/nemotron-3.5-embed:8b",
  "input": "query: What is NVIDIA NeMo Framework?"
}'

Batch of queries and documents:

curl http://localhost:11434/api/embed -d '{
  "model": "maternion/nemotron-3.5-embed:8b",
  "input": [
    "query: What is NVIDIA NeMo Framework?",
    "passage: NeMo Framework offers comprehensive functionalities for developing both LLMs and Multimodal Models.",
    "passage: A biological foundation model designed to analyze and generate DNA, RNA, and protein sequences."
  ]
}'

Python with cosine similarity (swap :1b for :8b as needed):

import requests
import numpy as np

URL = "http://localhost:11434/api/embed"
MODEL = "maternion/nemotron-3.5-embed:8b"   # or :1b


def embed(inputs):
    r = requests.post(URL, json={"model": MODEL, "input": inputs})
    r.raise_for_status()
    return np.array(r.json()["embeddings"], dtype=np.float32)


vectors = embed([
    "query: What is NVIDIA NeMo Framework?",
    "passage: NeMo Framework offers comprehensive functionalities for developing both LLMs and Multimodal Models.",
    "passage: A biological foundation model designed to analyze and generate DNA, RNA, and protein sequences.",
])
print(vectors.shape)
scores = vectors[0] @ vectors[1:].T
print(scores)

Truncated embeddings:

curl http://localhost:11434/api/embed -d '{
  "model": "maternion/nemotron-3.5-embed:8b",
  "input": "query: What is NVIDIA NeMo Framework?",
  "dimensions": 1024
}'

Image embeddings (Ollama API)

/api/embed accepts map-shaped entries with any of text, image, or audio (base64). Image + query:

IMG=$(base64 -w0 screenshot.png)
curl http://localhost:11434/api/embed -d "{
  \"model\": \"maternion/nemotron-3.5-embed:8b\",
  \"input\": {\"text\": \"query: What is shown in this screenshot?\", \"image\": \"$IMG\"}
}"

Or from Python, including image-only and a mixed batch:

import base64
import requests

URL = "http://localhost:11434/api/embed"
MODEL = "maternion/nemotron-3.5-embed:8b"   # or :1b
b64 = base64.b64encode(open("screenshot.png", "rb").read()).decode()


def embed(inp):
    r = requests.post(URL, json={"model": MODEL, "input": inp})
    r.raise_for_status()
    return r.json()["embeddings"]


print(len(embed({"text": "query: What is shown?", "image": b64})[0]))
embed({"image": b64})                                                  # image only

vecs = embed([                                                         # mixed batch
    "query: What is shown?",
    {"image": b64},
    {"text": "passage: a screenshot", "image": b64},
])
print(len(vecs))  # 3

Docs: https://docs.ollama.com/api/embed. The Go API (Input) documents the accepted shapes: a string, []string, or maps with text/image/audio.

Image embeddings (llama.cpp server, alternative)

The same GGUFs also run under llama.cpp if you are not using Ollama. Files are on Hugging Face:

1B:

./build/bin/llama-server \
  -m Nemotron-3.5-Embed-1B-Q8_0.gguf \
  -mm mmproj-Nemotron-3.5-Embed-1B-BF16.gguf \
  --embedding --pooling mean --ctx-size 8192 -ngl 0 --port 8099

8B:

./build/bin/llama-server \
  -m Nemotron-3.5-Embed-8B-Q8_0.gguf \
  -mm mmproj-Nemotron-3.5-Embed-8B-BF16.gguf \
  --embedding --pooling mean --ctx-size 8192 -ngl 0 --port 8099

Then send an OpenAI-style content array — image first, then the query text:

curl http://127.0.0.1:8099/v1/embeddings \
  -H "Content-Type: application/json" \
  -d '{
    "input": [{
      "content": [
        {"type": "image_url", "image_url": {"url": "data:image/png;base64,<BASE64>"}},
        {"type": "text", "text": "query: What is shown in this screenshot?"}
      ]
    }]
  }'

Or from Python:

import base64
import requests

b64 = base64.b64encode(open("screenshot.png", "rb").read()).decode()
r = requests.post("http://127.0.0.1:8099/v1/embeddings", json={
    "input": [{"content": [
        {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}},
        {"type": "text", "text": "query: What is shown in this screenshot?"},
    ]}]
})
print(len(r.json()["data"][0]["embedding"]))

The legacy non-OAI endpoint is POST /embedding, which takes the { "prompt_string": "... <__media__> ...", "multimodal_data": ["<base64>"] } form (see the llama.cpp server docs).

For the official vLLM /v2/embed image API, see the upstream model cards: 1B and 8B.

Benchmarks

NDCG@10:

Model ViDoRe V3 image ViDoRe V3 text ViDoRe V3 image+text MIRACL-VISION image
Qwen3-VL-Embedding-2B 52.89 48.31 51.97 58.42
Nemotron-3.5-Embed-1B-BF16 58.02 57.80 58.82 68.93
Qwen3-VL-Embedding-8B 58.29 53.69 57.03 68.33
Nemotron-3.5-Embed-8B-BF16 60.39 60.65 61.47 72.64

Published BF16 scores; quantized variants may differ slightly. These benchmarks include image retrieval, which the bundled projector supports through the map-shaped /api/embed input.

License

OpenMDW-1.1. Base models: Apache 2.0.

Links