inference/research
verifiedhigh · 0.90updated 2026-10-03

Nomic Embed Text v1.5

dense 0.137B

Fields

id
models/nomic-embed-text-v1-5
Family
nomic-bert
Vendor
Nomic AI
Release year
2024
Architecture
dense
Params (B)
0.137
Active params (B)
0.137
Hidden size
768
Layers
12
Head dim
64
Max context
2,048
Context scaling method
native
Activation
silu
Attention variant
bidirectional encoder (nomic_bert: BERT + rotary, GLU MLP)
KV cache (bytes/token)
0
FLOPs per active token
273,000,000
Open weights
yes
License
Apache-2.0
notes
Encoder: kv_cache_bytes_per_token = 0, KV formula does not apply. NOT vanilla BERT: model_type nomic_bert, hidden_act silu (GLU-style MLP rather than BERT's plain gelu), and head_dim 64 is stated explicitly, implying 768/64 = 12 heads matching num_attention_heads 12. Rotary embeddings replace learned absolute position embeddings, which is what buys the 2048 context versus BERT's 512 — 4x the max_position_embeddings at similar per-token cost. MATRYOSHKA DESIGN is the decision-relevant property and it is an inference-time property, not visible in config.json: this model is trained so a prefix of its output dimensions remains a valid embedding. Truncating to 512 / 256 / 128 / 64 dims is supported and loses little accuracy, which turns the vector-store tradeoff inside out — at 64 dims a document costs 256 B instead of 3 KB, a 12x storage and search-speed reduction for one quantization axis instead of a re-quantization of the model. That is why this model shows up in high-recall/low-precision configurations where BERT-based embedders cannot compete. Safetensors total 136731648 (larger than BERT-base's 109482752 because of the 30528-token BERT-style vocab plus rotary handling). Apache-2.0. 13.1M downloads. GGUF ports exist officially (nomic-ai/nomic-embed-text-v1.5-GGUF) plus ONNX (keisuke-miyako int8/fp16). SERVICEABILITY JOIN (added 2026-10-03; the architecture x engine matrix this record was missing, with a citation per cell in docs/13-model-compatibility.md): FAMILY=bi-encoder. REQUIRED KERNEL CLASS: a single full-sequence bidirectional forward pass with a pooling reduction. No KV cache, no incremental state, no autoregressive weight streaming - flop/embedding-batch-encoding gives AI = B*t flop/byte (weights read once for all B documents), so on H100 SXM at ridge 295.4 a single 128-token encode at B=1 is memory-bound but at B=3 it is compute-bound, and the threshold is the PRODUCT B*t. flop/cross-encoder-reranking makes the same point for the scoring phase. This inverts the hardware-selection rule: an embedding/rerank tier wants FLOPS and core count, not HBM bandwidth. SUPPORTED BY (cited): vLLM pooling is a separate runner with its own endpoint surface and the broadest architecture table in the repo - BertModel, BgeM3EmbeddingModel, GteModel, JteNewModel (mGTE-TRM), JinaEmbeddingsV5Model, LlamaBidirectionalModel, LlamaModel/MistralModel (intfloat/e5-mistral-7b-instruct), ModernBertModel, NomicBertModel, Qwen2Model, Qwen3Model, RobertaModel, XLMRobertaModel, plus any generative model via automatic --convert, with the Transformers modeling backend covering encoder-only architectures directly [[vllm-pooling-models]]. TEI is the purpose-built reference and lists BERT, CamemBERT, XLM-RoBERTa, NomicBERT, JinaBERT (Alibi), MPNet, ModernBERT plus RoPE decoder backbones Mistral, Alibaba GTE, Qwen2, Qwen3 and Gemma3 [[hf-text-embeddings-inference]]. SGLang's embedding page states native encoder architectures are auto-detected while decoder-style embedders need --is-embedding, and that on CUDA it automatically uses breakable CUDA graph for the full encoder prefill and DISABLES radix-cache and chunked-prefill [[mdl2-sglang-embedding-rerank-models]]. sentence-transformers covers everything transformers can load [[sentence-transformers]]. llama.cpp reaches BERT-family encoders via the LLM_ARCH_BERT / MODERN_BERT / NOMIC_BERT / JINA_BERT_V2 / JINA_BERT_V3 entries [[pap-arch-llamacpp-arch-registry]]. CORRECTNESS CAVEATS THAT ARE ARCHITECTURE-SPECIFIC AND CITED: vLLM's pooling path is a capability not a speed win - the project's own docs say 'We currently support pooling models primarily for convenience. This is not guaranteed to provide any performance improvements over using Hugging Face Transformers or Sentence Transformers directly' [[vllm-pooling-models]]. Several of the architectures above need --trust-remote-code or --hf-overrides, so 'supported' sometimes means 'supported after three flags' [[vllm-pooling-models]]. bge-m3 ships extra sparse AND ColBERT weights with a separate docs path, and jina-embeddings-v3 is limited to text-matching with LoRA merged rather than selected [[vllm-pooling-models]]. TEI's --dtype accepts only float16 and float32 - no int8 or fp8 at runtime, so quantization must happen at export [[hf-text-embeddings-inference]]. llama.cpp's embedding path cannot serve SPLADE/learned-sparse encoders, cannot serve ColBERT end to end, and cannot serve multimodal encoders requiring a projector graph [[llama-cpp-embedding-server]]. For the Qwen2-decoder-as-bi-encoder pattern specifically, both gte-Qwen2 and Qwen2 family models are the documented --trust-remote-code case in vLLM [[vllm-pooling-models]]. CONTEXT_SCALING_METHOD (native): rope_parameters rope_type 'default' at theta 1e3; an encoder at 2048 with no extension.
task
embedding

Notes

Encoder: kv_cache_bytes_per_token = 0, KV formula does not apply. NOT vanilla BERT: model_type nomic_bert, hidden_act silu (GLU-style MLP rather than BERT's plain gelu), and head_dim 64 is stated explicitly, implying 768/64 = 12 heads matching num_attention_heads 12. Rotary embeddings replace learned absolute position embeddings, which is what buys the 2048 context versus BERT's 512 — 4x the max_position_embeddings at similar per-token cost. MATRYOSHKA DESIGN is the decision-relevant property and it is an inference-time property, not visible in config.json: this model is trained so a prefix of its output dimensions remains a valid embedding. Truncating to 512 / 256 / 128 / 64 dims is supported and loses little accuracy, which turns the vector-store tradeoff inside out — at 64 dims a document costs 256 B instead of 3 KB, a 12x storage and search-speed reduction for one quantization axis instead of a re-quantization of the model. That is why this model shows up in high-recall/low-precision configurations where BERT-based embedders cannot compete. Safetensors total 136731648 (larger than BERT-base's 109482752 because of the 30528-token BERT-style vocab plus rotary handling). Apache-2.0. 13.1M downloads. GGUF ports exist officially (nomic-ai/nomic-embed-text-v1.5-GGUF) plus ONNX (keisuke-miyako int8/fp16).

SERVICEABILITY JOIN (added 2026-10-03; the architecture x engine matrix this record was missing, with a citation per cell in docs/13-model-compatibility.md): FAMILY=bi-encoder. REQUIRED KERNEL CLASS: a single full-sequence bidirectional forward pass with a pooling reduction. No KV cache, no incremental state, no autoregressive weight streaming - flop/embedding-batch-encoding gives AI = B*t flop/byte (weights read once for all B documents), so on H100 SXM at ridge 295.4 a single 128-token encode at B=1 is memory-bound but at B=3 it is compute-bound, and the threshold is the PRODUCT B*t. flop/cross-encoder-reranking makes the same point for the scoring phase. This inverts the hardware-selection rule: an embedding/rerank tier wants FLOPS and core count, not HBM bandwidth. SUPPORTED BY (cited): vLLM pooling is a separate runner with its own endpoint surface and the broadest architecture table in the repo - BertModel, BgeM3EmbeddingModel, GteModel, JteNewModel (mGTE-TRM), JinaEmbeddingsV5Model, LlamaBidirectionalModel, LlamaModel/MistralModel (intfloat/e5-mistral-7b-instruct), ModernBertModel, NomicBertModel, Qwen2Model, Qwen3Model, RobertaModel, XLMRobertaModel, plus any generative model via automatic --convert, with the Transformers modeling backend covering encoder-only architectures directly [[vllm-pooling-models]]. TEI is the purpose-built reference and lists BERT, CamemBERT, XLM-RoBERTa, NomicBERT, JinaBERT (Alibi), MPNet, ModernBERT plus RoPE decoder backbones Mistral, Alibaba GTE, Qwen2, Qwen3 and Gemma3 [[hf-text-embeddings-inference]]. SGLang's embedding page states native encoder architectures are auto-detected while decoder-style embedders need --is-embedding, and that on CUDA it automatically uses breakable CUDA graph for the full encoder prefill and DISABLES radix-cache and chunked-prefill [[mdl2-sglang-embedding-rerank-models]]. sentence-transformers covers everything transformers can load [[sentence-transformers]]. llama.cpp reaches BERT-family encoders via the LLM_ARCH_BERT / MODERN_BERT / NOMIC_BERT / JINA_BERT_V2 / JINA_BERT_V3 entries [[pap-arch-llamacpp-arch-registry]]. CORRECTNESS CAVEATS THAT ARE ARCHITECTURE-SPECIFIC AND CITED: vLLM's pooling path is a capability not a speed win - the project's own docs say 'We currently support pooling models primarily for convenience. This is not guaranteed to provide any performance improvements over using Hugging Face Transformers or Sentence Transformers directly' [[vllm-pooling-models]]. Several of the architectures above need --trust-remote-code or --hf-overrides, so 'supported' sometimes means 'supported after three flags' [[vllm-pooling-models]]. bge-m3 ships extra sparse AND ColBERT weights with a separate docs path, and jina-embeddings-v3 is limited to text-matching with LoRA merged rather than selected [[vllm-pooling-models]]. TEI's --dtype accepts only float16 and float32 - no int8 or fp8 at runtime, so quantization must happen at export [[hf-text-embeddings-inference]]. llama.cpp's embedding path cannot serve SPLADE/learned-sparse encoders, cannot serve ColBERT end to end, and cannot serve multimodal encoders requiring a projector graph [[llama-cpp-embedding-server]]. For the Qwen2-decoder-as-bi-encoder pattern specifically, both gte-Qwen2 and Qwen2 family models are the documented --trust-remote-code case in vLLM [[vllm-pooling-models]].

CONTEXT_SCALING_METHOD (native): rope_parameters rope_type 'default' at theta 1e3; an encoder at 2048 with no extension.

Cross-references

This record references no other records — it is a leaf. It is cited by 0.