Repository navigation
feat(cluster): curated vLLM model deploy for DGX Spark/Station #17
Copy link
Copy link
Closed as not planned
Labels
state:agent-readyApproved for agent implementationApproved for agent implementationstate:in-progressWork is currently in progressWork is currently in progress
Description
Summary
Consolidated tracking issue for local model deployment in Navigator clusters, updated with the DGX Spark and DGX Station runtime plan.
This issue consolidates #41 and #42.
Target environment
- Primary V1 target hardware: NVIDIA DGX Spark and NVIDIA DGX Station (single-node k3s)
- Must degrade safely on non-GPU or unsupported hardware
Runtime direction (updated decision)
- Maintain a curated list of models validated for DGX Spark and DGX Station
- Use vLLM as the default runtime for curated models, with config profiles tuned for this hardware
- For non-curated or unsupported model requests, use one of:
- a small baseline model deployed with Ollama
- a lightweight mock server that echoes the request
- Persist model weights on a PVC so weights survive restart, similar to gateway SQLite persistence
- Research disk offload strategies as a follow-up; this is not in V1 scope
Phase 1 (V1): CLI-first model deploy
Implement navigator cluster model commands, with deploy as the happy path:
- navigator cluster model deploy [--profile auto] [--backend auto]
- navigator cluster model list
- navigator cluster model status
- navigator cluster model remove
Behavior for deploy:
- Detect cluster and node hardware (arch, allocatable memory, GPU resources)
- Select from curated DGX Spark or DGX Station model profiles when hardware matches
- Deploy vLLM with hardware-tuned preset for curated profiles
- If request is not curated or hardware is unsupported, fall back to Ollama small model or mock echo server
- Provision and mount persistent storage for model weights
- Wait for readiness and surface actionable status and errors
- Auto-create an inference route for the model endpoint (route management remains under navigator inference route commands)
Phase 2: bootstrap plus managed system routes
After CLI-first works:
- Integrate optional model deployment into cluster bootstrap flow
- Add route ownership metadata (for example managed_by or source or system flag)
- Protect model-managed routes from unsafe delete and update operations
- Keep protection semantics runtime-agnostic
Auto-detect guardrails
- Inputs: node architecture, node allocatable memory, GPU resource keys such as nvidia.com/gpu, plus runtime probes where available
- Memory safety: require headroom before profile selection; downshift on uncertainty
- Start conservative: single model, single replica, bounded context and concurrency defaults
Acceptance criteria
- Phase 1:
- navigator cluster model deploy performs end-to-end deploy on an existing cluster with no manual Kubernetes steps
- Curated profile selection picks a safe default on DGX Spark and DGX Station, with safe fallback when unsupported
- vLLM preset is applied for curated models and hardware profile
- Fallback path deploys either a small Ollama model or mock echo server
- Model endpoint is reachable and a route is created automatically
- Model weights persist across restart via PVC-backed storage
- Automated tests cover deploy plus route wiring plus persistence checks
- Docs cover curated model behavior, fallback behavior, profile override behavior, and troubleshooting
- Phase 2:
- Bootstrap can optionally deploy a model after cluster readiness
- Model-managed routes are clearly represented and protected
- Automated coverage exists for protected route behavior
Out of scope (initial)
- Multi-model scheduling and autoscaling policies
- Full operator or control-plane adoption in V1
- Disk offload implementation and advanced offload tuning (research follow-up)
Originally by @pimlock on 2026-02-17T16:39:43.763-08:00
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
state:agent-readyApproved for agent implementationApproved for agent implementationstate:in-progressWork is currently in progressWork is currently in progress
Activity
[-]feat(cluster): local model deployment and managed routing (DGX Spark MVP)[/-][+]feat(cluster): curated vLLM model deploy for DGX Spark/Station[/+]pimlock commentedon Mar 6, 2026
Implementation Plan
Issue type:
featComplexity: High
Confidence: Medium - clear Phase 1 slice, but runtime and bootstrap validation still need iteration on real Spark/Station hardware
Summary
Add a new gateway-managed model deployment flow with
nemoclaw model catalog,deploy,list,status,watch, andremove. Phase 1 should feel like sandbox creation: the CLI requests model deployment from the gateway, the gateway detects cluster hardware, validates a chosen config, performs preflight checks, orchestrates the runtime, streams status/log/event updates, and programs managed cluster inference through the existinginference.localflow.Scope
crates/navigator-cli/src/main.rs: add a top-levelmodelcommand group with catalog/deploy/list/status/watch/removecrates/navigator-cli/src/run.rs: add model deploy/list/status/watch/remove handlers and stream renderingcrates/navigator-cli/src/model_deploy.rs: add catalog display, optional interactive selection, request construction, and watch rendering helpersproto/navigator.proto: add model catalog plus model deployment create/get/list/delete/watch RPCsproto/datamodel.proto: addModelDeployment,ModelDeploymentSpec,ModelDeploymentStatus,ModelDeploymentPhase, andSupportedModelConfigcrates/navigator-server/src/grpc.rs: add model deployment CRUD/watch handlerscrates/navigator-server/src/model_deploy.rs: add supported-config filtering, platform selection, preflight checks, manifest rendering, orchestration, generated provider management, and managed cluster inference programmingcrates/navigator-server/src/model_deploy_watch.rs: add watch bus and event-correlation helpers modeled after sandbox watch flowscrates/navigator-models/: shared model catalog, capability checks, deployment state helpers, and preflight primitivesREADME.md: documentnemoclaw modelusage and fallback behaviorarchitecture/cluster-single-node.md: document model deployment alongside gateway lifecycle commandsarchitecture/inference-routing.md: document how model deployment programs managedinference.localvia generated providerscrates/navigator-bootstrap/and cluster startup paths: update bootstrap/runtime wiring so Spark/Station clusters can expose GPUs into k3s workloadsImplementation Steps
StatefulSet,Service, PVC-backed storage, and mock fallback behavior.DownloadingWeightsprogress.SetClusterInference/GetClusterInference.model catalog/deploy/list/status/watch/remove, optional interactive selection, and stream rendering.navigator-bootstrap.Detection Strategy
spark,station, orunknown.Fast Iteration Loop
--gpus all, NVIDIA runtime/toolkit configuration, device-plugin availability, and k3s/containerd GPU exposure as prerequisites for real vLLM deployment.Proposed Phase 1 UX
nemoclaw model catalognemoclaw model deploy <name> --config <id>nemoclaw model listnemoclaw model status <name>nemoclaw model watch <name>nemoclaw model remove <name>Progress Phases
PendingPreflightChecksSelectingProfileSelectedConfigApplyingResourcesDownloadingWeightsStartingRuntimeReadyErrorDeletingTest Plan
deploy/status/watch/removeflows with mocked gateway model APIs; managed inference programming through generated providersinference.localis reachable; verify PVC-backed cache persistence; verify unsupported hardware falls back without breaking managed inference programmingRisks & Open Questions
navigator-bootstrapand related cluster startup code.Documentation Impact
README.md,architecture/cluster-single-node.md, andarchitecture/inference-routing.md.agents/skills/debug-navigator-cluster/SKILL.mdRevision 4 - adopt platform-first selection, add Spark/Station GPU visibility loop, and note bootstrap/runtime changes for k3s GPU exposure
Revision 3 - switch to gateway-managed model deployments, align with simplified inference API, add catalog selection and preflight checks, and rename CLI surface to
nemoclaw model ...Revision 2 - rename planned CLI surface to
nemoclaw inference ...and align it with the existing inference command groupRevision 1 - initial plan
pimlock commentedon Mar 8, 2026
Correction / finalized decision update:
We are going to bake the NVIDIA container toolkit/runtime into the cluster image for now, and keep a single cluster image rather than splitting GPU/non-GPU variants yet.
Rationale:
nvidiaruntime, but actual pod startup still fails because the runtime binary depends on userspace loader/libs that are not reliably present inside the cluster container/dev/nvidia*, and Docker GPU passthrough, but we remove host userspace/runtime drift as a blockerExpected tradeoff:
Next step:
deploy/docker/Dockerfile.clusterso the cluster image includes the NVIDIA container toolkit/runtimeruntimeClassName: nvidianvidia.com/gpupimlock commentedon Mar 8, 2026
Research summary for the DGX Spark / k3s-in-Docker GPU prerequisite for this issue:
nvidia-container-runtimemust be present when k3s starts so thenvidiaRuntimeClassis registered. That only solves container launch; the cluster still needs the device plugin or GPU Operator before the node advertisesnvidia.com/gpu.Recommendation for NemoClaw:
--gpus allequivalent.k3s v1.35.2, use GPU Operatorv25.10.1+if we want the operator-managed stack, and install it withdriver.enabled=falseandtoolkit.enabled=false. That matches the host-driver plus preinstalled-toolkit model.Public signal from current docs and reports:
Implication for this issue:
kubectl get runtimeclassshowsnvidianvidia.com/gpuUseful sources:
pimlock commentedon Mar 8, 2026
Progress log so far, organized as issue -> solution:
Issue 1: platform detection was too guessy
spark,station,unknown) and use host model strings plus cluster facts as validationIssue 2: no clean model deployment surface
nemoclaw model ..., introducedcrates/navigator-models, and built the gateway-managed deployment foundationIssue 3: needed an end-to-end proof before real GPU work
inference.localend-to-end with a sandbox requestIssue 4: Spark cluster container did not get host GPUs
Issue 5: k3s still did not expose a usable NVIDIA runtime
/dev/nvidia*in the cluster container, k3s / containerd did not have a workingnvidiaruntime pathdeploy/docker/Dockerfile.clusterIssue 6: remote Spark deploys were probing the wrong machine for toolkit files
Issue 7:
NEMOCLAW_MODEL_PLATFORMwas muddying the platform storyNEMOCLAW_MODEL_PLATFORMandNEMOCLAW_HOST_MODELNEMOCLAW_MODEL_PLATFORMfrom runtime detection and keptNEMOCLAW_HOST_MODELas the canonical bootstrap inputIssue 8: baked NVIDIA runtime existed but could not execute
Issue 9:
nvidia-container-clistill failed inside the clusterlibm.so.6,librt.so.1,libgcc_s.so.1, andlibstdc++.so.6Issue 10: NVIDIA hook failed because
ldconfigwas missingstat /sbin/ldconfig: no such file or directory/sbin/ldconfigand/usr/sbin/ldconfiginto the cluster imageIssue 11: needed to prove the NVIDIA runtime path actually worked
nvidia-container-cli infoinside the running cluster container; it now sees the Spark GPU correctly (NVIDIA GB10, CUDA 13.0)Issue 12: device plugin still does not register
nvidia.com/gpuk8s-device-pluginnow fails witherror getting device memory: Not SupportedNVIDIA/k8s-device-plugin#1482and appears to be the current real blockerCurrent state:
ldconfigissues, and cluster-level GPU visibility vianvidia-container-clinvidia.com/gpuProposed next steps:
k8s-device-pluginrelease or config can avoid the GB10 memory-query failurenvidia.com/gpuresource registrationpimlock commentedon Mar 8, 2026
Breakthrough update on Spark GPU bring-up:
nvidia-container-cli infoinside the running cluster container successfully sees the Spark GPU (NVIDIA GB10, CUDA 13.0)k8s-device-pluginversion, not the cluster runtime wiringWhat changed:
v0.17.1ofnvidia/k8s-device-plugincrashed on DGX Spark / GB10 with:error getting device memory: Not Supportedv0.17.4fixes this enough for Spark by downgrading that GB10 memory query failure from fatal to warning:Ignoring error getting device memory: Not SupportedWhat we verified:
v0.17.4nvidia.com/gpunvidia.com/gpu=1limits.nvidia.com/gpu: 1and usingruntimeClassName: nvidiaruns successfully on SparkGPU 0: NVIDIA GB10 (UUID: GPU-a8e27b8a-5770-ffbc-8cac-827f3a671fab)So we have now crossed the main infrastructure milestone:
Next step:
vllm/vllm-openai:cu130-nightlyand a small model (likelyQwen/Qwen2.5-0.5B-Instruct) to validate real model serving on Sparkpimlock commentedon Mar 9, 2026
Major validation milestone reached on DGX Spark:
We now have a tiny real vLLM model running successfully on Spark inside k3s.
What was validated:
k8s-device-pluginv0.17.4works on GB10 when combined withruntimeClassName: nvidianvidia.com/gpu=1vllm/vllm-openai:cu130-nightlyQwen/Qwen2.5-0.5B-Instructqwen2.5-0.5b/healthreturns 200Concrete inference validation:
/v1/chat/completionsReply with exactly: spark-okspark-okImportant product note discovered during validation:
nemoclaw model deployshould include preflight/admission checks for:This means we have now validated the intended intermediate milestone:
Next step:
nemoclaw model deployflow so Spark/Station curated model configs create and manage the corresponding vLLM workload instead of the current mock-only pathpimlock commentedon Mar 9, 2026
Latest implementation progress:
nemoclaw model deploynow provisions a real curated vLLM backend for Spark configs instead of falling through toBackendNotImplementedDeploymentServiceinference.localroute pointing at that generated providermodel status/model listnow refresh vLLM deployment state from Kubernetes so a successful backend transitions toReadyDeployment/ServiceresourcesLive validation on Spark:
./scripts/bin/nemoclaw model deploy spark-real --config spark-vllm-qwen25-05bnavigatornemoclaw model status spark-realnow reportsReadyspark-realis activeCurrent limitation:
refactor: rename NemoClaw to OpenShell (NVIDIA#17)
Merge pull request NVIDIA#17 from maxamillion/docs-podman-linux-setup