Instructions to use BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- llama.cpp
How to use BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF with llama.cpp:
Install (macOS, Linux)
curl -LsSf https://llama.app/install.sh | sh # Start a local OpenAI-compatible server with a web UI: llama serve -hf BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS # Run inference directly in the terminal: llama cli -hf BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama serve -hf BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS # Run inference directly in the terminal: llama cli -hf BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS
Use pre-built binary
# Download pre-built binary from: # https://github.com/ggerganov/llama.cpp/releases # Start a local OpenAI-compatible server with a web UI: ./llama-server -hf BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS # Run inference directly in the terminal: ./llama-cli -hf BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS
Build from source code
git clone https://github.com/ggerganov/llama.cpp.git cd llama.cpp cmake -B build cmake --build build -j --target llama-server llama-cli # Start a local OpenAI-compatible server with a web UI: ./build/bin/llama-server -hf BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS # Run inference directly in the terminal: ./build/bin/llama-cli -hf BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS
Use Docker
docker model run hf.co/BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS
- LM Studio
- Jan
- vLLM
How to use BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS
- Ollama
How to use BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF with Ollama:
ollama run hf.co/BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS
- Unsloth Desktop
- Pi
How to use BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF with Pi:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS
Configure the model in Pi
# Install Pi: npm install -g @earendil-works/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "llama-cpp": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Docker Model Runner
How to use BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF with Docker Model Runner:
docker model run hf.co/BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS
- Lemonade
How to use BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS
Run and chat with the model
lemonade run user.NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF-IQ3_XXS
List all available models
lemonade list
- Hermes Agent
How to use BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF with Hermes Agent:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS
Configure Hermes
# Install Hermes: curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash hermes setup # Point Hermes at the local server: hermes config set model.provider custom hermes config set model.base_url http://127.0.0.1:8080/v1 hermes config set model.default BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS
Run Hermes
hermes
- Atomic Chat
- OpenClaw
How to use BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF with OpenClaw:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS
Configure OpenClaw
# Install OpenClaw: npm install -g openclaw@latest # Register the local server and set it as the default model: openclaw onboard --non-interactive --mode local \ --auth-choice custom-api-key \ --custom-base-url http://127.0.0.1:8080/v1 \ --custom-model-id "BoldingBuilds/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-ShimQuant-GGUF:IQ3_XXS" \ --custom-provider-id llama-cpp \ --custom-compatibility openai \ --custom-text-input \ --accept-risk \ --skip-health
Run OpenClaw
openclaw agent --local --agent main --message "Hello from Hugging Face"
Nemotron-3.5-Lightning-30B-A3B, ShimQuant tuned, 11.77 GiB
This file will not load in stock llama.cpp, LM Studio, Ollama, or any other unpatched runtime. It needs the ShimQuant patch. The failure is immediate and explicit, not silent corruption:
check_tensor_dims: tensor 'blk.0.ssm_in.weight' has wrong shape; expected 2688, 10304, got 2816, 10304 llama_model_load_from_file_impl: failed to load modelRead Requirements before downloading 11.77 GiB.
A 3.07 bits-per-weight build of Nemotron-3.5-Lightning that runs on a 16 GB consumer card at 262,144 tokens of context. The stock quantizer cannot produce a file this size for this model at any label.
11.77 GiB = 12.63 GB. Both units appear below because comparable published work uses decimal GB and mixing them makes files look smaller than they are.
About the name. The file says IQ3_XXS because IQ3_XXS is nominally 3.0625 bpw and this file
measures 3.069, which is closer than any other standard label gets. The tensors are not all
IQ3_XXS. The recipe is a Q6_K base with iq2_xxs on gate and up, iq2_s on down, and q8_0 pinned on
blk.52, and GGUF has no field that can say that. general.file_type is set to IQ3_XXS to match the name. That
declares the bit budget, not the tensor types, which is the closest honest thing the format allows.
llama-quantize leaves it at the base type you passed, so it read Q6_K until I corrected it by hand.
Why this exists
Nemotron-3.5-Lightning has n_embd = 2688 and expert widths of 1856 and 3712. None divide by
256, so no k-quant or i-quant can legally apply to about 99% of its parameters.
llama-quantize substitutes a 32-block type instead and keeps the requested filename, so
every published low-bit quant of this model measures ~4.70 bpw regardless of its name. The
four IQ2 rungs in the popular repos are the same file under four labels. Census across 25
repos and 443 quants: ggufaudit.
ShimQuant shims each affected tensor row out to the next multiple of 256, so the low-bit types actually apply. The shim is zero-padding written at quantize time and sliced back off the activations at inference. The expert banks here shim 1856 to 2048, which is 9.4% overhead. That small distance to the next multiple is why this model is a good candidate and others are not.
Prior report of the underlying mechanism on this model: worthant, 2026-08-12.
Divergence from the Q8_0 reference
Mean per-token KL divergence in nats against one shared answer key: Q8_0 logits dumped once from the stock build, teacher-forced over a fixed corpus, identical for every row.
| build | measured bpw | size | KLD vs Q8_0 |
|---|---|---|---|
| stock IQ3_XXS | 4.70 | 18.01 GiB | 0.0398 |
| stock IQ2_M | 4.70 | 18.00 GiB | 0.2722 |
| shimmed IQ3_XXS | 3.58 | 13.71 GiB | 0.2541 |
| shimmed IQ2_M | 3.13 | 12.01 GiB | 0.5229 |
| this file (shimmed, tuned) | 3.07 | 11.77 GiB | 0.1230 |
Note the two middle rows. Shimming on its own is worse than stock, and by a wide margin. It does not improve anything; all it does is make the low-bit types legal on these tensor widths. The tuned recipe is what turns that access into a usable file, and without it this technique looks like a bad trade.
Read that table honestly. Against stock IQ2_M this file is 6.2 GiB smaller and less divergent, which is a strict improvement. Against stock IQ3_XXS it is 6.2 GiB smaller and three times more divergent, which is a trade. This file does not dominate the published ladder and the claim here is narrower: below about 18 GiB the stock quantizer produces nothing at all for this model, and this is a usable file in that gap.
Capability
HumanEval, greedy decoding, executed tests, 6000-token cap, 164 problems.
| pass@1 | hit token cap | accuracy when code was emitted | |
|---|---|---|---|
| this file | 91.5% | 5.5% | 97.4% |
Against other published builds of this model
Same harness, same 164 problems, same greedy settings, same token budget, same machine. Sizes in decimal GB. Comparison files are from AtomicChat, whose published divergence figures are measured against a different corpus and are therefore not comparable to the table above. This is why they were re-scored here rather than quoted.
| build | maker | size | pass@1 | hit token cap |
|---|---|---|---|---|
| AD-Q2_0 | AtomicChat | 11.39 GB | 0.0% | 59.8% |
| this file | ShimQuant | 12.63 GB | 91.5% | 5.5% |
| AD-Q2_0_L | AtomicChat | 15.52 GB | 37.8% | 39.6% |
| AD-IQ4_NL | AtomicChat | 19.65 GB | 91.5% | 4.9% |
AD-Q2_0 produced no parseable function in 164 attempts, which matches its maker's own
assessment of it as unusable. AD-IQ4_NL is that repo's recommended build and it ties this
file exactly, at 7.02 GB larger. The AtomicChat repo states plainly that "there is currently
no good 16 GB option for this model, from anyone." That was accurate when written.
Measured on a 16 GB card
RTX 5080, 16,303 MiB, full offload, patched build a41d55cb8.
| value | |
|---|---|
| maximum context loaded | 262,144 |
| peak VRAM at that context | 13,458 MiB of 16,303 |
| peak VRAM at 65,536 context | 13,171 MiB |
Context is nearly free on this model because most of its layers are SSM rather than attention, so there is no KV cache growing with sequence length. Going from 65,536 to 262,144 tokens costs 287 MiB. 262,144 was the largest value tested, not a measured ceiling.
Throughput
A single generation number is not meaningful for this file, because the two things that move
it most are prompt depth and whether MTP is on. All of the following is one card, one file,
-c 16384, greedy, full offload.
| prompt | workload | no MTP | with MTP | gain |
|---|---|---|---|---|
| 906 tok | code | 139.8 tok/s | 148.1 tok/s | 1.06x |
| 12,346 tok | prose | 73.6 tok/s | 144.4 tok/s | 1.96x |
| 14,306 tok | code | 64.9 tok/s | 109.4 tok/s | 1.69x |
Prefill runs 397 to 745 tok/s without MTP and 582 to 667 with it, rising with prompt length in both cases.
The gain grows with prompt depth. MTP buys little on a short prompt and close to a doubling at 12,000 tokens and up, so an agent working in a real codebase gets far more from it than a chat turn does. A separate sweep at shorter prompts and a 120-token budget measured 1.2x fairly flatly from 231 to 906 tokens, so the shallow figure depends on how much you generate as well as on prompt length; treat 1.06x and 1.2x as the same weak result rather than a discrepancy.
Every number above is wall-clock verified. That matters more than it sounds: llama-server's
reported timings.predicted_per_second does not account for draft-side work, and on a
different model we measured it reporting 38.6 tok/s during a request that took 537 seconds.
It agrees with wall clock for this file, but do not benchmark any speculative config from that
field alone.
To turn MTP on, add --spec-type draft-mtp --spec-draft-n-max 3. No draft model argument is
needed; the head is blk.52 inside this file, which is why it is pinned to q8_0 in the recipe
below rather than pruned out.
On quality: speculative decoding is supposed to be output-preserving, since the draft only proposes and the target verifies. Scored on the full 164-problem harness with and without the flag, 9 of 164 outcomes changed, 6 down and 3 up. The measurement noise floor on this harness is exactly 0.0000 over six identical runs, so those 9 flips are real differences caused by MTP rather than variance. Exact McNemar on the paired outcomes gives p = 0.51, so the net direction is not established, and conditional accuracy is unchanged at 0.9735 against 0.9740. Four of the six losses are problems that hit the token cap only with MTP, so what shifts is which problems run long, not whether the model writes correct code.
That is a weaker claim than "free" and a weaker claim than "costly", and it is the one the evidence supports.
Tool calling
Agentic use needs more than pass@1. A coding worker reads files, runs commands and searches, which means emitting a well-formed tool call with the right name and the right arguments. That is a stricter target than a function body, because a wrong token inside a JSON argument is a hard failure with no partial credit.
170 cases: 160 across four tools (read_file, run_command, search_code, list_dir), plus
10 questions that need no tool at all.
| emitted a well-formed tool call | 160/160 |
| chose the correct tool | 159/160 |
| correct tool and correct arguments | 159/160, 0.994 |
| did not call a tool when none was needed | 10/10 |
The single failure routes "What does Makefile contain?" to list_dir instead of read_file.
The restraint row matters as much as the accuracy row. Over-calling is the usual failure mode of small quantized models, and a benchmark that only rewards calling would score a model that calls constantly as perfect. Ten cases is a small sample and this row should be read as indicative rather than precise.
For context, the same harness run across a full qwen3-30b-a3b ladder moves from 1.000 at Q8_0 to 0.981 at IQ2_M, with no rung significantly different from its own Q8_0 reference under exact McNemar. Tool calling appears to be considerably more robust to quantization than code generation is, which was the opposite of what we expected going in.
Requires --jinja. Without it llama-server ignores the tools array and replies in prose.
Requirements
git clone https://github.com/ggml-org/llama.cpp && cd llama.cpp
git checkout e70802a01f03f0ed31a26338a5664796f3824371
git apply /path/to/shimquant.patch # github.com/JoshBolding/shimquant
cmake -B build -DGGML_CUDA=ON && cmake --build build -j
The commit is pinned because every number here was measured on a build of it. As of
2026-08-28 the patch also applies cleanly to upstream master (50f068fff), verified with
git apply --check, but that build is unmeasured.
./build/bin/llama-server -m Nemotron-3.5-Lightning-30B-A3B-ShimQuant-IQ3_XXS.gguf -ngl 99 -c 32768
Backends
| backend | status |
|---|---|
| CUDA | measured on RTX 3090 and RTX 5080 |
| Metal | builds and runs correctly on Apple M2 Pro; perplexity on a shimmed toy model matches CPU to within 0.002% |
| CPU | works |
| Vulkan, ROCm | untested, no hardware |
Shimming does not change the math
The concern with a graph-level change is that it quietly alters results. It does not. The same model quantized to Q8_0 twice, once normally and once with shimming forced on for eight tensors including a 320 to 512 widening, gives identical perplexity:
Q8_0, no shim PPL = 260.7309 +/- 0.54015
Q8_0, shimmed PPL = 260.7309 +/- 0.54015
The recipe
Q6_K everywhere except the expert banks, which carry about 93% of the parameters and are the cheapest class to crush on this model, measured by single-class ablation:
llama-quantize --imatrix nemotron.imatrix \
--tensor-type "blk.52.=q8_0" \
--tensor-type "ffn_(gate|up)_exps=iq2_xxs" \
--tensor-type "ffn_down_exps=iq2_s" \
BF16.gguf output.gguf Q6_K 24
blk.52 is the MTP block. It is decode-only, gets no imatrix data, and llama-quantize
refuses low-bit types on tensors without importance statistics, so it must be pinned.
Limitations
- Patched build only. Stated three times because it is the real cost of using this.
- Does not beat stock IQ3_XXS on divergence. See the table above. The claim is about a size range the stock quantizer cannot reach, not about winning everywhere.
- Reasoning is on by default and
--reasoning-budget 0does not disable it on this architecture. About 5% of HumanEval problems exhaust the token budget inside the thinking block without emitting an answer. Raisemax_tokensif you see empty replies. Doubling the budget to 12,000 raises pass@1 to 93.9% and cuts the capped rate to 3.0%. - Evaluated on code and general text. No multilingual, long-context, or agentic evaluation, despite the context figure above being a load test rather than a quality test.
- One model, one recipe. ShimQuant does not help everywhere. On Qwen3.8-Flash-Next the same technique produced a worse result than the existing published quants, because 29% of that model is a per-layer embedding table that shimming cannot touch. Documented in the patch repo.
Credits
- NVIDIA for the original model, released under OpenMDW-1.1, which governs this derivative.
- Unsloth for the BF16 GGUF conversion this was quantized from.
- worthant / AtomicChat for reporting the mechanism on this model first, and for publishing a measured ladder careful enough to compare against.
- The
llama.cppmaintainers, and PR #3747, which introduced the dimension fallback this works around. Deliberate behaviour, not a bug.
- Downloads last month
- 682
3-bit