1import onnxruntime as ort
2import numpy as np
3from transformers import AutoTokenizer
4
5tokenizer = AutoTokenizer.from_pretrained("kzzalews/llama-3.2-nv-embedqa-1b-v2-onnx")
6sess = ort.InferenceSession("model.onnx", providers=["CPUExecutionProvider"])
7
8def embed(texts: list[str]) -> np.ndarray:
9 enc = tokenizer(texts, return_tensors="np", padding=True, truncation=True)
10 hidden = sess.run(["last_hidden_state"], {
11 "input_ids": enc["input_ids"],
12 "attention_mask": enc["attention_mask"],
13 })[0]
14 # mean pooling
15 mask = enc["attention_mask"][:, :, np.newaxis].astype(np.float32)
16 return (hidden * mask).sum(axis=1) / mask.sum(axis=1)
17
18# query prefix required for retrieval
19embeddings = embed(["query: How does Kubernetes handle OOMKill events?"])
20print(embeddings.shape) # (1, 2048)
1// src/models/text_embedding.rs
2ModelInfo {
3 model: EmbeddingModel::NvidiaNemotronEmbedQA1BV2,
4 dim: 2048,
5 description: String::from("NVIDIA Llama Nemotron Embedding 1B v2 for retrieval"),
6 model_code: String::from("kzzalews/llama-3.2-nv-embedqa-1b-v2-onnx"),
7 model_file: String::from("model.onnx"),
8 additional_files: vec!["model.onnx.data".to_string()],
9 output_key: None,
10},
11
12// src/text_embedding/impl.rs
13EmbeddingModel::NvidiaNemotronEmbedQA1BV2 => Some(Pooling::Mean),
1ModelInfo {
2 model: EmbeddingModel::NvidiaNemotronEmbedQA1BV2Fp16,
3 dim: 2048,
4 description: String::from("NVIDIA Llama Nemotron Embedding 1B v2 (float16)"),
5 model_code: String::from("kzzalews/llama-3.2-nv-embedqa-1b-v2-onnx"),
6 model_file: String::from("fp16/model.onnx"),
7 additional_files: vec!["fp16/model.onnx.data".to_string()],
8 output_key: None,
9},
10
11// src/text_embedding/impl.rs
12EmbeddingModel::NvidiaNemotronEmbedQA1BV2Fp16 => Some(Pooling::Mean),
Numerical validation (ONNX vs PyTorch): max diff = 1.76e-05, mean diff = 2.49e-06.