Instructions to use groxaxo/Nemotron-3-Embed-1B-AWQ-W4A16 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use groxaxo/Nemotron-3-Embed-1B-AWQ-W4A16 with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("feature-extraction", model="groxaxo/Nemotron-3-Embed-1B-AWQ-W4A16")# Load model directly from transformers import AutoTokenizer, AutoModel tokenizer = AutoTokenizer.from_pretrained("groxaxo/Nemotron-3-Embed-1B-AWQ-W4A16") model = AutoModel.from_pretrained("groxaxo/Nemotron-3-Embed-1B-AWQ-W4A16", device_map="auto") - Notebooks
- Google Colab
- Kaggle
- English
- Nemotron-3-Embed-1B-AWQ-W4A16
- Español
- Nemotron-3-Embed-1B-AWQ-W4A16
Languages / Idiomas: 🇬🇧 English · 🇪🇸 Español
English
Nemotron-3-Embed-1B-AWQ-W4A16
Quality-maxed 4-bit AWQ of NVIDIA's Nemotron-3-Embed-1B — half the size, 0.0 pp Recall@10 loss on English AND on Spanish, despite being calibrated English-only.
1.0 GB on disk · 2048-dim retrieval encoder · vLLM Marlin W4A16 accelerated · G32 asymmetric · MSE observer · 1024 calibration samples
This is a W4A16 AWQ rebuild of nvidia/Nemotron-3-Embed-1B-BF16 using llmcompressor 0.12.0 and serialized as compressed-tensors for native vLLM/Marlin serving. Every Linear weight is INT4 (group 32, asymmetric, zero-point) with BF16 activations; the 131 072 × 2 048 token-embedding table and all RMSNorms stay BF16 to protect semantic fidelity.
The result: 56 % smaller, 0.0 percentage-point Recall@10 loss versus BF16 across two languages (English PAQ and Spanish MIRACL-ES, 512 held-out pairs each) and three dimensions (2 048, 1 024, 512). Mean BF16↔AWQ vector cosine sits at 0.995–0.997 everywhere.
Why this checkpoint
| What you get | Spec |
|---|---|
| Weight precision | INT4 (asymmetric, zero-point enabled) |
| Activation precision | BF16 |
| Group size | 32 — the smallest vLLM Marlin supports |
| Observer | MSE (grid 200, maxshrink 0.20, patience 40, norm 2.4) |
| AWQ scaling | duo_scaling="both", n_grid 100 |
| Calibration | 1 024 PAQ pairs, 50 % queries / 50 % passages, 4 096-token cap, BS=1 |
| Quantized modules | Linear only (112 layers: q/k/v/o + gate/up/down × 16) |
| Kept in BF16 | Token-embedding table, 33 RMSNorms, pooling, output norm |
| Checkpoint format | compressed-tensors pack-quantized v0.17.1 |
| Serving engine | vLLM ≥ 0.25.0 (Marlin kernel auto-selected) |
| Attention impl | SDPA |
| Disk footprint | 1.0 GB (vs 2.28 GB BF16) |
G32 asymmetric is the quality-max target inside W4A16: it minimizes per-group reconstruction error and is the smallest group size vLLM's Marlin W4A16 path will accept. Pairing it with an MSE observer that searches 200 clipping candidates over a 20 % shrink range gives the lowest published-style reconstruction error you can reach without going to W8A16 or BF16.
Quick start — serve with vLLM
pip install "vllm==0.25.0"
vllm serve groxaxo/Nemotron-3-Embed-1B-AWQ-W4A16 \
--host 0.0.0.0 --port 8000 \
--served-model-name nemotron-embed \
--dtype bfloat16 \
--max-model-len 4096 \
--max-num-batched-tokens 4096 \
--max-cudagraph-capture-size 4096
Do not pass --quantization awq. The checkpoint already carries compressed-tensors metadata and vLLM picks the W4A16 Marlin kernel automatically.
Query the /v2/embed endpoint:
import requests
r = requests.post(
"http://localhost:8000/v2/embed",
json={
"model": "nemotron-embed",
"input_type": "query", # or "document" / "passage"
"texts": ["How do I rotate an IAM access key?"],
"embedding_types": ["float"],
"truncate": "END",
},
timeout=60,
).json()
vec = r["embeddings"]["float"][0] # 2048-dim, L2-normalized
The model expects query: / passage: prefixes; vLLM applies them from input_type via the bundled Sentence Transformers metadata — do not prefix the strings yourself.
Quick start — transformers / sentence-transformers
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("groxaxo/Nemotron-3-Embed-1B-AWQ-W4A16")
queries = ["¿Cómo renuevo una clave de acceso IAM?", "How do I rotate an IAM key?"]
passages = ["Para rotar una clave IAM, primero crea una segunda clave...",
"To rotate an IAM access key, first create a second key..."]
q = model.encode(queries, prompt_name="query", normalize_embeddings=True)
d = model.encode(passages, prompt_name="document", normalize_embeddings=True)
scores = q @ d.T # 2x2 cosine-similarity matrix
Benchmarks — BF16 vs AWQ, English + Spanish
Two completely separate held-out evaluations, both run on a single RTX 3090 through vLLM 0.25.0:
- English — 512 query/passage pairs from
sentence-transformers/paq, disjoint from the English-only calibration set (seed 999, deduped against the seed-42 calibration slice). - Spanish — 512 query/passage pairs from
Hieuman/es_MIRACL(MIRACL-ES), disjoint seed 999. No Spanish was seen during AWQ calibration — this measures how the English-calibrated checkpoint transfers to a second language.
| Dim | Language | Metric | BF16 | AWQ | Δ | Gate (≤0.5 pp) |
|---|---|---|---|---|---|---|
| 2048 | 🇬🇧 EN | Recall@1 | 0.99805 | 0.99805 | 0.0 pp | ✓ |
| 2048 | 🇬🇧 EN | Recall@10 | 1.00000 | 1.00000 | 0.0 pp | ✓ |
| 2048 | 🇬🇧 EN | MRR@10 | 0.99902 | 0.99902 | 0.0 pp | ✓ |
| 2048 | 🇬🇧 EN | Vec cosine q / d (mean) | — | 0.99622 / 0.99694 | — | ✓ |
| 2048 | 🇪🇸 ES | Recall@1 | 0.98828 | 0.98633 | −0.20 pp | ✓ |
| 2048 | 🇪🇸 ES | Recall@10 | 1.00000 | 1.00000 | 0.0 pp | ✓ |
| 2048 | 🇪🇸 ES | MRR@10 | 0.99382 | 0.99284 | −0.10 pp | ✓ |
| 2048 | 🇪🇸 ES | Vec cosine q / d (mean) | — | 0.99673 / 0.99710 | — | ✓ |
| 1024 | 🇬🇧 EN | Recall@1 | 0.99805 | 0.99805 | 0.0 pp | ✓ |
| 1024 | 🇬🇧 EN | Recall@10 | 1.00000 | 1.00000 | 0.0 pp | ✓ |
| 1024 | 🇬🇧 EN | MRR@10 | 0.99902 | 0.99902 | 0.0 pp | ✓ |
| 1024 | 🇪🇸 ES | Recall@1 | 0.98242 | 0.98242 | 0.0 pp | ✓ |
| 1024 | 🇪🇸 ES | Recall@10 | 1.00000 | 1.00000 | 0.0 pp | ✓ |
| 1024 | 🇪🇸 ES | MRR@10 | 0.99089 | 0.99089 | 0.0 pp | ✓ |
| 512 | 🇬🇧 EN | Recall@1 | 0.99609 | 0.99609 | 0.0 pp | ✓ |
| 512 | 🇬🇧 EN | Recall@10 | 1.00000 | 1.00000 | 0.0 pp | ✓ |
| 512 | 🇬🇧 EN | MRR@10 | 0.99740 | 0.99740 | 0.0 pp | ✓ |
| 512 | 🇪🇸 ES | Recall@1 | 0.98633 | 0.98438 | −0.20 pp | ✓ |
| 512 | 🇪🇸 ES | Recall@10 | 1.00000 | 1.00000 | 0.0 pp | ✓ |
| 512 | 🇪🇸 ES | MRR@10 | 0.99186 | 0.99089 | −0.10 pp | ✓ |
Headline numbers (TL;DR):
- ✅ Recall@10 = 1.0000 in every cell, every language, every dimension. The positive passage is always in the top-10 for both BF16 and AWQ.
- ✅ English: literally identical to BF16 — 0.0 pp on Recall@1, Recall@10, MRR@10 at all three dimensions.
- ✅ Spanish (never seen during calibration): −0.2 pp Recall@1, −0.1 pp MRR@10 at 2 048-d and 512-d, 0.0 pp at 1 024-d. All within the suggested 0.5 pp gate.
- ✅ Mean BF16↔AWQ vector cosine 0.9947–0.9971 across both languages and all dimensions.
Full machine-readable reports: validation_report_en.json, validation_report_es.json. Methodology and reproduction: BENCHMARKS.md.
Caveat — read this before deploying: both PAQ and MIRACL-ES positives are easy (positive passage is nearly always rank-1 for both BF16 and AWQ), so the deltas above are lower bounds on quality. They prove the build is sound (no broken layers, no silently-loaded BF16 weights, no language-specific collapse), not that AWQ will be lossless on your traffic. Re-validate on your own held-out production pairs (queries + passages, with realistic length/language/domain mix) before committing to a recall budget. NVIDIA's NVFP4 derivative benchmarks NDCG@10 72.00 vs 72.38 BF16 on RTEB — expect AWQ to land in the same ballpark.
What's in the box
| File | Purpose |
|---|---|
model.safetensors |
994 MB — 112 INT4 Linear weights + BF16 embedding table + BF16 norms |
config.json |
Ministral3Model config + quantization_config block |
tokenizer.json, tokenizer_config.json |
Tokenizer (preserved from base) |
1_Pooling/, modules.json, config_sentence_transformers.json, sentence_bert_config.json |
Sentence Transformers metadata (mean pooling + L2 normalize + query:/passage: prompts) |
recipe.yaml |
Exact llmcompressor recipe (AWQModifier + QuantizationModifier) |
awq_build_settings.json |
Reproducibility record of every CLI flag |
validation_report_en.json |
BF16-vs-AWQ retrieval metrics on English PAQ held-out (this card) |
validation_report_es.json |
BF16-vs-AWQ retrieval metrics on Spanish MIRACL-ES held-out (this card) |
LICENSE, NOTICE, THIRD_PARTY_NOTICES.md |
Inherited from NVIDIA |
Source scripts (quantize_nemotron_awq.py, prepare_paq_calibration.py, prepare_bilingual_calibration.py, validate_awq_embeddings.py, dump_and_validate_gpu2.py) live alongside this README.
Reproduce this exact checkpoint
Single-GPU (RTX 3090, ~35 min wall-clock):
python3.12 -m venv ~/.venvs/nemotron-awq
source ~/.venvs/nemotron-awq/bin/activate
pip install "llmcompressor==0.12.0" "datasets" "huggingface_hub[hf_xet]"
./prepare_paq_calibration.py --output paq.jsonl --num-pairs 4096 --seed 42
CUDA_VISIBLE_DEVICES=0 python ./quantize_nemotron_awq.py \
--model nvidia/Nemotron-3-Embed-1B-BF16 \
--calibration-jsonl ./paq.jsonl \
--output ./Nemotron-3-Embed-1B-AWQ-W4A16-G32-ASYM \
--num-samples 1024 --max-seq-length 4096 \
--group-size 32 --asymmetric --observer mse \
--n-grid 100 --mse-grid 200 --mse-maxshrink 0.20 --mse-patience 40 --mse-norm 2.4 \
--attn-implementation sdpa --overwrite
For 3× 3090s use torchrun --nproc_per_node=3 (see BENCHMARKS.md). The build settings and exact CLI are also persisted in awq_build_settings.json.
Spanish + English bilingual rebuild
This checkpoint was calibrated on English-only PAQ and already transfers to Spanish with only −0.2 pp Recall@1 (see benchmarks above). If your traffic is majority Spanish and you want to recover that last 0.2 pp, rebuild with the bilingual recipe in RECIPE_BILINGUAL.md — it pulls 50 % sentence-transformers/paq (English) and 50 % Hieuman/es_MIRACL (native Spanish Wikipedia QA), so AWQ scale search sees real Spanish retrieval prefixes and the model's response to Spanish activation distributions.
./prepare_bilingual_calibration.py \
--output bilingual_calibration.jsonl \
--num-pairs-en 512 \
--num-pairs-es 512 \
--seed 42
CUDA_VISIBLE_DEVICES=0 python ./quantize_nemotron_awq.py \
--model nvidia/Nemotron-3-Embed-1B-BF16 \
--calibration-jsonl ./bilingual_calibration.jsonl \
--output ./Nemotron-3-Embed-1B-AWQ-W4A16-G32-ASYM-EN-ES \
--num-samples 1024 --max-seq-length 4096 \
--group-size 32 --asymmetric --observer mse \
--n-grid 100 --mse-grid 200 --mse-maxshrink 0.20 --mse-patience 40 --mse-norm 2.4 \
--attn-implementation sdpa --overwrite
How this differs from NVIDIA's NVFP4
| Property | This checkpoint | nvidia/Nemotron-3-Embed-1B-NVFP4 |
|---|---|---|
| Algorithm | AWQ + W4A16 GPKQ | NVFP4 + QAT distillation |
| Weight format | INT4 group-asymmetric | NVFP4 (8E4M3 on H100/RTX 50) |
| Hardware target | Any CUDA GPU (Marlin) | Blackwell / Hopper preferred |
| Calibration | 1 024 retrieval samples | PTQ + quantization-aware training |
| RTEB NDCG@10 | Not measured here | 72.00 (vs 72.38 BF16) |
| Best for | RTX 30-series, A-series | H100 / H200 / B-series |
NVFP4 is the right choice if you have Hopper+ and want maximum throughput; this AWQ build is the right choice for Ampere/Ada (RTX 3090/4090, A10/A100) where Marlin W4A16 is the fastest 4-bit path.
License
This model is a derivative of nvidia/Nemotron-3-Embed-1B-BF16 and inherits its OpenMDW-1.1 license. The LICENSE, NOTICE, and THIRD_PARTY_NOTICES.md files are preserved unchanged. Attribution: this checkpoint was produced by Facu Vlad J (HuggingFace groxaxo) using llmcompressor 0.12.0.
The accompanying Python scripts in this repository are MIT-licensed; see each file header.
Citation
If you use this checkpoint, please cite both NVIDIA's Nemotron model card and this rebuild:
@misc{nvidia_nemotron_3_embed_1b,
title = {Nemotron-3-Embed-1B-BF16},
author = {NVIDIA Corporation},
url = {https://huggingface.co/nvidia/Nemotron-3-Embed-1B-BF16},
year = {2026}
}
@misc{groxaxo_nemotron_3_embed_awq,
title = {Quality-maxed W4A16 AWQ rebuild of Nemotron-3-Embed-1B},
author = {Vlad J, Facu (groxaxo)},
url = {https://huggingface.co/groxaxo/Nemotron-3-Embed-1B-AWQ-W4A16},
year = {2026},
note = {Built with llmcompressor 0.12.0; compressed-tensors format for vLLM/Marlin}
}
Español
Nemotron-3-Embed-1B-AWQ-W4A16
AWQ de 4 bits de NVIDIA Nemotron-3-Embed-1B con calidad máxima — la mitad de tamaño, 0.0 pp de pérdida en Recall@10 en inglés Y en español, a pesar de estar calibrado únicamente en inglés.
1.0 GB en disco · encoder de recuperación de 2048 dimensiones · acelerado con vLLM Marlin W4A16 · G32 asimétrico · observador MSE · 1024 muestras de calibración
Esta es una reconstrucción W4A16 AWQ de nvidia/Nemotron-3-Embed-1B-BF16 usando llmcompressor 0.12.0, serializada como compressed-tensors para servirse nativamente con vLLM/Marlin. Cada peso Linear está en INT4 (grupo 32, asimétrico, con zero-point) con activaciones en BF16; la tabla de embeddings de tokens (131 072 × 2 048) y todas las RMSNorms permanecen en BF16 para proteger la fidelidad semántica.
El resultado: 56 % más chico, 0.0 puntos porcentuales de pérdida en Recall@10 frente a BF16 en dos idiomas (inglés con PAQ y español con MIRACL-ES, 512 pares held-out cada uno) y tres dimensionalidades (2 048, 1 024, 512). El coseno vectorial BF16↔AWQ se mantiene entre 0.995 y 0.997 en todas partes.
Por qué este checkpoint
| Qué obtenés | Spec |
|---|---|
| Precisión de pesos | INT4 (asimétrico, zero-point habilitado) |
| Precisión de activaciones | BF16 |
| Group size | 32 — el más chico que soporta vLLM Marlin |
| Observador | MSE (grid 200, maxshrink 0.20, patience 40, norm 2.4) |
| AWQ scaling | duo_scaling="both", n_grid 100 |
| Calibración | 1 024 pares PAQ, 50 % queries / 50 % passages, tope de 4 096 tokens, BS=1 |
| Módulos cuantizados | Solo Linear (112 capas: q/k/v/o + gate/up/down × 16) |
| Mantenidos en BF16 | Tabla de embeddings, 33 RMSNorms, pooling, norma de salida |
| Formato del checkpoint | compressed-tensors pack-quantized v0.17.1 |
| Motor de servido | vLLM ≥ 0.25.0 (kernel Marlin auto-seleccionado) |
| Atención | SDPA |
| Tamaño en disco | 1.0 GB (vs 2.28 GB de BF16) |
G32 asimétrico es el objetivo de calidad máxima dentro de W4A16: minimiza el error de reconstrucción por grupo y es el group size más chico que acepta el path W4A16 Marlin de vLLM. Combinarlo con un observador MSE que prueba 200 candidatos de clipping sobre un rango de shrink del 20 % entrega el menor error de reconstrucción publicable que se puede alcanzar sin irse a W8A16 o BF16.
Inicio rápido — servir con vLLM
pip install "vllm==0.25.0"
vllm serve groxaxo/Nemotron-3-Embed-1B-AWQ-W4A16 \
--host 0.0.0.0 --port 8000 \
--served-model-name nemotron-embed \
--dtype bfloat16 \
--max-model-len 4096 \
--max-num-batched-tokens 4096 \
--max-cudagraph-capture-size 4096
No pasar --quantization awq. El checkpoint ya trae metadata de compressed-tensors y vLLM selecciona el kernel W4A16 Marlin automáticamente.
Consultar el endpoint /v2/embed:
import requests
r = requests.post(
"http://localhost:8000/v2/embed",
json={
"model": "nemotron-embed",
"input_type": "query", # o "document" / "passage"
"texts": ["How do I rotate an IAM access key?"],
"embedding_types": ["float"],
"truncate": "END",
},
timeout=60,
).json()
vec = r["embeddings"]["float"][0] # 2048-dim, L2-normalizado
El modelo espera los prefijos query: / passage: ; vLLM los aplica desde input_type usando la metadata de Sentence Transformers incluida — no agregar los prefijos a mano.
Inicio rápido — transformers / sentence-transformers
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("groxaxo/Nemotron-3-Embed-1B-AWQ-W4A16")
queries = ["¿Cómo renuevo una clave de acceso IAM?", "How do I rotate an IAM key?"]
passages = ["Para rotar una clave IAM, primero crea una segunda clave...",
"To rotate an IAM access key, first create a second key..."]
q = model.encode(queries, prompt_name="query", normalize_embeddings=True)
d = model.encode(passages, prompt_name="document", normalize_embeddings=True)
scores = q @ d.T # matriz 2x2 de similaridad coseno
Benchmarks — BF16 vs AWQ, inglés + español
Dos evaluaciones held-out completamente separadas, ambas corridas en una sola RTX 3090 con vLLM 0.25.0:
- Inglés — 512 pares query/passage de
sentence-transformers/paq, disjuntos del set de calibración inglés (seed 999, deduplicados contra la partición calibrada con seed 42). - Español — 512 pares query/passage de
Hieuman/es_MIRACL(MIRACL-ES), seed 999 disjunto. No se usó nada de español durante la calibración AWQ — esto mide cómo el checkpoint calibrado en inglés se transfiere a un segundo idioma.
| Dim | Idioma | Métrica | BF16 | AWQ | Δ | Gate (≤0.5 pp) |
|---|---|---|---|---|---|---|
| 2048 | 🇬🇧 EN | Recall@1 | 0.99805 | 0.99805 | 0.0 pp | ✓ |
| 2048 | 🇬🇧 EN | Recall@10 | 1.00000 | 1.00000 | 0.0 pp | ✓ |
| 2048 | 🇬🇧 EN | MRR@10 | 0.99902 | 0.99902 | 0.0 pp | ✓ |
| 2048 | 🇬🇧 EN | Coseno q/d (media) | — | 0.99622 / 0.99694 | — | ✓ |
| 2048 | 🇪🇸 ES | Recall@1 | 0.98828 | 0.98633 | −0.20 pp | ✓ |
| 2048 | 🇪🇸 ES | Recall@10 | 1.00000 | 1.00000 | 0.0 pp | ✓ |
| 2048 | 🇪🇸 ES | MRR@10 | 0.99382 | 0.99284 | −0.10 pp | ✓ |
| 2048 | 🇪🇸 ES | Coseno q/d (media) | — | 0.99673 / 0.99710 | — | ✓ |
| 1024 | 🇬🇧 EN | Recall@1 | 0.99805 | 0.99805 | 0.0 pp | ✓ |
| 1024 | 🇬🇧 EN | Recall@10 | 1.00000 | 1.00000 | 0.0 pp | ✓ |
| 1024 | 🇬🇧 EN | MRR@10 | 0.99902 | 0.99902 | 0.0 pp | ✓ |
| 1024 | 🇪🇸 ES | Recall@1 | 0.98242 | 0.98242 | 0.0 pp | ✓ |
| 1024 | 🇪🇸 ES | Recall@10 | 1.00000 | 1.00000 | 0.0 pp | ✓ |
| 1024 | 🇪🇸 ES | MRR@10 | 0.99089 | 0.99089 | 0.0 pp | ✓ |
| 512 | 🇬🇧 EN | Recall@1 | 0.99609 | 0.99609 | 0.0 pp | ✓ |
| 512 | 🇬🇧 EN | Recall@10 | 1.00000 | 1.00000 | 0.0 pp | ✓ |
| 512 | 🇬🇧 EN | MRR@10 | 0.99740 | 0.99740 | 0.0 pp | ✓ |
| 512 | 🇪🇸 ES | Recall@1 | 0.98633 | 0.98438 | −0.20 pp | ✓ |
| 512 | 🇪🇸 ES | Recall@10 | 1.00000 | 1.00000 | 0.0 pp | ✓ |
| 512 | 🇪🇸 ES | MRR@10 | 0.99186 | 0.99089 | −0.10 pp | ✓ |
Números destacados (TL;DR):
- ✅ Recall@10 = 1.0000 en todas las celdas, en todos los idiomas, en todas las dimensiones. El passage correcto siempre aparece en el top-10 tanto para BF16 como para AWQ.
- ✅ Inglés: idéntico a BF16 — 0.0 pp en Recall@1, Recall@10 y MRR@10 en las tres dimensiones.
- ✅ Español (nunca visto durante la calibración): −0.2 pp Recall@1, −0.1 pp MRR@10 en 2 048-d y 512-d, 0.0 pp en 1 024-d. Todos dentro del gate sugerido de 0.5 pp.
- ✅ Coseno vectorial BF16↔AWQ entre 0.9947 y 0.9971 en ambos idiomas y todas las dimensiones.
Reportes completos legibles por máquina: validation_report_en.json, validation_report_es.json. Metodología y reproducción: BENCHMARKS.md.
Advertencia — leer antes de desplegar a producción: los positives de PAQ y MIRACL-ES son fáciles (el passage correcto casi siempre es rank-1 tanto para BF16 como para AWQ), así que los deltas de arriba son cotas inferiores de calidad. Demuestran que el build es sano (sin capas rotas, sin pesos BF16 cargados silenciosamente, sin colapso por idioma), no que AWQ vaya a ser lossless en tu tráfico. Re-validá con tus propios pares held-out de producción (queries + passages, con mix realista de longitud/idioma/dominio) antes de comprometer un presupuesto de recall. La derivada NVFP4 de NVIDIA publica NDCG@10 72.00 vs 72.38 BF16 en RTEB — AWQ debería caer en el mismo ballpark.
Qué hay en la caja
| Archivo | Para qué sirve |
|---|---|
model.safetensors |
994 MB — 112 pesos Linear en INT4 + tabla de embeddings en BF16 + normas en BF16 |
config.json |
Config de Ministral3Model + bloque quantization_config |
tokenizer.json, tokenizer_config.json |
Tokenizer (preservado del modelo base) |
1_Pooling/, modules.json, config_sentence_transformers.json, sentence_bert_config.json |
Metadata de Sentence Transformers (mean pooling + L2 normalize + prompts query:/passage:) |
recipe.yaml |
Receta exacta de llmcompressor (AWQModifier + QuantizationModifier) |
awq_build_settings.json |
Registro de reproducibilidad de todos los flags CLI |
validation_report_en.json |
Métricas de recuperación BF16-vs-AWQ sobre held-out inglés (esta card) |
validation_report_es.json |
Métricas de recuperación BF16-vs-AWQ sobre held-out español (esta card) |
LICENSE, NOTICE, THIRD_PARTY_NOTICES.md |
Heredados de NVIDIA |
Los scripts fuente (quantize_nemotron_awq.py, prepare_paq_calibration.py, prepare_bilingual_calibration.py, validate_awq_embeddings.py, dump_and_validate_gpu2.py) viven junto a este README.
Reproducir este checkpoint exacto
Una sola GPU (RTX 3090, ~35 min reloj):
python3.12 -m venv ~/.venvs/nemotron-awq
source ~/.venvs/nemotron-awq/bin/activate
pip install "llmcompressor==0.12.0" "datasets" "huggingface_hub[hf_xet]"
./prepare_paq_calibration.py --output paq.jsonl --num-pairs 4096 --seed 42
CUDA_VISIBLE_DEVICES=0 python ./quantize_nemotron_awq.py \
--model nvidia/Nemotron-3-Embed-1B-BF16 \
--calibration-jsonl ./paq.jsonl \
--output ./Nemotron-3-Embed-1B-AWQ-W4A16-G32-ASYM \
--num-samples 1024 --max-seq-length 4096 \
--group-size 32 --asymmetric --observer mse \
--n-grid 100 --mse-grid 200 --mse-maxshrink 0.20 --mse-patience 40 --mse-norm 2.4 \
--attn-implementation sdpa --overwrite
Para 3× 3090 usar torchrun --nproc_per_node=3 (ver BENCHMARKS.md). Los settings del build y el CLI exacto también están persistidos en awq_build_settings.json.
Rebuild bilingüe español + inglés
Este checkpoint se calibró sobre PAQ inglés únicamente y ya se transfiere a español con apenas −0.2 pp de Recall@1 (ver benchmarks arriba). Si tu tráfico es mayoritariamente español y querés recuperar esos últimos 0.2 pp, reconstruilo con la receta bilingüe en RECIPE_BILINGUAL.md — toma 50 % sentence-transformers/paq (inglés) y 50 % Hieuman/es_MIRACL (QA nativo de Wikipedia en español), así la búsqueda de escalas AWQ ve prefijos de recuperación reales en español y la respuesta del modelo a las distribuciones de activación del español.
./prepare_bilingual_calibration.py \
--output bilingual_calibration.jsonl \
--num-pairs-en 512 \
--num-pairs-es 512 \
--seed 42
CUDA_VISIBLE_DEVICES=0 python ./quantize_nemotron_awq.py \
--model nvidia/Nemotron-3-Embed-1B-BF16 \
--calibration-jsonl ./bilingual_calibration.jsonl \
--output ./Nemotron-3-Embed-1B-AWQ-W4A16-G32-ASYM-EN-ES \
--num-samples 1024 --max-seq-length 4096 \
--group-size 32 --asymmetric --observer mse \
--n-grid 100 --mse-grid 200 --mse-maxshrink 0.20 --mse-patience 40 --mse-norm 2.4 \
--attn-implementation sdpa --overwrite
Diferencias frente al NVFP4 de NVIDIA
| Propiedad | Este checkpoint | nvidia/Nemotron-3-Embed-1B-NVFP4 |
|---|---|---|
| Algoritmo | AWQ + W4A16 GPKQ | NVFP4 + destilación QAT |
| Formato de pesos | INT4 group-asymmetric | NVFP4 (8E4M3 en H100/RTX 50) |
| Hardware objetivo | Cualquier GPU CUDA (Marlin) | Blackwell / Hopper preferido |
| Calibración | 1 024 muestras de retrieval | PTQ + quantization-aware training |
| RTEB NDCG@10 | No medido acá | 72.00 (vs 72.38 BF16) |
| Mejor para | Serie RTX 30, serie A | H100 / H200 / serie B |
NVFP4 es la opción correcta si tenés Hopper+ y querés máximo throughput; este build AWQ es la opción correcta para Ampere/Ada (RTX 3090/4090, A10/A100), donde Marlin W4A16 es el path de 4 bits más rápido.
Licencia
Este modelo es un derivado de nvidia/Nemotron-3-Embed-1B-BF16 y hereda su licencia OpenMDW-1.1. Los archivos LICENSE, NOTICE y THIRD_PARTY_NOTICES.md se preservan sin cambios. Atribución: este checkpoint fue producido por Facu Vlad J (HuggingFace groxaxo) usando llmcompressor 0.12.0.
Los scripts Python adjuntos en este repositorio están bajo licencia MIT; ver el header de cada archivo.
Cita
Si usás este checkpoint, citá tanto la card del modelo Nemotron de NVIDIA como este rebuild:
@misc{nvidia_nemotron_3_embed_1b,
title = {Nemotron-3-Embed-1B-BF16},
author = {NVIDIA Corporation},
url = {https://huggingface.co/nvidia/Nemotron-3-Embed-1B-BF16},
year = {2026}
}
@misc{groxaxo_nemotron_3_embed_awq,
title = {Quality-maxed W4A16 AWQ rebuild of Nemotron-3-Embed-1B},
author = {Vlad J, Facu (groxaxo)},
url = {https://huggingface.co/groxaxo/Nemotron-3-Embed-1B-AWQ-W4A16},
year = {2026},
note = {Built with llmcompressor 0.12.0; compressed-tensors format for vLLM/Marlin}
}
- Downloads last month
- 171
Model tree for groxaxo/Nemotron-3-Embed-1B-AWQ-W4A16
Base model
mistralai/Ministral-3-3B-Base-2512