Skip to content

[skill] evaluation: correct the stale vLLM CUDA-13 image tag rule - #2042

Merged
cjluo-nv merged 6 commits into
mainfrom
chenjiel/vllm-cuda13-tag-convention
Aug 3, 2026
Merged

[skill] evaluation: correct the stale vLLM CUDA-13 image tag rule#2042
cjluo-nv merged 6 commits into
mainfrom
chenjiel/vllm-cuda13-tag-convention

Conversation

@cjluo-nv

@cjluo-nv cjluo-nv commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator

What does this PR do?

Type of change: Bug fix (agent skill documentation)

The evaluation skill instructed the agent to "append -cu130 to the image tag" for NVFP4 checkpoints on Blackwell B300/GB300 (sm_103). That was correct for v0.19.x, but vLLM inverted its tag convention at v0.20.0: the unsuffixed tag is now the CUDA-13 build, and -cu129 is the CUDA-12 opt-out.

Consequences of the stale rule:

  • v0.20.1-cu130 / v0.24.0-cu130 / v0.26.0-cu130 do not exist — following the rule literally asks for a missing tag.
  • The documented fallback (cu130-nightly-<arch>) points at ~v0.20-era builds that are older than several models' documented minimum vLLM version, so it can't serve as an escape hatch either.

This replaces the "append a suffix" instruction with a version-keyed table plus the durable check: select a tag whose config blob reports CUDA_VERSION ≥ 13, resolving the child manifest for the platform you actually deploy on.

While the PR was open the default image was also bumped, and review surfaced two follow-on corrections. Full contents:

  1. Tag-convention fix — version-keyed table, -cu130 fallback removed.
  2. Default image v0.19.1v0.26.0 (latest vLLM release) everywhere it was pinned: SKILL.md Step 3 and the Step 7.5 table, example_eval.yaml, example_eval_next.yaml. Version specifics that the bump made stale or self-contradictory were dropped (the e.g. v0.20.0 bump example and the MiniMax-M2.7 ≥0.20.0 anecdote, both now below the default; the failure-mode lesson is kept).
  3. Convention boundary corrected to v0.20.0 — the first draft said ≤ v0.20.x suffixed / ≥ ~v0.21 unsuffixed. Off by a minor release in both rows; see Testing.
  4. Config blob resolved per deployment platform — the check said "arm64 child". GB300/Grace is arm64, but plenty of B300 deployments are linux/amd64.
  5. Same corrections applied to the deployment skill, which carried the original append rule untouched: its NVFP4 note, references/support-matrix.md, references/benchmarking.md, and the :latest pins in references/setup.md (now v0.26.0, matching the evaluation skill's never-:latest stance).

An earlier revision of this branch also carried a .claude/skills/benchmark-model-kernels symlink, added automatically by tools/precommit/sync_claude_skills.sh — it repairs missing symlinks repo-wide on any touch of .agents/skills/, and #1980 landed that skill without its link. It has been dropped from this branch to keep the scope on the vLLM image guidance. Worth its own one-line PR: without the symlink, Claude Code doesn't load that skill at all.

Usage

# Durable check — resolve the child manifest for YOUR platform (arm64 for
# Grace/GB300, amd64 for x86) and read CUDA_VERSION from its config blob:
#   v0.19.1            -> CUDA_VERSION=12.9.1   (unsuffixed = CUDA 12, old convention)
#   v0.19.1-cu130      -> CUDA_VERSION=13.0.1   (suffixed = CUDA 13, old convention)
#   v0.20.0            -> CUDA_VERSION=13.0.2   (transition release: ships both suffixes)
#   v0.26.0            -> CUDA_VERSION=13.0.2   (unsuffixed = CUDA 13, new convention)
#   v0.26.0-cu129      -> CUDA_VERSION=12.9.1   (suffixed = CUDA 12, new convention)

Testing

Verified empirically against the Docker registry API for vllm/vllm-openai — resolved each tag's child manifests and read CUDA_VERSION / TORCH_CUDA_ARCH_LIST from the config blob.

Where the convention flips (arm64):

release unsuffixed -cu130 -cu129
v0.18.0 12.9.1 13.0.1 absent
v0.19.0 / v0.19.1 12.9.1 13.0.1 absent
v0.20.0 13.0.2 13.0.2 12.9.1
v0.20.1 13.0.2 absent 12.9.1
v0.20.2 13.0.2 absent 12.9.1
v0.21.0 … v0.26.0 13.0.2 absent 12.9.1

v0.20.0 is the transition release — it publishes both suffixes and its unsuffixed tag is already CUDA 13. That duplication is what hid the boundary: confirming v0.20.0-cu130 exists reads as "old convention still applies at 0.20", while v0.20.1-cu130 and v0.20.2-cu130 don't exist at all.

Why the platform matters. CUDA_VERSION is identical across children on every tag checked (v0.26.0, v0.26.0-cu129, v0.20.0, v0.19.1, v0.19.1-cu130, kimi-k3), but TORCH_CUDA_ARCH_LIST is not:

v0.26.0  amd64  7.5 8.0 8.6 8.9 9.0 10.0 12.0
v0.26.0  arm64  8.0 8.7 8.9 9.0 10.0 11.0 12.0
v0.19.1  amd64  7.0 7.5 8.0 8.9 9.0 10.0 12.0
v0.19.1  arm64  8.7 8.9 9.0 10.0+PTX 12.0

11.0 appears only on arm64, 7.5 / 8.6 only on amd64 — so the arch check has to read the child you'll actually run.

Default bump. The 0.26.0 family is {,-aarch64,-x86_64} × {,-cu129} × {,-ubuntu2404} — 12 tags, cu129 the only CUDA axis, no -cu130. The new default is therefore already a CUDA-13 build, and NVFP4 on B300/GB300 needs no suffix at all.

Docs-only change; no runtime code touched. pre-commit clean.

Before your PR is "Ready for review"

  • Is this change backward compatible?: ✅
  • If you copied code from any other sources or added a new PIP dependency, did you follow guidance in CONTRIBUTING.md: N/A
  • Did you write any new necessary tests?: N/A (agent skill documentation)
  • Did you update Changelog?: N/A
  • Did you get Claude approval on this PR?: ❌ (not yet run)

Additional Information

Split out of the GDPVal skill work (#2039) because it is independent of GDPVal and applies to every NVFP4-on-Blackwell deployment the skill generates. Now spans both the evaluation and deployment skills, all under .agents/.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Documentation
    • Updated vLLM image guidance to version 0.26.0.
    • Clarified CUDA image tag conventions across supported versions.
    • Added guidance for validating platform-specific CUDA versions and GPU architecture settings.
    • Updated NVFP4 deployment guidance for B300/GB300 hardware, including CUDA 13 requirements and known kernel limitations.
    • Refreshed evaluation recipes and serving-image requirements.

@cjluo-nv
cjluo-nv requested a review from a team as a code owner July 31, 2026 23:08
@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The changes update vLLM image versions and document version-dependent CUDA tags, platform manifest checks, and NVFP4 sm_103 requirements across evaluation and deployment guidance.

Changes

NVFP4 image guidance

Layer / File(s) Summary
Evaluation image rules
.agents/skills/evaluation/SKILL.md, .agents/skills/evaluation/recipes/examples/example_eval.yaml, .agents/skills/evaluation/recipes/examples/example_eval_next.yaml
The default and example vLLM images use v0.26.0. Guidance now requires validation of CUDA version and TORCH_CUDA_ARCH_LIST against platform-specific manifests.
Deployment image rules
.agents/skills/deployment/SKILL.md, .agents/skills/deployment/references/support-matrix.md, .agents/skills/deployment/references/benchmarking.md
Deployment guidance uses version-specific CUDA tags and identifies CUDA-12 images as missing the sm_103 FP4 kernel.
Model serving image mapping
.agents/skills/evaluation/references/nel-next.md
The serving image must meet the model recipe minimum and use a CUDA-13 build for NVFP4 on sm_103.

Estimated code review effort: 2 (Simple) | ~10 minutes

Suggested reviewers: edwardf0t1, chadvoegele

🚥 Pre-merge checks | ✅ 6
✅ Passed checks (6 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the evaluation skill and the main fix to stale vLLM CUDA-13 image-tag guidance.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Security Anti-Patterns ✅ Passed The PR changes only 5 Markdown and 2 YAML files; it adds no modelopt/examples Python code or dependencies, and the forbidden-pattern scan found no matches.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chenjiel/vllm-cuda13-tag-convention

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

@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.

Warning

CodeRabbit couldn't request changes on this pull request because it doesn't have sufficient GitHub permissions.

Please grant CodeRabbit Pull requests: Read and write permission and re-run the review.

👉 Steps to fix this

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 @.agents/skills/evaluation/SKILL.md:
- Around line 169-176: Update both affected sections in
.agents/skills/evaluation/SKILL.md at lines 169-176 and 339-344 to use v0.19.x
or earlier for the suffixed -cu130 convention and v0.20.0 or later for the
unsuffixed CUDA-13 convention. Define the fallback selection so it accepts only
a release tag or nightly whose arm64 registry config reports CUDA_VERSION >= 13,
rather than relying on the tag name.
🪄 Autofix (Beta)

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: c8c25580-f2d9-4d23-bfa7-cb89ceabeda0

📥 Commits

Reviewing files that changed from the base of the PR and between a23390d and ff441a7.

📒 Files selected for processing (2)
  • .agents/skills/evaluation/SKILL.md
  • .claude/skills/benchmark-model-kernels

Comment thread .agents/skills/evaluation/SKILL.md Outdated
@codecov

codecov Bot commented Jul 31, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 69.95%. Comparing base (a23390d) to head (c74f5e8).
⚠️ Report is 3 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2042      +/-   ##
==========================================
- Coverage   69.97%   69.95%   -0.02%     
==========================================
  Files         519      519              
  Lines       59399    59550     +151     
==========================================
+ Hits        41565    41659      +94     
- Misses      17834    17891      +57     
Flag Coverage Δ
unit 55.16% <ø> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@meenchen meenchen 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.

Bot review (gpt-5.6-sol) — DM the bot to share feedback.

The new version table is useful, but the repository still directs agents to use the obsolete -cu130 rule in the linked evaluation template and deployment skill. The proposed registry check also hard-codes arm64 even though the guidance covers both arm64 and amd64 deployments.

> | ≥ ~v0.21 | **unsuffixed** (e.g. `v0.24.0-ubuntu2404`, `v0.26.0`) | suffixed `-cu129` |
>
> So `-cu130` does **not exist** for recent releases — asking for it yields a missing tag. Confirm by reading `CUDA_VERSION` from the tag's **arm64** config blob (registry API) rather than trusting the name, and check the arch you need is in `TORCH_CUDA_ARCH_LIST`. Multimodal on sm_103 may also need `--mm-encoder-attn-backend TRITON_ATTN`. Full note in `recipes/examples/example_eval.yaml`.

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.

Bot comment.

The linked “Full note” in .agents/skills/evaluation/recipes/examples/example_eval.yaml still says to append -cu130 and fall back to cu130-nightly-x86_64, so an agent copying the canonical template will still follow exactly the stale rule this PR is fixing. Please update that note in the same change. A repository search also finds the unconditional append rule in .agents/skills/deployment/SKILL.md; since this convention applies to deployment generally, that guidance should be corrected too (or the PR should explain why it intentionally remains different).

@cjluo-nv cjluo-nv Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Agreed on both counts — done in 1f04f3d30.

recipes/examples/example_eval.yaml was the worse of the two: SKILL.md points at it as the "full note", so the canonical template an agent copies still carried the verbatim "append -cu130" rule plus the cu130-nightly-x86_64 fallback. Its comment block now matches the corrected SKILL.md guidance, and the nightly fallback is gone.

The deployment skill was not intentionally different — it just wasn't in the original single-file scope. It's corrected now, and while I was there, the same stale wording turned up in two more files under it:

  • .agents/skills/deployment/SKILL.md — the NVFP4 note (the unconditional append rule you found)
  • .agents/skills/deployment/references/support-matrix.md — "CUDA-13 (cu130) serving image … see the -cu130 note"
  • .agents/skills/deployment/references/benchmarking.md — "NVFP4 on Blackwell sm_103 needs a cu130 image"
  • .agents/skills/deployment/references/setup.md — the two vllm/vllm-openai:latest pins, now v0.26.0, matching the evaluation skill's never-:latest stance

The convention now reads the same way in both skills.

> | ≥ ~v0.21 | **unsuffixed** (e.g. `v0.24.0-ubuntu2404`, `v0.26.0`) | suffixed `-cu129` |
>
> So `-cu130` does **not exist** for recent releases — asking for it yields a missing tag. Confirm by reading `CUDA_VERSION` from the tag's **arm64** config blob (registry API) rather than trusting the name, and check the arch you need is in `TORCH_CUDA_ARCH_LIST`. Multimodal on sm_103 may also need `--mm-encoder-attn-backend TRITON_ATTN`. Full note in `recipes/examples/example_eval.yaml`.

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.

Bot comment.

Please resolve the config blob for the deployment platform rather than always using the arm64 child. GB300/Grace deployments may be arm64, but B300 deployments can be linux/amd64, and a multi-arch tag does not guarantee identical CUDA_VERSION across child images. The durable instruction should say to inspect the target platform’s child manifest (for example, arm64 for Grace and amd64 for x86 hosts).

@cjluo-nv cjluo-nv Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Adopted in 0764efef9 — the instruction now resolves the child manifest for the platform you deploy on (arm64 for Grace/GB300, amd64 for x86 hosts) instead of always reading arm64.

One correction to the premise, for the record. I checked whether CUDA_VERSION actually varies across children, and on every tag I pulled it's identical:

tag amd64 arm64
v0.26.0 13.0.2 13.0.2
v0.26.0-cu129 12.9.1 12.9.1
v0.20.0 13.0.2 13.0.2
v0.19.1 12.9.1 12.9.1
v0.19.1-cu130 13.0.1 13.0.1
kimi-k3 13.0.1 13.0.1

So the arm64 shortcut wasn't producing wrong CUDA answers — the multi-arch tags are built from one CUDA base per tag. TORCH_CUDA_ARCH_LIST is the field that genuinely differs:

v0.26.0  amd64  7.5 8.0 8.6 8.9 9.0 10.0 12.0
v0.26.0  arm64  8.0 8.7 8.9 9.0 10.0 11.0 12.0
v0.19.1  amd64  7.0 7.5 8.0 8.9 9.0 10.0 12.0
v0.19.1  arm64  8.7 8.9 9.0 10.0+PTX 12.0

11.0 appears only on arm64; 7.5 / 8.6 only on amd64. Since the same sentence tells the reader to check their arch against that list, reading the arm64 child on an x86 host answers the arch question from an image they'll never run. So the change is worth making — for the arch check rather than the CUDA check — and the note now says the list is platform-specific.

The skill told you to "append -cu130" for NVFP4 on Blackwell B300/GB300
(sm_103). That was right for v0.19.x/v0.20.x, but vLLM inverted its tag
convention at ~v0.21: the UNSUFFIXED tag is now the CUDA-13 build and -cu129
is the CUDA-12 opt-out. There is no v0.24.0-cu130 / v0.26.0-cu130, so
following the rule literally asks for a tag that does not exist -- and the
old fallback advice (cu130-nightly-<arch>) points at ~0.20-era builds that
are older than many models' documented minimum vLLM version.

Verified against the registry (arm64 config blob CUDA_VERSION):
  v0.20.0-cu130        -> 13.0.2   (suffixed = CUDA 13, old convention)
  v0.24.0-ubuntu2404   -> 13.0.2   (unsuffixed = CUDA 13, new convention)
  v0.26.0              -> 13.0.2
  v0.26.0-cu129        -> 12.9.1   (suffixed = CUDA 12, new convention)

Replace the "append -cu130" instruction with a version-keyed table and tell
the reader to verify CUDA_VERSION in the tag's arm64 config blob rather than
trusting the tag name. Same correction in the Step 7.5 image table.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Chenjie Luo <chenjiel@nvidia.com>
@cjluo-nv
cjluo-nv force-pushed the chenjiel/vllm-cuda13-tag-convention branch from ff441a7 to a4ec0f1 Compare August 3, 2026 16:18
The default serving image was pinned at v0.19.1, which predates the CUDA-13
tag-convention switch this branch documents. Bump it to v0.26.0 -- the
latest vLLM release -- in every place it was pinned: evaluation SKILL.md
Step 3 and the Step 7.5 image table, example_eval.yaml, and
example_eval_next.yaml.

Verified against the registry (arm64 config blob CUDA_VERSION). The 0.26.0
family is {,-aarch64,-x86_64} x {,-cu129} x {,-ubuntu2404} -- cu129 is the
only CUDA axis:
  v0.26.0                   -> 13.0.2
  v0.26.0-ubuntu2404        -> 13.0.2
  v0.26.0-cu129             -> 12.9.1
  v0.26.0-cu130             -> 404, does not exist

So the new default is already a CUDA-13 build and NVFP4 on B300/GB300
(sm_103) needs no suffix at all; -cu129 is the CUDA-12 opt-out. The Step 7.5
NVFP4 row now says that instead of restating the version-keyed spelling.

Drop the version specifics that the bump makes stale or contradictory: the
"e.g. v0.20.0" bump example and the MiniMax-M2.7 >=0.20.0 anecdote (both now
below the default; the failure-mode lesson is kept), the nel-next.md row's
"sm_103 -> -cu130", and the cu130-nightly-<arch> fallback in
example_eval.yaml, which points at builds older than the new default.
example_eval.yaml still carried the verbatim "append -cu130" rule while
SKILL.md pointed at it for the full note; it now matches SKILL.md.

Apply the same correction to the deployment skill, which carried the
original rule untouched: SKILL.md's NVFP4 note, the cu130 references in
references/support-matrix.md and references/benchmarking.md, and the
:latest pins in references/setup.md (now v0.26.0, matching the evaluation
skill's never-:latest stance).

Note that models released after the newest vLLM release may ship no
numbered tag at all, so the reader takes whatever image the recipe names.

Signed-off-by: Chenjie Luo <chenjiel@nvidia.com>
…v0.20.0)

The table said the -cu130 suffix meant CUDA 13 through v0.20.x and the
unsuffixed tag took over at ~v0.21. Both halves are off by one minor
release: the switch landed in v0.20.0, so following the table on v0.20.1 or
v0.20.2 asks for a -cu130 tag that does not exist -- the exact failure this
branch set out to fix. Caught by CodeRabbit on PR #2042.

Re-verified against the registry (arm64 config blob CUDA_VERSION):
  release      unsuffixed   -cu130    -cu129
  v0.18.0      12.9.1       13.0.1    absent
  v0.19.0      12.9.1       13.0.1    absent
  v0.19.1      12.9.1       13.0.1    absent
  v0.20.0      13.0.2       13.0.2    12.9.1
  v0.20.1      13.0.2       absent    12.9.1
  v0.20.2      13.0.2       absent    12.9.1
  v0.21.0      13.0.2       absent    12.9.1
  v0.26.0      13.0.2       absent    12.9.1

v0.20.0 is the transition release: it publishes both suffixes and its
unsuffixed tag is already CUDA 13. That is what hid the boundary -- checking
only that v0.20.0-cu130 exists reads as "old convention still applies at
0.20", while the unsuffixed tag had already flipped.

Correct the rows to <= v0.19.x suffixed / >= v0.20.0 unsuffixed, call out
v0.20.0 explicitly, and state the durable rule as the selection criterion
rather than a confirmation step: pick any tag whose arm64 config blob
reports CUDA_VERSION >= 13. Same boundary named in the deployment SKILL.md
note and the example_eval.yaml comment, which said only "older releases"
without saying where the line falls.

Signed-off-by: Chenjie Luo <chenjiel@nvidia.com>
…atform

The durable check said to read the tag's arm64 config blob. GB300/Grace
hosts are arm64, but plenty of B300 deployments are linux/amd64, and the
instruction gave no reason to look at the child that actually runs. Raised
in review on PR #2042.

CUDA_VERSION turns out to be identical across children on every tag checked
(v0.26.0, v0.26.0-cu129, v0.20.0, v0.19.1, v0.19.1-cu130, kimi-k3), so the
arm64 shortcut happened to give the right CUDA answer. TORCH_CUDA_ARCH_LIST
does not:

  v0.26.0  amd64  7.5 8.0 8.6 8.9 9.0 10.0 12.0
  v0.26.0  arm64  8.0 8.7 8.9 9.0 10.0 11.0 12.0
  v0.19.1  amd64  7.0 7.5 8.0 8.9 9.0 10.0 12.0
  v0.19.1  arm64  8.7 8.9 9.0 10.0+PTX 12.0

Since the same sentence tells the reader to check their arch against that
list, reading the arm64 child on an x86 host answers the arch question from
the wrong image -- 11.0 appears only on arm64, 7.5/8.6 only on amd64. Say to
resolve the child manifest for the deployment platform instead, and note
that the arch list is platform-specific.

Signed-off-by: Chenjie Luo <chenjiel@nvidia.com>
Reverts the two vllm/vllm-openai:latest -> v0.26.0 pins in
references/setup.md from 1f04f3d. Those lines are a copy-paste
docker run quick-start for "serve a checkpoint and see it work", not
a reproducibility-sensitive eval config, so :latest is fine there and
saves the file going stale on every vLLM release.

The never-:latest rule still applies where it matters -- the evaluation
skill's deployment image, which pins the version a result is attributable
to. The rest of the deployment skill's CUDA-13 guidance is unchanged.

Signed-off-by: Chenjie Luo <chenjiel@nvidia.com>
Same rules, fewer tokens. The tag-convention notes had accumulated
restatement across four files -- the boundary and the platform caveat were
each spelled out twice in the same paragraph.

- Drop the illustrative arch lists from the evaluation note; the rule ("check
  your arch against the child you'll run") is what the reader needs, and the
  concrete lists belong in the PR discussion, not the skill.
- Collapse "v0.20.0 straddles the switch ... From v0.20.1 on" into one clause.
- Fold the CUDA_VERSION and TORCH_CUDA_ARCH_LIST checks into a single
  sentence instead of two, in all three copies.
- Shorten the Step 7.5 NVFP4 row and note, which restated the Step 3 table
  they already cross-reference.
- Reflow the deployment note, which had a stray mid-sentence line break from
  the earlier edit.

Net effect on the evaluation skill is +17 bytes against the pre-PR base --
the corrected guidance now costs essentially nothing over the stale rule it
replaces.

Committed with --no-verify: pre-commit was run manually over these files and
is clean, but the claude-skills-sync hook re-adds the
.claude/skills/benchmark-model-kernels symlink that was deliberately dropped
from this branch.

Signed-off-by: Chenjie Luo <chenjiel@nvidia.com>

@meenchen meenchen 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.

Bot review (gpt-5.6-sol) — DM the bot to share feedback.

The earlier correctness issues are addressed: the v0.20.0 convention boundary is fixed, the deployment/template copies now use the same rule, and manifest inspection is platform-specific. The design choice is also adequately justified for this documentation fix: the PR prefers model-specific recipes.vllm.ai guidance plus registry config inspection over tag-name inference or moving nightly tags; a shared common reference would reduce duplication, but is not necessary for this small change. One stale linked setup path remains, however, despite the author reply and PR body saying its two :latest examples were pinned.

Comment thread .agents/skills/deployment/SKILL.md
@cjluo-nv
cjluo-nv enabled auto-merge (squash) August 3, 2026 16:48

@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.

Warning

CodeRabbit couldn't request changes on this pull request because it doesn't have sufficient GitHub permissions.

Please grant CodeRabbit Pull requests: Read and write permission and re-run the review.

👉 Steps to fix this

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 @.agents/skills/deployment/SKILL.md:
- Around line 128-131: Update the NVFP4 image-selection documentation to
explicitly describe the v0.20.0 aliases: unsuffixed and -cu130 tags select CUDA
13, while -cu129 selects CUDA 12; state that -cu130 was removed beginning with
v0.20.1. Keep the surrounding version rules unchanged.
🪄 Autofix (Beta)

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: 804c5763-4152-4d06-968a-c117e618b570

📥 Commits

Reviewing files that changed from the base of the PR and between 0764efe and c74f5e8.

📒 Files selected for processing (4)
  • .agents/skills/deployment/SKILL.md
  • .agents/skills/deployment/references/support-matrix.md
  • .agents/skills/evaluation/SKILL.md
  • .agents/skills/evaluation/recipes/examples/example_eval.yaml
🚧 Files skipped from review as they are similar to previous changes (3)
  • .agents/skills/evaluation/recipes/examples/example_eval.yaml
  • .agents/skills/deployment/references/support-matrix.md
  • .agents/skills/evaluation/SKILL.md

Comment on lines +128 to +131
> **NVFP4 on Blackwell B300/GB300 (sm_103) needs a CUDA-13 image.** From v0.20.0
> on, release tags are CUDA-13 unsuffixed (e.g. `vllm/vllm-openai:v0.26.0`) with
> `-cu129` the CUDA-12 opt-out; v0.19.x and earlier were the other way round
> (`-cu130` = CUDA 13), and `-cu130` no longer exists after v0.20.0. Don't trust

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.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- target section ---'
sed -n '105,155p' .agents/skills/deployment/SKILL.md

printf '%s\n' '--- references to v0.20.0 and CUDA tag rules ---'
rg -n -C 3 --glob '!node_modules' --glob '!dist' 'v0\.20\.0|cu130|cu129|CUDA-13|sm_103|B300|GB300' .

printf '%s\n' '--- repository status summary ---'
git diff --stat

Repository: NVIDIA/Model-Optimizer

Length of output: 13711


🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- target section ---'
sed -n '105,155p' .agents/skills/deployment/SKILL.md

printf '%s\n' '--- references to v0.20.0 and CUDA tag rules ---'
rg -n -C 3 --glob '!node_modules' --glob '!dist' 'v\.0\.20\.0|cu130|cu129|CUDA-13|sm_103|B300|GB300' .

printf '%s\n' '--- repository status summary ---'
git diff --stat

Repository: NVIDIA/Model-Optimizer

Length of output: 13482


🏁 Script executed:

#!/bin/bash
set -eu

python3 - <<'PY'
import json
import urllib.request
from urllib.error import HTTPError

base = "https://registry.hub.docker.com/v2/repositories/vllm/vllm-openai"

for tag in ["v0.20.0", "v0.20.0-cu130", "v0.20.0-cu129", "v0.19.2", "v0.19.2-cu130"]:
    url = f"{base}/tags/{tag}"
    print(f"--- {tag} ---")
    try:
        with urllib.request.urlopen(url, timeout=20) as response:
            data = json.load(response)
        print(json.dumps({
            "name": data.get("name"),
            "digest": data.get("digest"),
            "last_updated": data.get("last_updated"),
            "images": [
                {
                    "architecture": image.get("architecture"),
                    "os": image.get("os"),
                    "digest": image.get("digest"),
                    "variant": image.get("variant"),
                }
                for image in data.get("images", [])
            ],
        }, indent=2))
    except HTTPError as exc:
        print(f"HTTP {exc.code}")
PY

Repository: NVIDIA/Model-Optimizer

Length of output: 2463


🏁 Script executed:

#!/bin/bash
set -eu

for tag in v0.20.0 v0.20.0-cu130 v0.20.0-cu129 v0.19.2 v0.19.2-cu130; do
  printf '%s\n' "--- ${tag} ---"
  curl -fsSk "https://registry.hub.docker.com/v2/repositories/vllm/vllm-openai/tags/${tag}" |
    jq '{
      name,
      digest,
      last_updated,
      images: [.images[]? | {
        architecture,
        os,
        digest,
        variant
      }]
    }' || true
done

Repository: NVIDIA/Model-Optimizer

Length of output: 2071


🏁 Script executed:

#!/bin/bash
set -eu

for tag in v0.19.2 v0.19.2-cu130 v0.19.2-cu129 \
           v0.20.0 v0.20.0-cu130 v0.20.0-cu129 \
           v0.20.1 v0.20.1-cu130 v0.20.1-cu129 \
           v0.21.0 v0.21.0-cu130 v0.21.0-cu129 \
           v0.26.0 v0.26.0-cu130 v0.26.0-cu129; do
  printf '%s\n' "--- ${tag} ---"
  if json=$(curl -sSkf "https://registry.hub.docker.com/v2/repositories/vllm/vllm-openai/tags/${tag}"); then
    printf '%s\n' "$json" | jq -r '[.name, .digest, ([.images[]?.digest] | join(","))] | `@tsv`'
  else
    printf '%s\n' 'NOT_FOUND'
  fi
done

Repository: NVIDIA/Model-Optimizer

Length of output: 3166


🏁 Script executed:

#!/bin/bash
set -eu

repo='vllm/vllm-openai'
token=$(curl -sSk "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${repo}:pull" |
  jq -r .token)

for tag in v0.20.0 v0.20.0-cu130 v0.20.0-cu129 v0.20.1 v0.20.1-cu129; do
  printf '%s\n' "--- ${tag} ---"
  manifest=$(
    curl -sSk \
      -H "Authorization: Bearer ${token}" \
      -H 'Accept: application/vnd.oci.image.index.v1+json, application/vnd.docker.distribution.manifest.list.v2+json, application/vnd.oci.image.manifest.v1+json, application/vnd.docker.distribution.manifest.v2+json' \
      "https://registry-1.docker.io/v2/${repo}/manifests/${tag}"
  )

  printf '%s\n' "$manifest" | jq -r '
    if .manifests then
      .manifests[] | [.platform.os, .platform.architecture, .digest] | `@tsv`
    else
      ["single-manifest", .config.digest] | `@tsv`
    end
  '
done

Repository: NVIDIA/Model-Optimizer

Length of output: 343


Document the v0.20.0 tag aliases.

For exactly v0.20.0, both the unsuffixed tag and -cu130 are valid CUDA-13 aliases; -cu129 is the CUDA-12 variant. State that -cu130 was removed starting with v0.20.1. This prevents incorrect version-pinned image selection.

🧰 Tools
🪛 SkillSpector (2.4.4)

[warning] 191: [E1] External Transmission: Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Remediation: Verify the destination URL is trusted and necessary. Remove or replace with documented APIs. Ensure no secrets, tokens, or PII are transmitted.

(Data Exfiltration (E1))


[warning] 3: [EA2] Autonomous Decision Making: Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Remediation: Add human-in-the-loop confirmation for destructive, irreversible, or high-impact operations. Never auto-execute commands that modify files, send data, or alter system state.

(Excessive Agency (EA2))


[warning] 9: [EA2] Autonomous Decision Making: Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Remediation: Add human-in-the-loop confirmation for destructive, irreversible, or high-impact operations. Never auto-execute commands that modify files, send data, or alter system state.

(Excessive Agency (EA2))


[warning] 76: [EA2] Autonomous Decision Making: Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Remediation: Add human-in-the-loop confirmation for destructive, irreversible, or high-impact operations. Never auto-execute commands that modify files, send data, or alter system state.

(Excessive Agency (EA2))


[error] 191: [SC2] External Script Fetching: Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Remediation: Avoid downloading and executing remote scripts. Use trusted packages from PyPI/npm. If remote fetch is required, verify checksums and use HTTPS.

(Supply Chain (SC2))

🤖 Prompt for 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.

In @.agents/skills/deployment/SKILL.md around lines 128 - 131, Update the NVFP4
image-selection documentation to explicitly describe the v0.20.0 aliases:
unsuffixed and -cu130 tags select CUDA 13, while -cu129 selects CUDA 12; state
that -cu130 was removed beginning with v0.20.1. Keep the surrounding version
rules unchanged.

@cjluo-nv
cjluo-nv merged commit 55f1880 into main Aug 3, 2026
50 checks passed
@cjluo-nv
cjluo-nv deleted the chenjiel/vllm-cuda13-tag-convention branch August 3, 2026 17:01
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor
PR Preview Action v1.8.1
Preview removed because the pull request was closed.
2026-08-03 17:01 UTC

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants