Repository

Nemotron-Labs-3-Puzzle-75B-DGX-Spark

Serve NVIDIA Nemotron-Labs-3-Puzzle-75B-A9B-NVFP4 on a single DGX Spark (GB10) node with vLLM 0.24 in Docker

Model
Model
Quantization
Quantization
Context
Context
Decoding
Decoding

Specs

  • ModelModel
  • QuantizationQuantization
  • ContextContext
  • DecodingDecoding
  • APIAPI
  • RequirementNotes
  • Docker with GPU supportdocker run --gpus all must work
  • NVIDIA driver + container toolkitStandard DGX Spark stack
  • Hugging Face cacheModel must be downloaded before first launch ( HF_HUB_OFFLINE=1 is set)
  • VariableDefault
  • KVDfp8
  • SPECmtp
  • SPEC_TOKENS3
  • SEQS7
  • MAXLEN262144
  • MOE_BACKENDFLASHINFER_CUTLASS
  • EAGER1
  • STARTUP_TIMEOUT3600
  • SettingValue
  • Container namenemo-75b-vllm
  • Docker imagevllm/vllm-openai:v0.24.0
  • Port8888
  • Tensor parallel1
  • GPU memory util0.85
  • Served model nameNemotron-75b-Puzzle
  • GoalExample
  • Shorter context, more headroomMAXLEN=131072 SEQS=12 ./start.sh
  • Lower concurrency if OOMSEQS=1 EAGER=1 ./start.sh
  • Disable MTPSPEC= ./start.sh
  • Try CUDA graphsEAGER=0 ./start.sh (may be less stable)
  • SettingValue
  • Model idNemotron-75b-Puzzle
  • Base URLhttp://localhost:8888/v1
  • Thinkingon ( reasoning: true , nemotron_v3 parser)
  • Context window262144
  • Max output tokens32768
  • Temperature0.6
  • Top-p0.95
  • Top-k20
  • Min-p0

README

Nemotron-Labs-3-Puzzle-75B on DGX Spark

Serve NVIDIA Nemotron-Labs-3-Puzzle-75B-A9B-NVFP4 on a single NVIDIA DGX Spark (GB10) node using vLLM 0.24 inside Docker. The launcher applies the aarch64 / SM12.1 workarounds needed for stable NVFP4 MoE + Mamba inference on Blackwell Spark hardware.

Follow Mia on X

Buy Me a Coffee at ko-fi.com

Model 75.3B total / 9.3B active hybrid MoE (Mamba + MoE + Attention)
Quantization NVFP4 weights, FP8 KV cache (default)
Context 256k tokens (max_position_embeddings=262144)
Decoding MTP speculative decoding (k=3 default)
API OpenAI-compatible on port 8888

Why this repo

This is a minimal, Spark-tuned Docker recipe. start.sh handles:

  • Resolving weights from the local Hugging Face cache (offline serving)
  • Materializing symlinked custom model code (.py, .json, .jinja) so trust_remote_code loads correctly
  • aarch64 NCCL and FlashInfer patches inside the container
  • CUDA 13 / sm_121a environment variables for GB10
  • Tool calling (qwen3_coder) and reasoning output (nemotron_v3)

A related layout with native start.sh / stop.sh, vendored ./model weights, and additional tuning options is maintained separately as Nemotron-Labs-3-Puzzle-75B (same Spark tuning lineage).

Requirements

Hardware

  • 1× NVIDIA DGX Spark (GB10) — ~121 GB unified memory
  • ~75 GB free disk — ~50 GB model weights + ~21 GB Docker image + cache headroom

Software

Requirement Notes
Docker with GPU support docker run --gpus all must work
NVIDIA driver + container toolkit Standard DGX Spark stack
Hugging Face cache Model must be downloaded before first launch (HF_HUB_OFFLINE=1 is set)

Verify GPU access:

docker run --rm --gpus all nvidia/cuda:12.0.0-base-ubuntu22.04 nvidia-smi

Quick start

1. Download the model

pip install -U huggingface_hub
hf download nvidia/NVIDIA-Nemotron-Labs-3-Puzzle-75B-A9B-NVFP4

Weights land under ~/.cache/huggingface/hub/models--nvidia--NVIDIA-Nemotron-Labs-3-Puzzle-75B-A9B-NVFP4/.

2. Pull the vLLM image

docker pull vllm/vllm-openai:v0.24.0

3. Clone and launch

git clone https://github.com/MiaAI-Lab/Nemotron-Labs-3-Puzzle-75B-DGX-Spark.git
cd Nemotron-Labs-3-Puzzle-75B-DGX-Spark
chmod +x start.sh
./start.sh

start.sh stops any prior containers, launches vLLM in Docker, then streams container logs until the API responds on /v1/models. When the server is ready, log following stops and you get your shell back.

Warmup can take several minutes on first boot while FlashInfer kernels compile.

4. Stop

docker stop nemo-75b-vllm
docker rm nemo-75b-vllm

Re-running ./start.sh performs the same cleanup automatically.

Configuration

All knobs are environment variables. Override them inline when calling start.sh:

SEQS=4 MAXLEN=131072 MOE_BACKEND=FLASHINFER_CUTLASS ./start.sh
Variable Default Description
KVD fp8 KV cache dtype (--kv-cache-dtype)
SPEC mtp Speculative decoding method; set to empty to disable
SPEC_TOKENS 3 MTP speculative token count
SEQS 7 --max-num-seqs (concurrent sequences)
MAXLEN 262144 --max-model-len (256k context)
MOE_BACKEND FLASHINFER_CUTLASS MoE execution backend
EAGER 1 1 = --enforce-eager (CUDA graphs off; more stable on Spark)
STARTUP_TIMEOUT 3600 Seconds to wait for /v1/models before failing

Fixed in start.sh (edit the script to change):

Setting Value
Container name nemo-75b-vllm
Docker image vllm/vllm-openai:v0.24.0
Port 8888
Tensor parallel 1
GPU memory util 0.85
Served model name Nemotron-75b-Puzzle

Context and concurrency tuning

Goal Example
Shorter context, more headroom MAXLEN=131072 SEQS=12 ./start.sh
Lower concurrency if OOM SEQS=1 EAGER=1 ./start.sh
Disable MTP SPEC= ./start.sh
Try CUDA graphs EAGER=0 ./start.sh (may be less stable)

API examples

Chat completion

curl http://localhost:8888/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Nemotron-75b-Puzzle",
    "messages": [{"role": "user", "content": "Explain hybrid MoE in one paragraph."}],
    "max_tokens": 512
  }'

Python client

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8888/v1", api_key="EMPTY")
response = client.chat.completions.create(
    model="Nemotron-75b-Puzzle",
    messages=[{"role": "user", "content": "Hello!"}],
    max_tokens=256,
)
print(response.choices[0].message.content)

For coding agents, NVIDIA recommends passing extra_body={"chat_template_kwargs": {"force_nonempty_content": True}} on chat requests.

Harness settings (Pi agent, thinking on)

Recommended settings for ~/.pi/agent/models.json, matching the served model name from start.sh (Nemotron-75b-Puzzle).

Add under a provider pointing at this server (for example "vLLM Local" with baseUrl: "http://localhost:8888/v1"):

{
  "id": "Nemotron-75b-Puzzle",
  "name": "Nemotron Labs 3 Puzzle 75B A9B NVFP4",
  "reasoning": true,
  "input": ["text"],
  "contextWindow": 262144,
  "maxTokens": 32768,
  "params": {
    "temperature": 0.6,
    "top_p": 0.95,
    "top_k": 20,
    "min_p": 0,
    "presence_penalty": 0,
    "repetition_penalty": 1
  },
  "compat": {
    "supportsDeveloperRole": false,
    "requiresReasoningContentOnAssistantMessages": false,
    "thinkingFormat": "nemotron_v3"
  }
}

Summary:

Setting Value
Model id Nemotron-75b-Puzzle
Base URL http://localhost:8888/v1
Thinking on (reasoning: true, nemotron_v3 parser)
Context window 262144
Max output tokens 32768
Temperature 0.6
Top-p 0.95
Top-k 20
Min-p 0
Presence penalty 0
Repetition penalty 1

For coding agents over the raw API, also pass extra_body={"chat_template_kwargs": {"force_nonempty_content": true}} so tool-use turns keep non-empty assistant content.

Troubleshooting

Symptom Things to try
no model snapshot found under .../hub/models--nvidia--... Run huggingface-cli download nvidia/NVIDIA-Nemotron-Labs-3-Puzzle-75B-A9B-NVFP4 first
Container exits immediately docker logs nemo-75b-vllm; check driver/GPU visibility and disk space
OOM during warmup or inference SEQS=1 EAGER=1 ./start.sh; reduce MAXLEN
Port already in use Stop the old container: docker rm -f nemo-75b-vllm
API unreachable after launch Wait for warmup; tail docker logs -f nemo-75b-vllm
MoE / FlashInfer errors on GB10 Keep MOE_BACKEND=FLASHINFER_CUTLASS and EAGER=1 (defaults)

What start.sh does

┌─────────────────────────────────────────────────────────────┐
│ 1. Resolve HF cache snapshot for Puzzle-75B NVFP4           │
│ 2. Materialize symlinked model code files in snapshot         │
│ 3. Remove prior containers (nemo-75b-vllm, puzzle_a4q, etc.)  │
│ 4. docker run vllm/vllm-openai:v0.24.0                      │
│    ├─ NCCL lib symlink (aarch64)                              │
│    ├─ FlashInfer all-reduce + cuda_ipc patches              │
│    └─ vllm serve with MoE, Mamba, MTP, tool/reasoning APIs    │
└─────────────────────────────────────────────────────────────┘

Project layout

.
├── start.sh    # Docker launcher for DGX Spark
└── README.md

References

License

Model weights and use are governed by the OpenMDW License Agreement v1.1. See the model README for benchmarks, safety information, and full documentation.

Deployment scripts in this repository are provided as-is for reproducibility on DGX Spark hardware.