Model Inventory and Consumer-GPU Sizing¶
Errata (2026-09-23): E2, E8, E9, E10 in
11-errata-2026-09-23.mdcorrect claims in this document. The original text is kept as the record; read those entries before relying on it. Current design:2026-09-23-vss-gaming-gpu-profile-design.md.
Source for all [V] claims: skills/vss-build-vision-ai/references/sizing.md, .../references/edge.md, .../references/services/rt-vlm.md, docs/real-time-vlm.mdx, and deploy/docker/services/nim/ in the VSS repo, read 2026-09-18.
VSS's own sizing formula [V]¶
weights_GB = parameters_billions * bits_per_parameter / 8
model_GB = weights_GB * 1.3
dedicated fits when model_GB <= 0.85 * GPU_VRAM_GB
shared fits when sum(service budgets) <= 0.85 * GPU_VRAM_GB
Bits per parameter: 16 for FP16/BF16, 8 for FP8/INT8, 4 for INT4/NVFP4.
The 30% multiplier covers KV cache and activations. The remaining 15% GPU reserve covers CUDA graphs, framework allocations, and runtime variance. VSS states: "Do not tune a discrete-GPU allocation above 0.85."
The formula is self-consistent with their published table — it reproduces three of their quoted budgets exactly (9B FP8 = 11.7, 7B FP16 = 18.2, 8B FP16 = 20.8).
⚠️ DO NOT EXTRAPOLATE THE FORMULA TO 4-BIT [V, 2026-09-19]¶
Budget from HuggingFace blob sizes, never from the formula. The formula assumes every parameter is quantized. Real NVFP4 checkpoints quantize only part of the network.
For
NVIDIA-Nemotron-Nano-12B-v2-VL-NVFP4-QAD, 2,216,376,832 parameters stay BF16 — the vision tower, four attention layers, the Mambaconv1d, the projector, andlm_headare all inconfig.json'signorelist. That BF16 floor is identical in the FP8 and NVFP4 repos.
Model Formula Actual (HF blob × 1.3) Error 12B-VL NVFP4 7.80 GB 13.78 GB −43% 12B-VL FP8 15.60 GB 20.02 GB −22% Nemotron Nano 9B FP8 11.70 GB 13.39 GB −13% The earlier hedge in this document — "treat every FP4 figure as an optimistic lower bound" — was correct. The magnitude is now measured: the formula understates 4-bit by roughly 40%. The FP4 column in the table below is retained only to show what the formula predicts. It is wrong. Use
04-fp4-and-deployment.mdfor real numbers.
MoE caveat [V]: for mixture-of-experts models, budget total parameters, not active parameters. VSS says this explicitly of Nemotron 3.5 Lightning 30B-A3B: "budget total parameters (30 B), not active parameters (3 B)." The A3B in a model name is a latency property, not a memory property.
GPU budgets¶
VSS's published table [V], extended with consumer cards [C]:
| GPU | Memory | 85% budget | Source |
|---|---|---|---|
| B200 / GB200 | 192 GB | 163.2 GB | [V] |
| H200 | 141 GB | 119.9 GB | [V] |
| DGX Spark / Thor | 128 GB unified | size from actual free | [V] |
| RTX PRO 6000 Blackwell | 96 GB | 81.6 GB | [V] |
| H100 / A100 80 GB | 80 GB | 68.0 GB | [V] |
| L40S / L40 / RTX 6000 Ada / A40 | 48 GB | 40.8 GB | [V] |
| RTX PRO 4500 Blackwell | 32 GB | 27.2 GB | [V] ← smallest entry |
| RTX 5090 (consumer Blackwell) | 32 GB discrete | 27.2 GB | [C] |
| RTX 4090 (consumer Ada) | 24 GB discrete | 20.4 GB | [C] |
There is no GeForce row in VSS's table. The market gap is documented by its absence.
Critical distinction [V]: the DGX Spark / Thor row is unified memory, 128 GB shared between CPU and GPU. VSS's edge profiles exist because there is a lot of slow shared memory, not because the models are small. edge.md notes the local edge LLM "is slow" and recommends a remote endpoint for latency. The edge profile solves the opposite problem from a consumer GPU and does not transfer.
Model budgets¶
Published by VSS [V]; FP4 column computed from their formula [C]:
| Model | Slot | Params | BF16/FP16 | FP8 | FP4 [C] |
|---|---|---|---|---|---|
| Nemotron 3.5 Lightning 30B-A3B (default) | LLM | 30B | ~78 GB [V] | — | ~19.5 GB |
↳ INT4 profile vllm-int4-tp1-pp1-32.0 | LLM | 30B | — | — | ~45 GB observed [V] |
| Nemotron Nano 9B v2 FP8 | LLM | 9B | — | 11.7 GB [V] | ~5.9 GB |
nemotron-nano-12b-v2-vl | VLM | 12B | ~31.2 GB | ~15.6 GB | ~7.8 GB |
| Nemotron-3-Nano-Omni-30B-A3B-Reasoning | VLM (audio) | 30B | ~78 GB | ~39 GB | ~19.5 GB |
| Cosmos Reason 1 7B | VLM | 7B | 18.2 GB [V] | ~9.1 GB | ~4.6 GB |
| Cosmos Reason 2 8B | VLM | 8B | 20.8 GB [V] | ~10.4 GB | ~5.2 GB |
| Qwen3-VL 8B | VLM | 8B | 20.8 GB [V] | ~10.4 GB | ~5.2 GB |
nemotron-embed-vl-1b-v2 | Embedding | 1B | ~2.6 GB | ~1.3 GB | ~0.7 GB |
Note the INT4 anomaly: VSS observes ~45 GB for the 30B-A3B at INT4, against a formula prediction of ~19.5 GB. The vllm-int4-tp1-pp1-32.0 profile carries min_vram_per_device_gb: 32.0 [V]. The gap between formula and observation is unexplained and matters a great deal for extrapolating FP4 numbers — treat every FP4 figure in this table as an optimistic lower bound until this discrepancy is understood [?].
Slot assignments¶
Nemotron Nano 9B v2 FP8 is text-only [V]¶
Not multimodal. It occupies the LLM slot exclusively. Evidence:
- Service profile keys are
llm_local_nvidia-nemotron-nano-9b-v2-fp8andllm_local_shared_nvidia-nemotron-nano-9b-v2-fp8 - Helm exposes it as
llmNameSlug(deploy/helm/developer-profiles/dev-profile-base/values-base.yaml:23) edge.mdcalls it an explicit--llmfallback- Its init container fetches
nemotron_toolcall_parser_no_streaming.py— tool calling, a text-LLM concern - Served by raw vLLM (
nvcr.io/nvidia/vllm:26.07-py3), not a NIM - It never appears as
VLM_NAMEorVLM_MODEL_PATH
Hardware profiles shipped for it [V]: hw-DGX-SPARK, hw-AGX-THOR, hw-IGX-THOR, hw-OTHER, each with a -shared variant.
Multimodal Nemotron variants exist and fill the VLM slot [V]¶
| Model | Mode | Evidence |
|---|---|---|
nemotron-nano-12b-v2-vl | openai-compat | docs/real-time-vlm.mdx:1529 |
| Nemotron-3-Nano-Omni-30B-A3B-Reasoning | vllm-compatible | docs/real-time-vlm.mdx:82 |
| Nemotron-3-Nano-Omni-30B-A3B-Reasoning-FP8 | vllm-compatible | docs/real-time-vlm.mdx:83 |
| Qwen3-Omni-30B-A3B-Instruct | vllm-compatible | docs/real-time-vlm.mdx:85 |
Nemotron-Nano-V3-Omni-GA0420-FP8 | VLM_MODEL_PATH | HuggingFace git ref, in-tree env |
nemotron-embed-vl-1b-v2 | Embedding | libs/vss/core/src/vss_core/knowledge/adapters/{langchain,llama_index}.py |
Omni models do native single-model video + audio understanding [V] (docs/real-time-vlm.mdx:1622), available only on Omni models (:1650). They require VLM_TRUST_REMOTE_CODE=true and VLM_MODEL_SUPPORTS_AUDIO=true (:97).
Audio is a genuinely differentiated signal for home security — glass break, raised voices, smoke alarm, barking — and our current pipeline has no audio capability at all. But at 30B total parameters, the Omni line is out of consumer reach at FP8 (~39 GB) and only marginal at FP4 (~19.5 GB, and see the INT4 anomaly above). Watch this; do not build on it yet.
NIM directories shipped in-tree [V]¶
deploy/docker/services/nim/ contains exactly three model directories:
cosmos3-reasonernemotron-3.5-lightning-30b-a3bnvidia-nemotron-nano-9b-v2-fp8
Plus compose.yml, nim.env, and fallback-override.env. Anything not in this list is reached through vllm-compatible or openai-compat mode rather than a wired NIM profile — a meaningful difference in how much work it is to run.
The co-packing problem¶
A consumer deployment has one GPU. VSS's sizing procedure assumes several: "Inventory every GPU's model, total memory, free memory... Place fixed-footprint services first... Place singleton RT-VLM last, into the capacity step 3 leaves behind; never displace or co-pack a fixed service to free a GPU for it" [V].
On a single card that placement algebra collapses into one question — what co-resides — which is the unsolved case, not a scaled-down solved one.
Rough arithmetic at FP8, VLM + separate LLM [C]:
nemotron-nano-12b-v2-vl 15.6 GB
Nemotron Nano 9B v2 FP8 11.7 GB
-------
27.3 GB vs RTX 4090 budget 20.4 -> DOES NOT FIT
vs RTX 5090 budget 27.2 -> saturated, nothing left
That leaves zero headroom for RT-CV and RT-Embed, which have their own footprints (not yet quantified — [?]). A VLM-only arithmetic is misleading; the perception tier must be counted.
The likely consumer shape [C], unverified¶
One VL model doing both captioning and reasoning, rather than VLM + separate LLM:
nemotron-nano-12b-v2-vl FP8 15.6 GB
-> RTX 4090 (20.4): 4.8 GB left for RT-CV + RT-Embed
-> RTX 5090 (27.2): 11.6 GB left for RT-CV + RT-Embed
This is a topology claim, not a quantization claim, and it differs from both systems: our pipeline splits captioning (Florence-2) from reasoning (Nemotron); VSS's default splits RT-VLM from a separate LLM NIM. The consumer-constrained answer may collapse that split. Unverified — needs the RT-CV/RT-Embed footprints and a real measurement.
Open sizing questions [?]¶
- What are the actual VRAM footprints of RT-CV and RT-Embed? Until these are known, no configuration can be declared to fit.
- Why does the 30B-A3B INT4 profile observe ~45 GB against a ~19.5 GB formula prediction?
- Do official FP4/NVFP4 checkpoints exist for any VLM-slot model, or only quantization recipes?
- Does NVFP4 serving work on consumer Blackwell? Kernel support is gated by compute capability, and GeForce Blackwell is
sm_120while datacenter Blackwell issm_100. "The 5090 has FP4 tensor cores" and "vLLM will serve an NVFP4 checkpoint on a 5090" are different claims. - Does
nemotron-nano-12b-v2-vlhave a local deployment path, or is it remote-endpoint-only? Suggestive evidence [V]: a vLLM model-executor patch exists atservices/rtvi/rt-vlm/docker/rtvi_vlm/patches/evs_vllm_public_files/model_executor/models/nano_nemotron_vl.pycontainingNemotronBaseVLMultiModalProcessor— you do not patch vLLM's model executor for a model you only call over HTTP.
Related¶
01-vss-architecture.md— the service decomposition03-open-questions.md— the full open-question register