|
|
@@ -1,24 +1,27 @@
|
|
|
# NVIDIA Nemotron-3.5-Bolt-74B-A9B-24GB — single DGX Spark, VL, experts
|
|
|
# quantized to 2-bit via QAD (quantization-aware distillation) to fit GB10.
|
|
|
-# Source: NVIDIA forum thread 385978 + model card
|
|
|
-# https://huggingface.co/nvidia/NVIDIA-Nemotron-3.5-Bolt-74B-A9B-24GB (DGX Spark
|
|
|
-# section). 24 GB → one Spark (the "star" for Sparks without 128 GB RAM).
|
|
|
-# tool-eval-bench 88/100.
|
|
|
+# Source: model card Quick Start (authoritative) + NVIDIA forum thread 385978.
|
|
|
+# https://huggingface.co/nvidia/NVIDIA-Nemotron-3.5-Bolt-74B-A9B-24GB
|
|
|
+# 24 GB → one Spark. Card tool-eval-bench anchor: 88/100.
|
|
|
#
|
|
|
-# Image: eugr/spark-vllm-b12x (vLLM nightly main + b12x, sm_121), digest-pinned
|
|
|
-# (arm64, built 2026-10-15). b12x linear/MoE
|
|
|
-# backends + flashinfer mamba. LiLiCorr drafter (dflash, 7) is a SECOND HF repo →
|
|
|
-# resolved via the repo-ref ({{lilicorr}}).
|
|
|
+# IMAGE: the card pins the STOCK vLLM nightly at commit
|
|
|
+# 77154ca6116ae34cbfe314beef1016bde9b63989 (2026-10-14) — the first vLLM build
|
|
|
+# that registers LiLiCorrDraftModel (the DFlash LiLiCorr speculator) and the
|
|
|
+# ultra_v3 reasoning parser — then `pip install b12x` + `vllm download-kernels`.
|
|
|
+# We bake that into docker-images/nemotron-bolt-b12x/ (thin FROM the card's
|
|
|
+# nightly by arm64 digest + b12x 1.5.1 + the ultra_v3 plugin), so sm121 builds
|
|
|
+# it from zero and every serve is reproducible.
|
|
|
#
|
|
|
-# CAVEAT: the card uses a reasoning-parser PLUGIN file `ultra_v3_reasoning_parser.py`
|
|
|
-# (ultra_v3 is NOT built into vLLM). The file ships in the model repo; vLLM
|
|
|
-# resolves it relative to the model dir under --trust-remote-code. If the plugin
|
|
|
-# path does not resolve at launch, point --reasoning-parser-plugin at the
|
|
|
-# snapshot's absolute path (or drop the parser for a text-only smoke).
|
|
|
+# ⚠ eugr/spark-vllm-b12x is a DIFFERENT vLLM fork (commit 8244d1c44) that does
|
|
|
+# NOT carry LiLiCorrDraftModel or the ultra_v3 plugin — it CANNOT serve Bolt
|
|
|
+# with the card's flags (it aborts at SpeculativeConfig validation and on the
|
|
|
+# missing parser). Do not "fix" that by disabling spec-decode/the parser; use
|
|
|
+# this image instead.
|
|
|
|
|
|
engine = "vllm"
|
|
|
name = "Nemotron-3.5-Bolt-74B-A9B-24GB (1x Spark, QAD 2-bit, LiLiCorr)"
|
|
|
-docker_image = "eugr/spark-vllm-b12x@sha256:03a956544e9f9b4b7ba91690469fbe7848bdbef29a7d2e0f5788368467bb3595"
|
|
|
+docker_image = "nemotron-bolt-b12x:local"
|
|
|
+docker_image_dir = "nemotron-bolt-b12x"
|
|
|
entrypoint = ["vllm", "serve"]
|
|
|
model = "nvidia/NVIDIA-Nemotron-3.5-Bolt-74B-A9B-24GB"
|
|
|
parent_model = "nvidia/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B"
|
|
|
@@ -29,21 +32,40 @@ tensor_parallel_size = 1
|
|
|
args = [
|
|
|
"--served-model-name", "nemotron-3.5-bolt",
|
|
|
"--trust-remote-code",
|
|
|
+ "--load-format", "auto",
|
|
|
"--max-model-len", "262144",
|
|
|
"--max-num-seqs", "1",
|
|
|
+ # GMU: the card relies on vLLM's default 0.92. On THIS Spark a clean node
|
|
|
+ # reports only ~111.5 GiB free (GB10 reserves ~10 GiB of the 121.63 GiB
|
|
|
+ # unified pool), so 0.92 (111.9 GiB) misses by a hair at the startup memory
|
|
|
+ # gate. 0.90 is the minimal fit — the only deviation from the card; every
|
|
|
+ # other flag is verbatim. (Bolt is 24 GB, so KV headroom is huge either
|
|
|
+ # way — this only clears the boot gate, not a capacity limit.)
|
|
|
+ "--gpu-memory-utilization", "0.90",
|
|
|
"--enable-chunked-prefill",
|
|
|
"--kv-cache-dtype", "fp8",
|
|
|
"--linear-backend", "b12x",
|
|
|
"--moe-backend", "b12x",
|
|
|
+ "--attention-backend", "FLASHINFER",
|
|
|
"--mamba-backend", "flashinfer",
|
|
|
"--mamba-ssm-cache-dtype", "bfloat16",
|
|
|
"--mamba-cache-dtype", "bfloat16",
|
|
|
"--mamba-cache-mode", "align",
|
|
|
+ "--seed", "42",
|
|
|
+ "--allowed-local-media-path", "/",
|
|
|
"--limit-mm-per-prompt", '{"video":1,"image":1}',
|
|
|
+ "--video-pruning-rate", "0.5",
|
|
|
+ "--media-io-kwargs", '{"video":{"fps":2,"num_frames":256}}',
|
|
|
"--enable-auto-tool-choice",
|
|
|
"--tool-call-parser", "qwen3_coder",
|
|
|
- "--reasoning-parser-plugin", "ultra_v3_reasoning_parser.py",
|
|
|
+ # ultra_v3 is NOT built into vLLM — it is a plugin file shipped in the
|
|
|
+ # model repo. We bake it into the image at /opt (see the Dockerfile), so
|
|
|
+ # the serve needs no network. The card wgets it and passes the bare name.
|
|
|
+ "--reasoning-parser-plugin", "/opt/ultra_v3_reasoning_parser.py",
|
|
|
"--reasoning-parser", "ultra_v3",
|
|
|
+ # LiLiCorr DFlash speculator (7 tokens) — the card's headline speed lever.
|
|
|
+ # The drafter is a SECOND HF repo, resolved per node from the HF cache via
|
|
|
+ # the repo-ref below ({{lilicorr}} → container-side snapshot path).
|
|
|
"--speculative-config", """
|
|
|
'{"method":"dflash","model":"{{lilicorr}}","num_speculative_tokens":7,"rejection_sample_method":"standard","attention_backend":"FLASHINFER","draft_load_config":{"load_format":"auto"}}'""",
|
|
|
]
|
|
|
@@ -53,5 +75,12 @@ args = [
|
|
|
repo = "nvidia/NVIDIA-Nemotron-3.5-Bolt-74B-A9B-24GB-LiLiCorr"
|
|
|
container = "lilicorr"
|
|
|
|
|
|
+# b12x JIT/kernel cache (per node) — the image sets B12X_CACHE_DIR to this
|
|
|
+# container path; the host dir persists autotuned kernels across serves.
|
|
|
+[[extra_mounts]]
|
|
|
+host = "~/.cache/b12x"
|
|
|
+container = "/root/.cache/b12x"
|
|
|
+
|
|
|
[env]
|
|
|
+VLLM_USE_V2_MODEL_RUNNER = "1"
|
|
|
VLLM_ENGINE_READY_TIMEOUT_S = "3600"
|