Skip to content

fix(inference): stop a managed vLLM install the host GPU cannot serve - #8314

Merged
jyaunches merged 6 commits into
mainfrom
fix/vllm-compute-capability-preflight
Aug 5, 2026
Merged

fix(inference): stop a managed vLLM install the host GPU cannot serve#8314
jyaunches merged 6 commits into
mainfrom
fix/vllm-compute-capability-preflight

Conversation

@laitingsheng

@laitingsheng laitingsheng commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Summary

A quantized checkpoint whose GPU requirement the host cannot meet used to download in full and then crash-loop the nemoclaw-vllm container until the 30-minute load timeout expired, with no actionable message from onboarding. The managed install path now compares each model's minimum GPU compute capability against the host before the image pull and the model download, and the readiness poller stops a container that keeps restarting instead of waiting out the timeout.

Related Issue

Fixes #8307

Changes

  • Record minComputeCapability on VllmModelDef, on the two-digit scale vLLM reports. Both FP8 checkpoints require 8.9, deepseek-v4-flash and the Ultra NVFP4 recipe require 10.0, and the Spark NVFP4 recipe requires 12.1. The bf16 DeepSeek-R1 distill has no minimum.
  • Add readGpuComputeCapabilities, formatComputeCapability, and computeCapabilityPreflight to the managed vLLM module. The generic Linux and DGX Spark profiles launch with --gpus all, so the check judges the host by its weakest reported GPU. A host that reports no compute capability is not blocked.
  • Run the check in runVllmInstall immediately after the Docker prerequisites, ahead of the container-ownership check, the image pull, and hf download.
  • Watch the container restart count while waiting for the API. The single-host container runs under --restart unless-stopped, so docker ps keeps reporting a crash-looping container as running and the existing exited-container check never fires. The install now stops after three restarts and prints the container log tail.
  • Document the new check and add a minimum-capability column to the managed model table.

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with doc updates
  • Doc only (prose changes, no code sample modifications)
  • Doc only (includes code sample changes)

Quality Gates

  • Tests added or updated for changed behavior
  • Existing tests cover changed behavior — justification:
  • Tests not applicable — justification:
  • Docs updated for user-facing behavior changes
  • Docs not applicable — justification:
  • Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging)
  • Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification:
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Documentation Writer Review

  • Documentation writer subagent reviewed the completed changes
  • Result: docs-updated
  • Evidence: docs/inference/set-up-vllm.mdx, docs/inference/set-up-vllm-on-two-dgx-stations.mdx. The review found that the page claimed onboarding stops on a capability mismatch, which is true only for non-interactive runs; that the restart threshold was unstated; that the crash-loop text was attributed to the managed container in general rather than the single-host container; and that the distributed Station page shares the same entry point without saying so. Commit ba06343a9 applies those corrections. Revision 34a616316 adds the final clarification that reaching the restart threshold stops both the container and the install.
  • Agent: Claude Code

DGX Station Hardware Evidence

  • Tested on DGX Station
  • Tested commit:
  • Station profile/scenario:
  • Result:
  • Supporting evidence:

Verification

  • PR description includes a Signed-off-by: line and every commit appears as Verified in GitHub
  • Normal pre-commit, commit-msg, and pre-push hooks passed, or npm run validate:pr passed after refreshing origin/main when hooks were skipped or unavailable
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above — command/result or justification: npx vitest run --project cli src/lib/inference/ — 77 files, 1589 tests passed; npm run typecheck:cli — clean; npm run checks:repository — passed
  • Applicable broad gate passed — npm test for broad runtime/test-harness changes; npm run check for repo-wide validation/coverage changes — command/result:
  • Quality Gates section completed with required justifications or waivers
  • No secrets, API keys, or credentials committed
  • npm run docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Signed-off-by: Tinson Lai tinsonl@nvidia.com

Summary by CodeRabbit

  • New Features

    • Added compatibility checks to ensure selected models can run on available GPUs before downloads begin.
    • Added minimum GPU capability requirements for supported managed models.
    • Added detection of repeated container restarts during vLLM startup, with clearer failure reporting.
  • Documentation

    • Documented GPU requirements, validation behavior, failure handling, and readiness monitoring for managed vLLM deployments, including distributed installations.
  • Tests

    • Added coverage for GPU validation, model compatibility, capability detection, and startup crash-loop handling.

The model registry now records each quantized checkpoint's minimum compute
capability, and the install path compares it against the host GPUs before the
image pull and the model download. The readiness poller also stops a container
that keeps restarting instead of waiting out the full load timeout.

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Managed vLLM now records model GPU capability requirements, validates detected GPUs before downloads, and stops readiness polling after repeated container restarts. Tests cover capability handling, installation behavior, and restart detection. Documentation describes the new checks and managed-model requirements.

Changes

Managed vLLM validation

Layer / File(s) Summary
Model capability requirements
src/lib/inference/vllm-models.ts, docs/inference/set-up-vllm.mdx
VllmModelDef now supports optional minimum compute capabilities. Requirements were added to five managed models and documented.
Capability detection and installation preflight
src/lib/inference/vllm.ts, src/lib/inference/vllm-compute-capability.test.ts, docs/inference/set-up-vllm.mdx, docs/inference/set-up-vllm-on-two-dgx-stations.mdx
GPU capabilities are parsed and formatted. Installation rejects incompatible models before image or model operations. Tests cover unsupported, supported, undetected, and weakest-GPU cases.
Startup restart watchdog
src/lib/inference/vllm.ts, src/lib/inference/vllm-compute-capability.test.ts, docs/inference/set-up-vllm.mdx
Readiness polling inspects container restart counts and fails after three startup restarts. Tests cover repeated restarts and stable containers.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant InstallFlow
  participant GPUDetection
  participant ModelRegistry
  participant Docker
  InstallFlow->>GPUDetection: Read GPU compute capabilities
  GPUDetection-->>InstallFlow: Return detected capabilities
  InstallFlow->>ModelRegistry: Validate model requirement
  ModelRegistry-->>InstallFlow: Return compatibility result
  InstallFlow->>Docker: Start vLLM container when compatible
  Docker-->>InstallFlow: Return restart count during readiness polling
  InstallFlow->>Docker: Stop container after three startup restarts
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The PR implements GPU capability preflight, prevents downloads on incompatible hosts, and stops repeated vLLM restarts as required by [#8307].
Out of Scope Changes check ✅ Passed The implementation, tests, model requirements, and documentation directly support the linked issue objectives without unrelated changes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main change: stopping managed vLLM installation when host GPUs cannot serve the selected model.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/vllm-compute-capability-preflight

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

@github-code-quality

github-code-quality Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in commit 34a6163 in the fix/vllm-compute-cap... branch remains at 96%, unchanged from commit 3312899 in the main branch.

TypeScript / code-coverage/cli

The overall coverage in commit 34a6163 in the fix/vllm-compute-cap... branch remains at 81%, unchanged from commit 3312899 in the main branch.

Show a code coverage summary of the most impacted files.
File main 3312899 fix/vllm-compute-cap... 34a6163 +/-
src/lib/credentials/store.ts 56% 55% -1%
src/lib/inferen.../vllm-models.ts 81% 80% -1%
src/lib/inference/vllm.ts 89% 89% 0%
src/lib/onboard...-transaction.ts 94% 94% 0%
src/lib/sandbox...rce-identity.ts 87% 87% 0%
src/lib/tunnel/services.ts 80% 80% 0%
src/lib/shields/index.ts 73% 74% +1%

Updated August 05, 2026 11:18 UTC

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/lib/inference/vllm-compute-capability.test.ts`:
- Around line 303-332: Update the two tests around installVllm to cover the
restart-limit boundary: change the failure case in “stops a restarting container
instead of waiting out the load timeout (`#8307`)” to simulate three restarts and
expect the message mentioning three restarts, and rename the success case to
describe waiting while restarts remain below the limit while keeping its
two-restart setup and successful result.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 074407c3-0d50-4ada-bfcd-bc40d363b03a

📥 Commits

Reviewing files that changed from the base of the PR and between 3a39ff3 and d0aae96.

📒 Files selected for processing (4)
  • docs/inference/set-up-vllm.mdx
  • src/lib/inference/vllm-compute-capability.test.ts
  • src/lib/inference/vllm-models.ts
  • src/lib/inference/vllm.ts

Comment thread src/lib/inference/vllm-compute-capability.test.ts Outdated
@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — No blocking findings reported

Advisor assessment: No blocking advisor findings reported
Next action: No advisor follow-up needed.
Findings: 0 blockers · 0 warnings · 0 suggestions

Model lanes

  • GPT-5.6 Terra (primary): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Model comparison: normalized findings match; normalized terminology decisions differ; normalized E2E selections differ; severity counts match.
5 terminology differences from the second opinion

Advisory only. These are normalized differences from the primary terminology receipt.

  • GPU compute capability at docs/inference/set-up-vllm.mdx:135: primary classified it as define; the second opinion classified it as established.
  • compute capability preflight at src/lib/inference/vllm-compute-capability.test.ts:118: selected only by the second-opinion lane as justified.
  • crash-loop watchdog at src/lib/inference/vllm-compute-capability.test.ts:252: selected only by the second-opinion lane as justified.
  • minComputeCapability at src/lib/inference/vllm-models.ts:92: selected only by the second-opinion lane as justified.
  • restart count at docs/inference/set-up-vllm.mdx:209: selected only by the second-opinion lane as established.
3 additional E2E selections from the second opinion

Advisory only. The primary lane did not select these E2E jobs or targets.

  • gpu-e2e: The completed second-opinion lane identified E2E coverage that the primary lane omitted.
  • managed-image-multiarch-startup: The completed second-opinion lane identified E2E coverage that the primary lane omitted.
  • vllm-docker-storage: The completed second-opinion lane identified E2E coverage that the primary lane omitted.

Second-opinion terminology and E2E selections are advisory. They do not change the primary assessment or E2E / PR Gate.

2 semantic terminology decisions

Terminology decisions are advisory. They affect the assessment only when a separate finding identifies concrete semantic impact.

  • define — GPU compute capability at docs/inference/set-up-vllm.mdx:135: Define the term at first use through the surrounding explanation of reported and required values; retain this term consistently for the preflight.
  • justified — startup restart limit at src/lib/inference/vllm-compute-capability.test.ts:303: Retain the modifier because it distinguishes the restart-count threshold from the load timeout.

E2E guidance

Advisory only. E2E / PR Gate selects and runs jobs independently.

Recommended E2E: inference-routing, network-policy

Workflow run details

This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge.

@laitingsheng laitingsheng added provider: vllm vLLM local or hosted provider behavior area: inference Inference routing, serving, model selection, or outputs bug-fix PR fixes a bug or regression labels Aug 5, 2026
The page claimed that onboarding stops on a mismatch, but interactive
onboarding returns to the provider list and only non-interactive onboarding
exits. The restart threshold is now stated, the crash-loop text sits with the
readiness prose it belongs to, and the distributed Station page points at the
shared check.

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
Four restarts passed whether the guard compared with `>=` or `>`, so the case
did not protect the configured limit. Three restarts fails only on `>=`.

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
@apurvvkumaria apurvvkumaria self-assigned this Aug 5, 2026
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@apurvvkumaria

Copy link
Copy Markdown
Collaborator

Security review for revision 34a616316: PASS — no findings.

Category Result Evidence
Secrets and credentials PASS No credential source, storage, forwarding, or logging changes.
Input validation and data sanitization PASS nvidia-smi output is accepted only as decimal compute-capability lines and converted to bounded numeric comparisons.
Authentication and authorization PASS The change does not alter provider authentication or authorization decisions.
Dependencies and third-party libraries PASS No dependency is added or updated.
Error handling and logging PASS Capability mismatch stops before downloads with non-sensitive diagnostics; malformed or unavailable capability output preserves the existing vLLM fallback path.
Cryptography and data protection PASS No cryptographic or stored-data behavior changes.
Configuration and security headers PASS Model minima are declarative registry values, and no sandbox or network-policy configuration is broadened.
Security testing PASS Tests cover below-minimum rejection, boundary acceptance, missing or invalid capability output, mixed-GPU hosts, registry coverage, and the restart threshold.
System security PASS Repeated startup crashes now stop the managed container after three restarts rather than allowing a prolonged crash loop; no privilege boundary changes.

All commits are GitHub Verified and the PR includes contributor DCO. Focused vLLM tests passed 8/8, the previously failing package-contract test passed 8/8 after incorporating the fixture fix from current main, CLI type-check passed, repository hooks passed, and the documentation build completed with 0 errors. Fresh CI is running.

@apurvvkumaria

Copy link
Copy Markdown
Collaborator

Final gate refresh for the current branch revision: all 40 reported checks pass, including protected E2E, both advisor lanes, CodeQL, DCO, documentation receipt, package contracts, and the aggregate CI gate. There are no unresolved review threads or actionable automated findings. The PR remains unmerged because an independent approval is still required.

@jyaunches
jyaunches merged commit 95e1c78 into main Aug 5, 2026
73 of 75 checks passed
@jyaunches
jyaunches deleted the fix/vllm-compute-capability-preflight branch August 5, 2026 12:36
@cjagwani cjagwani mentioned this pull request Aug 5, 2026
23 tasks
cjagwani added a commit that referenced this pull request Aug 5, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Add the canonical dated changelog entry for the planned NemoClaw
v0.0.103 release.
The new `docs/changelog/2026-08-05.mdx` entry uses the exact `##
v0.0.103` heading and summarizes supported user-visible changes merged
since v0.0.102.

## Changes

- Add the parser-safe MDX SPDX header, three-paragraph release summary,
and detailed grouped bullets to `docs/changelog/2026-08-05.mdx`.
- Link each release-note group to the most specific published OpenClaw,
Hermes, or Deep Agents documentation routes.
- Exclude dormant MXC and Podman foundations, internal managed-inference
adapters, test-only changes, and maintainer tooling from the supported
product narrative.

### Source summary

- [#8082](#8082) ->
`docs/changelog/2026-08-05.mdx`: Document the new one-command agent
launch flow.
- [#8314](#8314) ->
`docs/changelog/2026-08-05.mdx`: Document managed vLLM host capability
validation and restart handling.
- [#8248](#8248) ->
`docs/changelog/2026-08-05.mdx`: Record the DGX Spark Qwen profile MTP
default change.
- [#8223](#8223) ->
`docs/changelog/2026-08-05.mdx`: Record explicit model preservation
across provider switches.
- [#8209](#8209) ->
`docs/changelog/2026-08-05.mdx`: Document corrected Windows WSL provider
selection.
- [#8316](#8316) ->
`docs/changelog/2026-08-05.mdx`: Record clean managed-checkout reuse
after installation.
- [#8239](#8239) ->
`docs/changelog/2026-08-05.mdx`: Record the packaged-service teardown
fallback.
- [#8247](#8247) ->
`docs/changelog/2026-08-05.mdx`: Document uninstall behavior for an
already-removed sandbox.
- [#7998](#7998) ->
`docs/changelog/2026-08-05.mdx`: Record preserved container-start
diagnostics.
- [#8027](#8027) ->
`docs/changelog/2026-08-05.mdx`: Record journal-backed not-ready repair
authority.
- [#7812](#7812) ->
`docs/changelog/2026-08-05.mdx`: Document actionable rebuild preflight
diagnostics.
- [#8222](#8222) ->
`docs/changelog/2026-08-05.mdx`: Record redacted top-level CLI failures.
- [#8313](#8313) ->
`docs/changelog/2026-08-05.mdx`: Record structured MCP bridge
destruction failures.
- [#8211](#8211) ->
`docs/changelog/2026-08-05.mdx`: Document cleanup of incomplete snapshot
captures.
- [#8212](#8212) ->
`docs/changelog/2026-08-05.mdx`: Document best-effort post-restore
policy reconciliation.
- [#8245](#8245) ->
`docs/changelog/2026-08-05.mdx`: Clarify manifest-defined OpenClaw
workspace persistence.
- [#8254](#8254) ->
`docs/changelog/2026-08-05.mdx`: Include corrected snapshot restore
selection guidance.
- [#8238](#8238) ->
`docs/changelog/2026-08-05.mdx`: Document preservation of managed MCP
policy entries.
- [#7568](#7568) ->
`docs/changelog/2026-08-05.mdx`: Record mutable-default Shields rollback
preservation.
- [#8200](#8200) ->
`docs/changelog/2026-08-05.mdx`: Record truthful Shields state after a
rejected transition.
- [#7895](#7895) ->
`docs/changelog/2026-08-05.mdx`: Record descriptor-bound Shields lock
inspection.
- [#7892](#7892) ->
`docs/changelog/2026-08-05.mdx`: Document the canonical Hermes dashboard
profile and migration.
- [#7871](#7871) ->
`docs/changelog/2026-08-05.mdx`: Document fail-closed Hermes cron
restore.
- [#7894](#7894) ->
`docs/changelog/2026-08-05.mdx`: Record the reset Hermes health budget
after recovery.
- [#8228](#8228) ->
`docs/changelog/2026-08-05.mdx`: Document Hermes build-time corporate CA
trust.
- [#8206](#8206) ->
`docs/changelog/2026-08-05.mdx`: Document bounded Deep Agents Code
failure classification.
- [#8297](#8297) ->
`docs/changelog/2026-08-05.mdx`: Record reuse of the published Deep
Agents Code base image.
- [#8321](#8321) ->
`docs/changelog/2026-08-05.mdx`: Document aligned endpoint SSRF
protections and userinfo rejection.
- [#8299](#8299) ->
`docs/changelog/2026-08-05.mdx`: Document the fail-closed `setpriv`
transition in managed images.
- [#7603](#7603) ->
`docs/changelog/2026-08-05.mdx`: Record corrected confidentiality-root
traversal.
- [#8334](#8334) ->
`docs/changelog/2026-08-05.mdx`: Record removal of the unsupported logs
audit example.
- [#8256](#8256) ->
`docs/changelog/2026-08-05.mdx`: Record reordered network-policy
walkthrough prerequisites.
- [#7767](#7767) ->
`docs/changelog/2026-08-05.mdx`: Record platform runtime shape
validation.

## Type of Change

- [ ] Code change (feature, bug fix, or refactor)
- [ ] Code change with doc updates
- [x] Doc only (prose changes, no code sample modifications)
- [ ] Doc only (includes code sample changes)

## Quality Gates

- [ ] Tests added or updated for changed behavior
- [x] Existing tests cover changed behavior — justification: `npx vitest
run test/changelog-docs.test.ts` passed all 6 tests.
- [ ] Tests not applicable — justification:
- [x] Docs updated for user-facing behavior changes
- [ ] Docs not applicable — justification:
- [ ] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [ ] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification:
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:

## Documentation Writer Review

- [ ] Documentation writer subagent reviewed the completed changes
- Result: `docs-updated`
- Evidence: `docs/changelog/2026-08-05.mdx` follows the release-prep and
documentation writing rules. The changelog contract tests passed 6/6,
and `npm run docs` completed with 0 errors and the repository's 2
existing Fern warnings.
- Agent: Codex Desktop
<!-- docs-review-head-sha: 66fcd80 -->
<!-- docs-review-agents-blob-sha: 3dd7c24 -->

## DGX Station Hardware Evidence

- [ ] Tested on DGX Station
- Tested commit: Not applicable.
- Station profile/scenario: Not applicable.
- Result: Not applicable.
- Supporting evidence: Not applicable.

## Verification

- [x] PR description includes a `Signed-off-by:` line and every commit
appears as `Verified` in GitHub
- [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or
`npm run validate:pr` passed after refreshing `origin/main` when hooks
were skipped or unavailable
- [x] Targeted behavior tests pass for the current change set, or tests
are marked not applicable above — `npx vitest run
test/changelog-docs.test.ts`: 1 file and 6 tests passed.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result: Not run for this doc-only
change.
- [x] Quality Gates section completed with required justifications or
waivers
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only) —
completed with 0 errors and 2 existing Fern warnings.
- [x] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)
— the native changelog uses the required parser-safe MDX SPDX comment
and does not use page frontmatter.

---
Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
  * Added release notes for v0.0.103.
  * Documented the new `nemoclaw launch` command.
* Included updates covering onboarding, inference, installation,
recovery, snapshots, security, integrations, endpoint validation,
sandbox hardening, and related guidance.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: inference Inference routing, serving, model selection, or outputs bug-fix PR fixes a bug or regression provider: vllm vLLM local or hosted provider behavior

Projects

None yet

3 participants