Run a private remote AI assistant on DGX Spark
Start with a measured coding backend, connect your existing tools privately and keep a recovery path. The model and agent state stay on Spark; your laptop or phone operates them.
Your devices operate. Spark remembers and computes.
The agent does not disappear when a laptop sleeps. Gateway state, model serving and scheduled work remain together on the always-on host.
Default placement: gateway on Spark
OpenClaw's own model is one gateway with many clients: the gateway owns sessions, authentication profiles, channels and state. Hermes is similarly comfortable on a remote Linux host with its dashboard and messaging gateway exposed only through the private access layer. A local laptop gateway is the fallback for someone without an always-on server, not the target architecture here.
How can you control DGX Spark remotely?
The operator device can be a phone, laptop or desktop without moving the gateway, memory, models or jobs off the always-on Linux host.
Windows 11
Use OpenClaw Windows Hub for Command Center, notifications and an optional Windows node. The current bleeding-edge containment route adds Windows Insider and MXC; ordinary remote chat does not move the gateway onto Windows.
macOS
Use the OpenClaw menu bar app in Remote mode. It can own the SSH tunnel, health checks and Web Chat while the gateway remains loopback-bound on Spark.
Linux
Use the Linux companion, CLI, browser Control UI or an SSH tunnel. It is also the closest match to Spark when you need to reproduce commands locally.
Use the device already in your hands.
A phone is enough for chat, status and approvals. Desktop- or mobile-node permissions are optional additions for workflows that genuinely need to touch the operator device.
Windows Hub + MXC preview
Best native OpenClaw diagnostics and Windows-node experience. Use the Insider path below when you want the current session-isolation work; use SSH, Web Chat or messaging when the Windows machine is only an operator.
Menu bar app in Remote mode
Point the signed macOS companion at user@SPARK_IP. Its default remote mode manages a strict-host-key SSH tunnel, health checks and Web Chat without starting a second gateway on the Mac.
Companion, CLI or browser
Use the Linux desktop companion when you want a tray and Canvas, or forward port 18789 and open the Control UI on localhost. The CLI is the simplest path on a minimal workstation.
Official Linux guide →Give agents a sandbox before giving them autonomy.
NVIDIA OpenShell adds runtime boundaries around agent tools. The model can be local or hosted; sandboxing does not establish the quality of its decisions.
See the setup, then follow the current docs.
Use this introduction alongside NVIDIA's documentation. Commands and supported backends can change between releases.
Start narrow and test the boundary.
- Check the host. Follow the installation guide and support matrix for your OS, architecture and sandbox backend, including ARM64 on Spark.
- Choose the agent and model. Use an image containing the agent and its tools; configure a provider for the chosen inference service.
- Limit access. Allow only the project paths, service endpoints and credentials the task needs. Review policy changes before granting more access.
- Verify a harmless task. Inspect the output and logs, test a denied file and network destination, then expand the scope deliberately.
Know what Sync installed before you update Open WebUI.
NVIDIA Sync is the launcher and SSH tunnel, not the container runtime. The Open WebUI container, bundled Ollama and both persistent data volumes live on the Spark.
The container is on Spark.
NVIDIA's remote recipe pulls ghcr.io/open-webui/open-webui:ollama and creates a Docker container named open-webui. Spark port 12000 maps to container port 8080; Sync forwards the same port to localhost:12000 on the operator device.
The data is in two named volumes.
open-webui is mounted at /app/backend/data for accounts, chats, settings and uploads. open-webui-ollama is mounted at /root/.ollama for Ollama model data. Docker manages their host paths; inspect and back them up instead of editing the mountpoints directly.
Sync starts and stops the existing container.
The custom script creates the container only when it is absent. Later launches restart the same container, and closing the launcher stops it. Custom scripts are saved per remote device, so this launcher follows the same Spark across Sync clients; it is not copied automatically to every Spark.
Ask Docker what exists, do not guess a folder.
docker ps -a --filter 'name=^/open-webui$'
docker inspect open-webui --format '{{.Config.Image}}'
docker inspect open-webui --format \
'{{range .Mounts}}{{println .Name "->" .Destination}}{{end}}'
docker volume inspect open-webui open-webui-ollama
# Check the state before using docker exec.
running=$(docker inspect open-webui --format '{{.State.Running}}')
printf 'running=%s\n' "$running"
if [ "$running" = true ]; then
docker exec open-webui ollama --version
else
printf '%s\n' 'Ollama version check skipped: open-webui is stopped.'
fi
The volume inspection output includes Docker's current host mountpoint. Treat that path as implementation state, not a user-managed application folder.
docker exec requires a running container. The inspection block now reports the stopped state without failing. If you need the bundled Ollama version while docker ps -a shows Exited (0), start Open WebUI from NVIDIA Sync first (preferred), or use the one-shot check below. A stopped container does not mean either named volume is missing.
When the Sync launcher is stopped, an optional one-shot check restores the prior stopped state:
was_running=$(docker inspect open-webui --format '{{.State.Running}}')
if [ "$was_running" != true ]; then docker start open-webui >/dev/null; fi
docker exec open-webui ollama --version
if [ "$was_running" != true ]; then docker stop open-webui >/dev/null; fi
Pull, remove the old container and let Sync recreate it.
Pulling the moving :ollama tag changes the local image, but it does not replace an existing container. Before an update, review the Open WebUI release notes and back up at least the application volume; the Ollama model-volume backup is optional but can be very large. Replace YYYY-MM-DD with the actual backup date.
mkdir -p "$PWD/open-webui-backups"
docker run --rm \
-v open-webui:/data:ro \
-v "$PWD/open-webui-backups:/backup" \
alpine tar czf /backup/open-webui-YYYY-MM-DD.tar.gz /data
# Optional: preserve downloaded Ollama models as well.
docker run --rm \
-v open-webui-ollama:/data:ro \
-v "$PWD/open-webui-backups:/backup" \
alpine tar czf /backup/ollama-models-YYYY-MM-DD.tar.gz /data
Stop Open WebUI with the x beside its Sync launcher. In a Sync terminal, pull the image and remove only the stopped container. Do not remove either named volume.
docker pull ghcr.io/open-webui/open-webui:ollama
docker rm open-webui
Launch Open WebUI from Sync again. Its script now creates a new container from the pulled image and reattaches both volumes. Then inspect startup and the bundled runtime:
docker ps --filter 'name=^/open-webui$'
docker logs --tail 100 open-webui
docker exec open-webui ollama --version
Treat its version as part of the image.
The combined image carries its own Ollama build. It can lag the newest standalone release, and current Ollama model metadata can declare a minimum required runtime version. If a new model refuses to pull or load, compare docker exec open-webui ollama --version with the model requirement before diagnosing the GPU. Updating the combined image is the clean route; replacing Ollama inside a running container creates an unrepeatable installation.
Run a separate Ollama service when a model needs a newer runtime.
When a model's minimum required version outpaces the bundled build, decoupling Ollama from Open WebUI is a practical lower-complexity step before a vLLM migration. That is an operational comparison, not a vendor support or cost guarantee. Decoupling is what upgrades Ollama, not the tag switch: a moving :main tag tracks Open WebUI on its own schedule, while the host Ollama service tracks the standalone release independently.
Install standalone Ollama with the official installer. On the Spark, NVIDIA's recipe uses that same installer, and it detects the GB10 Blackwell GPU.
curl -fsSL https://ollama.com/install.sh | sh
Stop the newly installed service before copying. Create the destination for the ollama service account, copy the model store, restore ownership, then verify one real GPU-backed inference before switching Open WebUI. The old named volume remains untouched as the immediate rollback copy.
sudo systemctl stop ollama
sudo install -d -o ollama -g ollama /usr/share/ollama/.ollama
docker run --rm \
-v open-webui-ollama:/data:ro \
-v /usr/share/ollama/.ollama:/store \
alpine cp -a /data/. /store/
sudo chown -R ollama:ollama /usr/share/ollama/.ollama
sudo systemctl start ollama
ollama list
model_tag='replace-with-model-tag'
ollama run "$model_tag" 'Reply with exactly: migration verified'
ollama ps
Then stop the Sync launcher, rename the retained combined container so the open-webui name is free, and start the ordinary image against the host service. Replace YYYY-MM-DD and the secret placeholder before running the commands. Docker host networking keeps Open WebUI on host port 12000 and lets it reach loopback-bound Ollama without exposing port 11434 to the LAN.
docker stop open-webui
docker rename open-webui open-webui-bundled-rollback-YYYY-MM-DD
docker run -d \
--network=host \
-e PORT=12000 \
-e OLLAMA_BASE_URL=http://127.0.0.1:11434 \
-e WEBUI_SECRET_KEY='<replace-with-a-long-random-secret>' \
-v open-webui:/app/backend/data \
--name open-webui \
--restart unless-stopped \
ghcr.io/open-webui/open-webui:main
Decouple the interface after Qwen passes the acceptance task.
Once the loopback vLLM endpoint is proven, run the ordinary Open WebUI image and connect it to the private OpenAI-compatible URL. Keep the open-webui application volume; retire the bundled-Ollama image and its model volume only after exporting anything you still need.
Bind Sunshine to the real X11 desktop, not an example display.
A user service can be active while capture and every encoder probe fail. Fix the graphical-session environment first, select the connected numeric Sunshine display ID, then judge success from encoder discovery.
| Concept | What it provides | What it does not provide |
|---|---|---|
| Physical-monitor mode | A real connected output in a logged-in GNOME X11 desktop. | A desktop before the user logs in. |
| Virtual/headless mode | An Xorg virtual display without an HDMI dummy plug. | A desktop session by itself; GDM autologin or another session creator is still required. |
| User-manager lingering | A systemd user manager before login. | An X server, GNOME desktop or capturable display. |
| Graphical autologin | An unattended X11 desktop after boot. | The same local-login security as an interactive sign-in; enable it deliberately. |
Verify the logged-in X11 session.
Run these commands in a terminal inside the logged-in GNOME desktop. A plain SSH shell may not carry the graphical values.
echo "$XDG_SESSION_TYPE"
echo "$DISPLAY"
echo "$XAUTHORITY"
xrandr --listmonitors
systemctl --user show-environment |
grep -E '^(DISPLAY|XAUTHORITY|XDG_SESSION_TYPE)='
Continue only with the display belonging to the logged-in X11 desktop. GDM can use :0 for its greeter and :1 for the user session. Never force either value in generic instructions.
Publish the live X11 values on every graphical login.
Add this exact line to ~/.xprofile, then run it once from the current graphical terminal:
dbus-update-activation-environment --systemd DISPLAY XAUTHORITY
Remove every hardcoded Environment="DISPLAY=..." shown by systemctl --user cat sunshine.service. In the user-service drop-in, keep the session ordering and replace any old pre-start check with this one:
[Unit]
After=graphical-session.target
Wants=graphical-session.target
StartLimitBurst=5
StartLimitIntervalSec=60
[Service]
ExecStartPre=
ExecStartPre=/bin/sh -c 'i=0; while [ "$$i" -lt 60 ]; do env="$$(systemctl --user show-environment)"; printf "%%s\n" "$$env" | grep -q "^DISPLAY=" && printf "%%s\n" "$$env" | grep -q "^XAUTHORITY=" && exit 0; i=$$((i + 1)); sleep 1; done; echo "DISPLAY/XAUTHORITY not available in systemd user environment" >&2; exit 1'
The format string must be %%s. systemd treats a single % as a specifier, so %s can be expanded before the shell sees it.
Keep only supported GB10 host settings.
Back up ~/.config/sunshine/sunshine.conf. Remove resolutions, nvenc_tuning_info, bitrate, channels, nvenc_multipass, nvenc_rc, fps and codec when the tested release reports them as unrecognized. Set requested resolution, frame rate, bitrate and codec in Moonlight. Preserve site-specific csrf_allowed_origins locally.
adapter_name = /dev/dri/renderD128
capture = x11
encoder = nvenc
min_threads = 2
nvenc_preset = 1
nvenc_spatial_aq = 1
nvenc_twopass = quarter_res
nvenc_vbv_increase = 0
output_name = <numeric ID reported as connected>
qp = 20
Read the output ID from Sunshine's own startup log.
journalctl --user -u sunshine.service -n 200 --no-pager |
grep "Detected display"
Choose the numeric id: <N> on the row that says connected: true. Do not copy an example number, assume HDMI is ID 0, or use a connector string such as USB-C-2; the reproduced Sunshine build converted that string into an invalid display number.
systemctl --user daemon-reload
systemctl --user enable sunshine.service
systemctl --user restart sunshine.service
systemctl --user is-enabled sunshine.service
systemctl --user is-active sunshine.service
journalctl --user -u sunshine.service --since "2 minutes ago" --no-pager |
grep -E \
"Detected display|Configuring selected display|Found .*encoder|System tray|Fatal|Unable to"
Success means the connected ID is selected and the log finds h264_nvenc, hevc_nvenc and av1_nvenc. If cuda::cuda_t doesn't support any format other than AV_PIX_FMT_NV12 appears during probing but all three encoders are found afterward, it is not the startup failure.
Use the same evidence-gated repair.
The standalone Markdown begins with read-only discovery, backs up the existing service and configuration, defines stop conditions for an AI operator, includes the exact systemd escaping, and ends with rollback plus log-based acceptance checks.
Insider is mandatory for the newest containment path.
OpenClaw Windows Hub can run on ordinary Windows builds. This guide targets the newer MXC session-isolation and agent-policy work Microsoft is still shipping through Windows Insider.
Give the preview a recoverable Windows installation.
Use a secondary device or separate system image when possible. Enable BitLocker or device encryption, Secure Boot, Windows Hello and Defender; create a tested recovery drive and backup before enrolling. Run the companion as a standard user, not from a shared or daily administrator account.
Join Windows Insider Experimental on a retail-aligned core.
Experimental is where Microsoft says actively developed features appear first. Stay on the 25H2 or 26H1 line offered for your hardware rather than the separate Future Platforms option. After updating, confirm the actual build with winver; MXC currently documents build 26300.8553 as the minimum for its isolation_session backend.
Verify the containment feature, not merely the OS label.
Install the current feature and platform updates, then check the OpenClaw release notes for MXC support and confirm that the requested backend is available. An Insider badge alone proves nothing. Microsoft currently describes OpenClaw's Windows node and gateway as an MXC integration, but the MXC repository also warns that its early-preview profiles are still overly permissive in known cases.
If MXC or the expected session backend is unavailable, stop. Do not silently fall back to unrestricted execution and call the result hardened.
Use the canonical signed installer and verify it.
Download the x64 or ARM64 asset and checksum file from the project's latest release. Compare the SHA-256 value before opening it, retain SmartScreen and Defender checks, and reject a binary whose publisher or digest does not match.
Get-FileHash .\OpenClawTray-Setup-x64.exe -Algorithm SHA256Connect to the existing Spark gateway.
Choose the remote or existing-gateway route in Windows Hub. Keep the gateway on Spark bound to loopback and let the Hub manage an SSH tunnel, or use a private Tailnet with authentication. The local WSL gateway is a fallback for people without an always-on host, not the default topology here.
Pair, then allow only harmless Windows commands.
Approve the Windows node from the Spark gateway. Begin with notifications and device information/status. Leave command execution, screen capture, camera, location, speech and browser control disabled until a named workflow needs them and both the gateway policy and MXC policy deny everything else.
openclaw devices list
openclaw devices approve <device-id>system.notify · device.info · device.statusOpenClaw requires exact command names. If system.run is later enabled, keep the separate Windows node execution policy default-deny as well.
Test the deny path before startup automation.
Run ten harmless actions, inspect the activity and MXC diagnostics, disconnect the gateway, reject an unexpected pairing request, attempt access to a deliberately denied file and domain, and confirm that every disabled node capability fails. Re-run this after Windows, Hub, MXC, OpenShell or gateway updates.
Add convenience without hiding authority.
OpenClaw extensions execute inside a trust boundary. Install fewer, inspect them and pin versions where the package route supports it.
Hub, menu bar or Linux tray
Use the platform companion for health, chat and notifications without moving the gateway. Enable a desktop node only when the agent must act on that device; operator access and node authority are separate choices.
Compare platforms →Managed SSH tunnel or Tailscale
Prefer the Hub's SSH-tunnel support or Tailscale Serve over firewalling the gateway port open. Keep the gateway bound to loopback and authenticate every client.
OpenClaw remote access →OpenClaw Chrome extension
Use only when the workflow must operate an already signed-in browser tab. Share an explicit OpenClaw tab group, keep the relay on loopback and assume the agent can act with that tab's account permissions.
Extension security model →ClawHub, workspace-local first
Search by the exact capability you need, inspect source and scan state, then install into one workspace before promoting it. A popular package is still executable code, not a permission boundary.
OpenShell + platform controls
Put tool execution behind NVIDIA OpenShell where its backend fits, then layer the host controls: MXC preview on Windows, Bubblewrap or LXC on Linux, and Seatbelt-backed containment on macOS. Test denied files and destinations on the actual host.
One capability ledger
Record the package, version, owner, data it can read, actions it can take, token scopes and removal test. Re-run the ten-action test after every gateway, node or plugin update.
Use the ten-run method →Scrub here. Escalate only the derivative.
When the laptop model cannot finish the hard part, keep the original and the identity map local. Send a stronger model only the smallest reviewed artifact that policy permits.
Bayer taught Phi the exceptions.
Microsoft says Bayer fine-tuned a small Phi model on proprietary crop-protection labels, regulatory rules and expert-authored Q&A. Labels can exceed 100 pages; Bayer reports early complex questions falling from days or weeks to under 30 seconds.
Read the Microsoft customer story →Discovery Bank split one job into five.
Discovery fine-tuned five variants across Azure OpenAI 4o-mini and 4.1-mini for company language, SQL shape and workflow templates. It reports average response time dropping from five or six seconds to 1.5-2 seconds.
Read the Microsoft customer story →Teach the boundary before the model.
A downloaded model can flag candidate names, secrets, clauses and contextual identifiers without giving the source file to a model provider. It can also finish simple extraction or comparison locally. Escalation begins only when a harder model adds enough value to justify a reviewed data crossing.
Run the one-document test →Redaction is not deletion and pseudonymization is not anonymity. The original, findings manifest and re-identification map stay local. Credentials are removed rather than tokenized, and the cloud service never receives the map. If context still identifies the person, client, transaction or project, the file remains red.
One document. One local model. No fallback.
During a connected maintenance window, install LM Studio and download one instruction-tuned local model, its runtime and any local embedding model the attachment workflow requires. Test with a synthetic file, close the app, move the authorized copy outside synced folders, then switch off Wi-Fi and unplug Ethernet before reopening it.
- 01
Load locally. Choose only the downloaded model; start with an 8,192-token context and temperature 0.
- 02
Remove side doors. Turn off tools, MCP, web search, plugins, cloud models and automatic fallback.
- 03
Keep the server closed. Leave it off; if an integration needs it, bind only to
127.0.0.1with authentication. - 04
Return locations, not prose. Ask first for exact span, page, category, reason, confidence and a proposed token.
Work only with the attached local document. Do not use tools, web search, external sources or a remote model. Find DIRECT_IDENTIFIER, CREDENTIAL_OR_SECRET, REGULATED_DATA, COMMERCIAL_CONFIDENTIAL, QUASI_IDENTIFIER and UNCERTAIN spans. Return exact text, page or section, reason, confidence and a stable token such as [PERSON-001]. Do not rewrite yet. Do not infer missing identities.RAG may retrieve only selected passages. Long documents require page-by-page or overlapping-chunk inspection, deterministic secret and identifier checks, a fresh rescan of the derivative and human approval. Any unreadable or skipped content stops cloud routing.
Keep the job local.
Credentials, identity evidence, health or KYC records, privileged advice, protected investigations, safety-critical material, raw client or board files, and anything with unclear authority or processor terms. Use approved private infrastructure or no model.
Minimize, rescan, approve.
Internal contracts, narratives or reports that can lose direct identifiers and distinctive combinations without losing the task. Name the exact service, purpose, region, retention, logging, training and deletion terms before sending.
Still send less.
Published material, genuinely synthetic tests, checked templates or content explicitly approved for this external purpose. Inspect comments, metadata, tracked changes, hidden sheets, notes and embedded objects too.
Exclusive is private. It is not automatically portable.
Microsoft says Azure-hosted direct-model inputs, outputs, embeddings and training data are not made available to model providers or used to improve foundation models without permission, and that a customer's fine-tuned model is exclusive to that customer. Those are useful privacy commitments. They do not by themselves make the resulting weights exportable or the workflow provider-independent.
Read the current Foundry data terms →Keep the learning outside the endpoint.
Store rules, source provenance, prompts, schemas, corrections, permission policy and an untouched evaluation set in exportable formats. Treat a fine-tune as a replaceable build artifact, not the only copy of what the company learned.
Could we replace the model in 30 days using only the artifacts we can export today, then prove the replacement against the same holdout?
Take the boundary with you.
The walkthrough includes the full LM Studio pilot, red/amber/green router, verification gates, laptop-to-enterprise thresholds and portability test. The companion Codex skill prepares the derivative and review package, then stops before transmission.
Use the smallest recipe that answers the question.
NVIDIA publishes PyTorch and NeMo fine-tuning playbooks for Spark. Their example model sizes describe tested recipes, not universal capacity or speed guarantees.
| Question | First method | NVIDIA Spark example | Artifact to keep | Gate |
|---|---|---|---|---|
| Does the data pipeline work? | Small LoRA run | 8B LoRA path | Adapter + run manifest | Loss is sane and sample outputs improve without obvious memorization. |
| Can a larger model learn the behavior? | LoRA or QLoRA | 70B LoRA / 70B QLoRA paths | Adapter, tokenizer config and holdout results | Beats the unchanged base model on the untouched test set. |
| Is full-weight training justified? | Full SFT only after adapter evidence | 3B full SFT path | Checkpoint + reproducible environment | Material gain over LoRA, retention tests pass and operating cost is acceptable. |
Keep the topology; shrink the host.
Run the gateway on the most reliable machine you already own: WSL 2 on Windows, a launchd service on macOS, or a systemd user service on Linux. Keep it loopback-bound, use a small local model or hosted endpoint and operate it from the same companion, browser and messaging surfaces. This proves the workflow; it does not reproduce Spark's unified memory or sustained service role.
Spark is a capacity machine with a measured bandwidth ceiling.
Hands-on third-party tests agree on the shape even when engines, quants and prompts differ: 128 GB unlocks models that ordinary small systems cannot load, while 273 GB/s LPDDR5X limits dense single-stream decode.
LMSYS measured the trade.
Its early-access Spark ran GPT-OSS 20B MXFP4 at 49.7 decode tok/s, but Llama 3.1 70B FP8 at 2.7 decode tok/s. Llama 3.1 8B scaled to 368 aggregate decode tok/s at batch 32. NVIDIA supplied early access, and the authors warn that software results can age.
Dense 70B was capacity-first, not fast.
A separate published comparison reported 4.67 tok/s for Llama 3.3 70B, 38.03 tok/s for Qwen3 Coder and 60.33 tok/s for GPT-OSS 20B on Spark. Treat these as workload-specific results, not universal product scores.
Two nodes need the right parallelism.
StorageReview tested Dell, GIGABYTE and HP pairs over the 200 Gb fabric and found OEM performance within a narrow band. For batched inference at practical concurrency, its pipeline-parallel layout mattered more than small chassis differences.
Three longer practitioner views to put beside the numbers.
These videos add independent system context. Keep their software versions, workloads and methodology attached to any performance observation, and use the normalized table below for direct comparisons.
Put the GB10 platform under a practitioner’s lens.
Level1Techs examines DGX Spark as a system rather than a specification sheet. Treat its observations as independent context and keep software versions and workload conditions attached to any result.
Test when two Sparks can match a larger cluster.
Level1Techs compares a dual-Spark setup with more expensive cluster configurations. Keep model, quantization, parallelism, concurrency and software versions attached to the result; it does not show that two Sparks replace every larger system.
Frame Spark as a development rig, not only an inference box.
This longer independent discussion focuses on what the machine is and how its development role differs from a simple inference appliance. Pair the framing with the measured limits below before buying.
Engine, precision, batch and model architecture explain the spread.
“Tokens per second” without those fields is not a benchmark. Prefill and decode are separate, and aggregate batch throughput is not the speed each interactive user sees.
| Source | Model and format | Workload | Measured Spark result | What it supports |
|---|---|---|---|---|
| LMSYS · Oct 2025 | GPT-OSS 20B · MXFP4 · Ollama | Single-stream decode | 49.7 tok/s | A small sparse model can be comfortably interactive. |
| LMSYS · Oct 2025 | Llama 3.1 70B · FP8 · SGLang | Batch 1 decode | 2.7 tok/s | Loading a large dense model is not the same as serving it quickly. |
| LMSYS · Oct 2025 | Llama 3.1 8B · FP8 · SGLang | Batch 32 aggregate decode | 368 tok/s | Batching can use compute that one bandwidth-bound stream leaves idle. |
| Third-party comparison · Oct 2025 | Llama 3.3 70B | Single prompt | 4.67 tok/s | A second setup reproduces the slow dense-70B shape, not the exact LMSYS number. |
| Community recipe · Jul 2026 | GLM-4.7 355B · NVFP4 · custom vLLM · TP=2 | Two Sparks · 65,536 max sequence length · single-stream decode | About 17.5 tok/s | Two 128 GB nodes can serve the full checkpoint, but only through a pinned patched stack. |
| Level1 practitioner · Aug 2026 | DeepSeek-V4-Flash-0731 304B · custom vLLM · NVFP4 KV · TP=2 | Warm decode · stream:false | 67.5 mean tok/s · 219-227 aggregate at c6 | Speculative-decode acceptance and concurrency make prompt shape part of the result. |
| Level1 practitioner · Aug 2026 | DeepSeek-V4-Flash-0731 304B · same service | 40 min · c4 mixed agent traffic · 532 requests | 87.2 aggregate · 21.8 per stream · 0 request errors | The pinned service survived this bounded soak; it does not establish long-term production reliability. |
| NVIDIA SANA · Aug 2026 | MiniMax H3 · pruned FP8 · Sol Engine | 5 s video · 480p · 124 frames · 50 steps | 181.3 s optimized · 3.92× | A specialized FP8 runtime makes H3 fit and materially faster; generation remains far from real time. |
Test output correctness alongside speed.
Use these bounded experiments when comparing another model or a media workload. They are separate from the recommended Qwen3-Coder-Next coding baseline.
Coding speed versus working outputDetails + sources
Individual experiment · 12 September 2026
Two fast single-request runs produced complete HTML; neither solution worked.
A fresh Pi 0.85.1 experiment sent the same hardware-store plank-helper prompt to two resident models on one DGX Spark, sequentially, with one active request and low reasoning. Qwen 3.8 Flash Next NVFP4 with vLLM and MTP decoded at 34.538774 tok/s. Pi observed 34.411772 generated tok/s end to end: 10,198 generated tokens, including 4,434 reported reasoning tokens, in 296.352075 seconds from 459 input tokens. The response contained a complete HTML document, but a strict-mode runtime error stopped the cut list and diagram.
Muse Glimmer 30B NVFP4 with vLLM and DFlash decoded at 26.689318 tok/s. Pi observed 26.536490 generated tok/s end to end: 3,574 generated tokens in 134.682468 seconds from 441 input tokens. Muse emitted reasoning text, but its counter incorrectly reported zero reasoning tokens, so no reasoning-token count is claimed. Its response contained a complete HTML document, but an extra parenthesis caused a syntax error and disabled the calculator.
Both requests used a 500-second response limit, temperature 0.7, top_p 0.95, top_k 20, presence_penalty 0.25, repetition_penalty 1.1 and seed 42. min_p was omitted because the installed speculative-decoding paths rejected a nonzero value. The server metrics recorded uncached prefill of 459 tokens in 0.74378188 seconds for Qwen and 441 tokens in 0.509927573 seconds for Muse. The simulator derives about 617.116405 and 864.828700 prefill tok/s from those counters. These are individual experimental measurements, not concurrency results, recommended settings or successful coding solutions. The settings were discontinued after the experiment. One stochastic sample per configuration cannot establish a performance or quality effect.
Muse Glimmer with DFlashDetails + sources
Spark owner tests · checked 15 August 2026
Owner tests report decode in the 20s and 30s on one Spark.
Meta’s Apache-2.0 Muse Glimmer 30B is a dense local-agent model with tool use, coding and optional image input. Its official GGUF release provides 16.76 GB and 19.65 GB language-model builds, plus a separate 1.40 GB perception encoder and optional 1.63 GB DFlash drafter. That leaves ample room inside a 128 GB Spark-class system for runtime and a useful context budget, although the advertised 131,072+ model limit is not a promise that the maximum context will be fast or memory-efficient.
Early owner runs provide a useful speed range, not a controlled benchmark. On one DGX Spark, a llama.cpp run reported about 10.5 tok/s conventional decode and 36-38 tok/s with the official DFlash drafter at 15 speculative tokens; a separate vLLM run rose from 5-8 tok/s to about 23 tok/s at the same setting. Workload, draft acceptance, quant, context depth and engine build can move those numbers.
The llama.cpp test also reported about 700 tok/s prefill at short context, about 390 tok/s deep into an 832K-token prompt, and 3/3 needle retrieval at 97K, 188K, 415K and 832K after an 8× YaRN and metadata override. Treat that as an extended-context experiment rather than a new guaranteed model limit. Its two-Spark RPC layer split slowed decode to 25-28 tok/s, so a model this size is better run as one instance per Spark unless a measured workload proves otherwise. Pin the exact engine revision and rerun your own tool-call, recovery, context and latency harness.
MiniMax H3 video generationDetails + sources
Vendor video benchmark · checked 15 August 2026
The vendor reports 3.92× faster generation: about three minutes for five seconds.
NVIDIA’s SANA team ran the 33B dense MiniMax H3 audio-video generator on one DGX Spark at 832×480, 24 fps, 124 frames and 50 denoising steps. Sol Engine reduced end-to-end wall time from 710.6 to 181.3 seconds, a reported 3.92× speedup. The full recipe combines kernel work with approximate Sol-Attn sparse attention and cross-step caching, so the accompanying near-lossless quality assessment is part of the vendor experiment, not proof that every prompt is unchanged. NVIDIA’s separate GeForce RTX 5090 result uses 1344×768 and must not be treated as an RTX Spark benchmark or compared by raw time.
The ordinary BF16 FL2VA package is about 134.2 GiB before activations, so NVIDIA’s GB10 runtime uses a pruned FP8 DiT, FP8 Qwen3-VL conditioner and the released VAEs, with one resident model process. MiniMax’s downloadable local system produces 768p H3-Base output; the recommended Context-IR preprocessing and Regenerate-2K stage remain hosted. There is also a procurement-level license gate: the community license excludes the EU, UK, United States and South Korea, with a separate application route for those territories.
Prove one Spark before adding nodes.
More memory can make a checkpoint fit. It does not guarantee faster interactive work. Treat custom kernels, fabric setup, model licences and repeated-context latency as acceptance gates.
Scale from one Spark to four.Details + sources
Practitioner handbook · checked 30 September 2026
EXO Labs' DGX Spark Handbook, written by 0xSero, maps current community recipes from one Spark to four. Its practical sequence is useful: establish remote access with NVIDIA Sync or SSH, confirm a local model works, then move to a pinned vLLM or SGLang recipe and connect your existing agent or Open WebUI to its OpenAI-compatible endpoint.
| Stage | Handbook examples | Decision gate |
|---|---|---|
| One Spark | Qwen3.6-35B or Qwen3.8-27B with a compatible speculative helper | Validate tool calls, recovery, context and response time on your own tasks before adding hardware. |
| Two Sparks | GLM-5.3-Flash or a compressed DeepSeek-V4.1-Flash recipe | Use the direct fabric and a recipe for the exact checkpoint and quantization. Budget time for cluster setup. |
| Three or four Sparks | Larger checkpoints, less compression or more concurrent work | Confirm the recipe supports the node count. NVIDIA's switched four-node route and community switchless rings use different software. |
Evidence boundary: the handbook reports practitioner runs, including workload-dependent speculative decoding. Coding, structured output and prose can have different draft acceptance. Compare time to first token, sustained per-user decode, aggregate throughput, output correctness and whole-system power at the same context and concurrency. A fast local stream does not establish cloud-model quality parity or a purchase payback.
Four-node rings are a community option. SparkRing documents GB10 pairs and four-node rings using custom RDMA collectives and patched NCCL. It labels the stack alpha and asks operators to pin an immutable commit. Check each profile's model and draft licences; its public BF16 DFlash2 checkpoint is restricted to research and evaluation under CC BY-NC-ND 4.0.
Move the drafter to an external RTX GPU.Details + sources
Community implementation · checked 30 September 2026
remote-dspark moves the DSpark speculative draft model from a GB10 cluster to a separate networked GPU. The maintainer reports about 2.8 GiB freed per node for GLM-5.3 Int4-Int8Mix on four GB10 systems with an RTX 3090 drafter. That creates KV-cache headroom; it is not a measured speedup or a general memory guarantee.
The project supplies opt-in mods for a vLLM 0.29-based stack, a separate x86_64/sm86 draft-server image, and TCP/ZMQ or RDMA transports. The documented smaller-GPU option uses FP8 shared embedding/output-head tensors and a modest draft cache to fit in 10-12 GB. RDMA requires verbs devices on both ends; transport support does not establish GPUDirect RDMA support for GB10 CUDA allocations.
Match the target's shared tensors, draft checkpoint, speculative-token count and context budget. Start the draft service before the cluster. Remote vision-encoder offload is suggested but not shipped.
Keep the draft service on a trusted, restricted network. Pin the code and image, then compare against local drafting at identical prompts, sampling and concurrency. Record memory, latency, acceptance, failures and the extra GPU's power.
GLM and DeepSeek on two SparksDetails + sources
Community recipes · checked 23 August 2026
Full-model recipes depend on pinned custom stacks.
A July practitioner recipe serves the full GLM-4.7 355B Salyut1 NVFP4 checkpoint, about 188 GB across 41 shards, on two DGX Sparks over the built-in ConnectX-7 fabric. The author reports about 17.5 tok/s with vLLM TP=2, CUDA graphs enabled and a configured 65,536-token ceiling. The setup passed the author's coherent-completion and tool-call checks plus an exact needle-recall check around 21K tokens; that is not a full-64K quality validation. It is not a stock install: the recipe uses a development vLLM image, an open loader-fix pull request, a no-Ray launch path, explicit GB10 NCCL handling, capped batch settings and 0.90 memory utilization. The author also reports about 9.5 minutes to load the checkpoint.
An August Level1Techs report measures the official DeepSeek-V4-Flash-0731 304B checkpoint on two Sparks with TP=2 over dual 200 Gb/s RoCE. Here, NVFP4 describes the KV cache rather than the model weights. On a custom vLLM fork at the model's calibrated 1,048,576-token ceiling, with six sequence slots, five speculative tokens, warm kernels and non-streamed accounting, the author measured 84.1 tok/s peak, 67.5 mean decode, 219.2-226.9 aggregate tok/s at concurrency six and about 2,690 prefill tok/s at 100K. A separate 40-minute mixed-temperature, mixed-budget soak at concurrency four produced 87.2 aggregate and 21.8 per stream across 532 requests without a request error.
Do not turn the RTX comparison into a quality ranking. The forum's temperature-zero diagnostic found stack-specific counting and arithmetic differences, but its expanded artifacts were not publicly downloadable when checked. DeepSeek recommends temperature 1.0 and top-p 0.95 for agentic local use. The public recipe also changes quickly and contains results for both the official 0731 checkpoint and an earlier preview. Keep the checkpoint, commit, container, patches, prompt, sampling, warm-up, stream mode and concurrency attached to every number.
NVFP4 capacity and kernel supportDetails + sources
Native NVFP4 hardware · speculative capacity
Blackwell FP4 hardware is present; the serving kernel remains a gate.
NVFP4 is promising here because it can shrink weights and reduce memory traffic while preserving more quality than a crude four-bit conversion. For planning, reserving 20-25% of Spark's 128 GB and assuming a mixed checkpoint at roughly 5.0-5.2 bits per parameter gives an estimated 150-165B parameter single-node fit. That is below NVIDIA's “up to 200B” capacity ceiling because this estimate leaves useful room for the runtime and cache.
Two linked Sparks provide a speculative 295-330B parameter planning band with the same reserve. NVIDIA has demonstrated Qwen-235B in NVFP4 on two systems and markets an up-to-405B model ceiling, but neither statement guarantees your model, context, kernel or interactive speed.
Separate the Linux host from the Windows product promise.
Remote control from a Windows or Mac client does not change the Spark's operating system. Check the supported host platform, current regional offer and production entitlement before ordering.
Hardware + price warning · checked 24 July 2026Windows support is a buying constraint.
Do not buy on the assumption that support will arrive later.
DGX Spark and the pre-release RTX Spark family publish strikingly similar headline numbers, up to one petaflop and up to 128 GB unified memory, but NVIDIA currently lists them as different product categories: DGX Spark is a Linux companion system, while RTX Spark is a Windows primary system. Public documentation does not establish that their drivers, firmware or boards are interchangeable, and NVIDIA has announced no Windows driver, Windows image or upgrade path for DGX Spark.
Buy DGX Spark only if DGX OS works for the machine's useful life. Future Windows support is possible in theory, but today it is speculation. There is also no public evidence for claims about NVIDIA's commercial motive; the support gap itself is the decision-relevant fact.
NVIDIA's own DGX Spark listing displayed this price and was out of stock when checked. Use it as a reference for the NVIDIA-branded system, not a ceiling for partner products. OEMs choose their own configurations and selling prices.
Check the current NVIDIA Marketplace price →NVIDIA AI Enterprise check · GB10 / DGX SparkCheck the production entitlement.
Preinstallation, NIM access and a Spark badge do not establish it.
A 90-day NVIDIA AI Enterprise - DGX Spark evaluation exists only when it is purchased, requested or explicitly issued on the NVIDIA Entitlement Certificate (EC); not every OEM offer includes it. Record the EC/order line, GPU metric, start and end date, support route and renewal before deployment. It is an evaluation, not a public free-forever entitlement to the complete supported production suite.
Free components remain useful for development: Omniverse and NVIDIA AI Workbench are free, and the standard NVIDIA Developer Program NIM route is for development, research and test up to 16 GPUs with community support. Production self-hosting generally needs NVIDIA AI Enterprise.
RTX Spark is being introduced as a Windows PC family, not as a DGX Spark software update.
These NVIDIA and Microsoft videos show the platform framing, an announced product, example workloads and one model-routing layer. Treat them as vendor demonstrations: they clarify positioning, but they do not prove interchangeability, delivery timing or performance for your workflow.
A Windows PC category for local AI
Use this overview to understand NVIDIA's intended product category. Keep the announced positioning separate from tested application support on a shipping system.
Surface makes the Windows distinction concrete
The Surface RTX Spark Dev Box is a separate announced Windows product. Its existence is not evidence that a DGX Spark can be converted into one.
Judge the workflow, then test the stack
The architectural-design demo shows how NVIDIA imagines agents using the platform. It is a useful workflow reference, not a benchmark or compatibility matrix.
Keep the local agent working while you step away.
The demo shows a Hermes agent monitoring communication channels, prioritizing an urgent software issue and coordinating debugging and quality assurance on RTX Spark. It demonstrates NVIDIA's intended always-on local workflow, not measured autonomy, task success or hardware performance.
Hear the promise, then compare DGX Station.
The keynote gives the broad RTX Spark context. If 128 GB is the constraint rather than the solution, the DGX Station guide maps the 748 GB tier, realistic model fits and the current benchmark gap.
Route by task only after the local baseline works.
NVIDIA's walkthrough shows a router selecting among models in a configured pool. On Spark, add that layer only after one private endpoint passes the task acceptance set. Record which choices stay local: a router can introduce new model, provider, logging, cost and data-boundary decisions.
Rent the remote workload before buying a Spark or larger system.
Before committing four, five or six figures to a Spark or larger deployment, rent the candidate workload and prove the whole operator path. A rental is a test drive, not a guarantee of GPU availability, equivalent hardware, benchmark transfer or price.
Eight GB10 listings. One workload test.
The active products share the compact GB10, 128 GB coherent-memory class, but not necessarily NVIDIA's DGX Spark product name, factory image, storage, regional price or support terms. HP advised directly that ZGX Nano is discontinued, so it remains here as a clearly labelled historical reference.
Veriton GN100
GB10 AI mini workstation.
ASUS Ascent GX10
GB10 desktop AI supercomputer.
Dell Pro Max with GB10
GB10 micro workstation.
GIGABYTE AI TOP ATOM
GB10 AI TOP system.
HP ZGX Nano AI Station
GB10 nano AI station.
Lenovo ThinkStation PGX
GB10 AI development workstation.
MSI EdgeXpert MS-C931
GB10 AI supercomputer.
PNY DGX Spark
Authorized DGX Spark channel route. The current NVIDIA/PNY offer advertises an optional free 90-day NVIDIA AI Enterprise - DGX Spark evaluation after registration and entitlement; it is time-limited, offers community-driven support only, and is not a production-support entitlement.
Hear NVIDIA's platform promise. Keep it separate from measured results.
The keynote explains the platform story, the PNY film shows one product implementation, and the assistant and GraphRAG sessions demonstrate intended workflows. All four are vendor presentations, use the independent review block above for measured model performance.
Introducing DGX Spark at GTC
The keynote segment sets out NVIDIA's original product positioning and target users. Compare those claims with current documentation and the independent throughput results on this page.
PNY DGX Spark in NVIDIA's product film
The short film shows the PNY implementation and intended compact appliance experience. It does not establish model quality, sustained tokens per second, thermals or equivalence with other OEM systems.
Turn the appliance into an assistant workflow.
This concise NVIDIA walkthrough shows a Hugging Face assistant build on DGX Spark. Use it for workflow ideas and product setup context, not as independent performance evidence.
Use the memory pool for a larger retrieval pipeline.
The NVIDIA Developer session demonstrates text processing for GraphRAG with an LLM of up to 120B parameters. It shows an intended capacity-led workflow, not a standardized throughput benchmark.
Frequently asked questions about DGX Spark
Power, unified memory, networking, remote access and troubleshooting answers checked against current NVIDIA documentation.
What is the expected DGX Spark power draw?
Budget for the included 240W power supply. NVIDIA specifies a 140W TDP for the GB10 SoC and reserves 100W for ConnectX-7, Wi-Fi, storage, USB-C and other system components. Its EU technical disclosure reports 233.2W maximum and 38W idle under the stated test method. The power shown by nvidia-smi is not whole-system power at the wall.
Why does nvidia-smi report “Memory-Usage: Not Supported”?
This is expected. DGX Spark’s integrated GPU shares unified system memory instead of having dedicated framebuffer memory, so nvidia-smi does not provide the usual aggregate VRAM-usage field. Use top, htop, free -h or DGX Dashboard for system-memory monitoring. Open the dashboard locally at http://localhost:11000; remote access needs NVIDIA Sync or an SSH tunnel.
Why does an application run out of memory below the 128 GB capacity?
Unified-memory applications can report less allocatable memory than the system can reclaim, and some software does not yet account correctly for swap or cache. Start with free -h, the process allocations and swap use. Linux normally reclaims clean cache automatically. For a controlled diagnostic only, not routine memory management, sync writes and drop reclaimable cache with:
sudo sh -c 'sync; echo 3 > /proc/sys/vm/drop_caches'
Dropping caches can create significant I/O and CPU work; stop the affected workload first and remeasure before treating cache as the cause.
Why does NVIDIA Sync say “Host already exists” after I deleted a device?
A stale SSH Host alias may remain. Back up the file, remove only the exact stale Host block, then add the device again. Current Sync documentation uses ~/.ssh/config on macOS and Ubuntu and C:\Users\<username>\.ssh\config on Windows. Older Sync builds may also have a managed file at the paths below.
Windows: C:\Users\<username>\AppData\Local\NVIDIA Corporation\Sync\config\ssh_config
macOS: /Users/<username>/Library/Application Support/NVIDIA/Sync/config/ssh_config
Linux: /home/<username>/.config/NVIDIA/Sync/config/ssh_config
Review NVIDIA Sync SSH aliases →
Is GPUDirect RDMA supported on DGX Spark?
No. DGX Spark’s unified-memory architecture does not support GPUDirect RDMA, nvidia-peermem, dma-buf or GDRCopy for CUDA device allocations. A portable application should query CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_SUPPORTED and CU_DEVICE_ATTRIBUTE_DMA_BUF_SUPPORT, then use a supported fallback. For Linux ibverbs applications, NVIDIA suggests cudaHostAlloc memory registered with ibv_reg_mr.
How do I set up DGX Spark after moving it to another location?
Connect Ethernet first. Try the Spark’s spark-hostname.local address; if mDNS is unavailable, find its wired IP in the router. Connect with NVIDIA Sync or SSH, identify the Wi-Fi device, join the new network without putting the password in shell history, and note the Wi-Fi address before unplugging Ethernet:
nmcli device status
sudo nmcli --ask device wifi connect "<wifi-name>"
ip -4 address show
Why are CPU-bound NVCC processes slow?
CUDA sources built through CMake can miss OpenMP compiler support. Pass -Xcompiler=-fopenmp for CUDA compilation, rebuild and remeasure the CPU-bound section.
# CMakeLists.txt
target_compile_options(mytarget PRIVATE
$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-fopenmp>
)
# Command line
nvcc -Xcompiler=-fopenmp ...
NVIDIA DGX Spark compiling guide →
Can I reset a lost BIOS or UEFI Administrator password?
There is no documented user reset for a lost firmware Administrator password. Contact NVIDIA hardware support for a Founders Edition system or the device manufacturer for an OEM model. Do not assume that an OS recovery or “Restore Defaults” in UEFI clears the security credential.
Why is the ConnectX-7 module missing from lspci?
The January 2026 DGX OS release added ConnectX-7 hot-plug power management. With it enabled, the adapter can stay powered down until a QSFP cable is inserted, saving up to 18W. Connecting the cable activates the adapter and increases system power and temperature. To keep ConnectX-7 active without hot-plug power saving, remove the marker; recreate it to re-enable the feature:
sudo rm -f /etc/nvidia/cx7-hotplug-enabled
sudo touch /etc/nvidia/cx7-hotplug-enabled
NVIDIA January 2026 release note →
How many DGX Spark systems can I cluster?
Current NVIDIA Sync supports two or three systems with direct 200 Gb/s QSFP cabling, or up to four systems through a switch. Use an approved cable and the NVIDIA Sync Cluster Assistant or the matching two-node, three-node or switched NVIDIA playbook; four devices are not supported as a direct-cabled topology in NVIDIA Sync. Community SparkRing supports four-node rings through a separate alpha stack with custom collectives and patched NCCL.
Build a service you can recover.
Use NVIDIA's Spark-specific playbooks. Generic CUDA, x86 container or desktop instructions can fail on ARM64/Blackwell even when the project itself supports NVIDIA GPUs.
Open the setup and recovery guideEight steps + model deep dives
Baseline DGX OS.
Record the installed DGX OS release, driver, CUDA stack and firmware. Apply NVIDIA-recommended updates through DGX Dashboard, then verify health before adding services. Do not replace the OS with generic Ubuntu or Windows.
Set up private remote access.
After updating DGX OS, create a named non-root account, install an SSH key and choose the least-powerful route that covers the operator's work. Keep it on a trusted LAN or Tailnet, retain host firewall rules and never publish SSH or remote-desktop ports directly to the internet.
Community installer warning · checked 22 August 2026: treat the linked repository as a bootstrap, not a reliable one-command finish. Its current checked revision still forces DISPLAY=:0, chooses a fixed Sunshine output and writes host options rejected by Sunshine 2026.516.143833. If you use ./install.sh, reboot and run ./after-install.sh, follow the repair section before pairing Moonlight, or give the standalone Markdown runbook to Codex or another terminal-capable AI agent. For access beyond the LAN, use a private Tailnet and confirm a direct peer-to-peer path.
Start with Qwen3-Coder-Next NVFP4.
Use the Qwen3-Coder-Next NVFP4 coding baseline as the starting Spark vLLM path, then compare another model only after the endpoint, tool loop and edit result pass a fixed acceptance set. Pin the container digest and quantized checkpoint revision, set explicit context, cache and concurrency budgets, and keep the endpoint on loopback.
Qwen3-Coder-Next NVFP4: setup and configurationDeep dive
Start with Qwen3-Coder-Next NVFP4.
Serve it through vLLM, enable prefix caching and leave speculative decoding off for large, repeated coding contexts. The supplied field runs reached about 58 tok/s on short prompts and 44.1 tok/s during a live session averaging roughly 66K input tokens. Choose it as a practical coding baseline, then verify working edits on your own tasks.
Connect your coding tools to one backend.
Connect NVIDIA Sync, Hermes, VS Code or Pi to the same private Qwen3-Coder-Next NVFP4 backend. Confirm the served model ID instead of relying on a launcher label.
- Reconnect NVIDIA Sync and reload your coding client after changing the configured backend.
- Launch the vLLM entry and wait for startup to finish. Confirm health and the served model ID before sending agent work.
- Point each client at the private OpenAI-compatible endpoint. Use the ID returned by
/v1/models; a launcher's display label need not be the API model ID. - Run a bounded read, edit and verification task. Retain the previous weights and configurations for rollback until the tool loop and resulting diff pass.
Keep the serving choices explicit.
| Choice | Starting point |
|---|---|
| Model + engine | Qwen3-Coder-Next NVFP4 + a GB10-compatible vLLM build. Pin the checkpoint revision and container digest. |
| Context ceiling | --max-model-len 262144. This is a per-request ceiling; simultaneous requests share the available cache and memory. |
| Repeated coding context | --enable-prefix-caching. Measure reuse with the actual agent prompts. |
| Tool calls | --enable-auto-tool-choice and --tool-call-parser qwen3_coder. Verify parsing and execution in each client. |
| Speculation | Disabled. Compare a draft only at the context lengths and repetition pattern you actually use. |
| Access + memory | Keep the endpoint on loopback or a restricted private container network. Budget weights, cache, concurrency and OS headroom together. |
Qwen's base model card specifies 80B total parameters, about 3B active per token and a native 262,144-token context. The linked NVFP4 checkpoint is a community quantization, not an official Qwen release. Tool calling, prefix caching and the 262K serving configuration were reported as validated in the supplied setup; that does not establish answer quality across the full context window.
Check readiness before connecting an agent.Endpoint check
For a service configured on Spark's loopback port 8000, inspect readiness and model discovery below. Replace the port if your launch configuration differs. A successful health response is only a readiness check; the acceptance task must also exercise tool calls and a real edit.
curl -fsS http://127.0.0.1:8000/health
curl -fsS http://127.0.0.1:8000/v1/models
Coding performance, cache and speculationDeep dive
Plan around your context, not the fastest headline.
The short-prompt result is close to the quantization author's published range. Large coding contexts ran more slowly, with strong prefix reuse and no observed queue buildup. Four-request aggregate throughput measures shared capacity; it is not the speed of one coding session.
| Evidence | Input context | Decode speed | Reading |
|---|---|---|---|
| Quantization author's benchmark | 512-4,096 tokens | 60.6-62.1 tok/s | Three runs per configuration; 128 or 256 output tokens. |
| Supplied short-prompt run | Short prompt; exact length not supplied | 58.4 tok/s | Roughly 4-6% below the published short-prompt range. |
| Supplied long-context run | About 54,000 tokens | About 49 tok/s | A closer context-length reference for coding agents. |
| Supplied live VS Code interval | 65,783 tokens on average | 44.1 tok/s | Three completed requests in two minutes; prompts and output lengths differ from the earlier run. |
| Supplied concurrency run | Four requests; context lengths not supplied | 145 tok/s aggregate | Total backend throughput across four requests, rather than a per-user figure. |
Qwen3-Coder-Next supports only non-thinking mode, so both simulator profiles start with zero reasoning-work tokens. The live profile uses the reported 2.06-second server time to first token with a resident model and a synthetic answer length. The short-prompt profile has illustrative prompt timing. Check Qwen's non-thinking model specification →
Evidence boundary: the field figures were supplied by the operator and were not rerun for this guide. The notes do not include complete prompts, an immutable runtime/checkpoint manifest or repeat-run variability. These timings establish a useful local baseline, not a controlled quality comparison or a guarantee for another installation.
Live coding sample: latency, cache and system load.Two minutes
The supplied sample covers a two-minute coding session with one request at a time. All figures come from the Spark's shared backend and exclude client network and rendering delay. The server cannot attribute a request to a particular client window.
| Metric | Result | Scope |
|---|---|---|
| Generation during decoding | 44.1 tok/s | Active decoding |
| Overall throughput | 41.5 tok/s | Includes pauses and prefill |
| Tokens generated | 4,974 | Whole interval |
| Requests completed | 3 | One active at a time |
| Time to first token | 2.06 s | Average |
| Complete response time | 58.2 s | Average |
| Input context | 65,783 tokens | Average |
| Prefix cache reuse | 95.2% | Reported reused share |
| Maximum queued requests | 0 | No queue buildup observed |
| Cache preemptions | None observed | Whole interval |
| GPU utilization | 95.8% | Average |
| GPU temperature | 75°C | Peak |
| Available memory | 13.15 GiB | Minimum observed |
The high cache reuse is consistent with an agent repeatedly sending a large shared prefix. Live decode was about 10% below the earlier 54K-context result, but the requests were not matched. Three completions cannot establish a stable speed, a client-network bottleneck or the headroom for more concurrent full-context sessions.
Why speculation stays off for this coding workload.DFlash comparison
A draft proposes tokens that the target model checks together. Accepted drafts can save time; rejected drafts add work. Correct speculative sampling preserves the target distribution within numerical limits, so speculation should not inherently lower answer quality. The operational question is whether it improves this workload.
| Workload | Without speculation | With DFlash |
|---|---|---|
| Short-prompt decoding | 58.4 tok/s | 83.0 tok/s |
| About 54K-context decoding | About 49 tok/s | About 40.7 tok/s |
| Repeated-context first-token delay | 0.677 s | 1.047 s |
- Long-context decoding slowed by about 17%. The live coding sample averaged roughly 66K input tokens, so the short-prompt gain is a poor basis for its default.
- Prefix reuse was inconsistent in the test. The first repeated large prompt had zero cache hits; a later repetition reused the cache.
- The tested runtime ignored
min_pandlogit_biasunder speculation. The active configuration does not use either control. This is a finding about that build, not all vLLM versions. - A draft adds memory and verification work. The payoff depends on acceptance, prompt length and repetition.
A separate published EAGLE3 recipe reports 72.0 tok/s at a 2,048-token prompt but 37.9 tok/s at 32K with that configuration. It uses a different runtime and speculative method. EAGLE3 needs its own comparison on large, repeated coding contexts; the DFlash result does not establish that every speculative method will be slower.
Add retrieval only when the workflow needs it.
Start with Qdrant only if filters, hybrid search, persistence or multiple collections justify a service. Store the original document and page metadata with every chunk; back up source documents and collection configuration, then test a restore.
Use the private-document recipe →Place OpenClaw or Hermes on Spark.
Install one primary agent through its supported Linux path, point it at vLLM's loopback OpenAI-compatible endpoint and keep its sessions, memory and channels on persistent storage. OpenClaw uses its gateway service; Hermes can expose its dashboard and messaging gateway. Run both only when you have intentionally separated their state, ports and permissions.
Lock down tools and data services.
Bind the gateway, vLLM and Qdrant to loopback unless a private container network requires otherwise. Run high-authority agent tools through an OpenShell sandbox where supported, then test its filesystem and outbound-network denies. Expose only the application endpoint the chosen operator route needs.
Separate serving from training.
Do not let a training job silently evict or starve the always-on model. Use explicit service and training modes, drain requests, stop vLLM when the recipe needs the memory, checkpoint to persistent storage and restore serving from a known configuration.
Prove recovery.
Back up only what cannot be recreated: gateway configuration and keys, source data, dataset manifests, adapters, evaluation sets and service definitions. Rebuild one clean service from the manifest before calling the system production-ready.
Keep the agent on the server. Grant every client capability separately.