The four dual/autoround-int4/nvlink-*.yml composes (nvlink-fp8-mtp, nvlink-turbo, nvlink-dflash, nvlink-dflash-noviz) and their vllm/dual-nvlink* launch slugs are removed. They were thin Docker Compose `extends:` stubs whose ONLY override was NVLINK_MODE=force_on — fully redundant since every base dual compose now auto-detects NVLink at boot via detect_nvlink.sh (NVLINK_MODE=auto): it probes nvidia-smi and flips on NCCL_P2P_LEVEL=NVL + custom-all-reduce when a bridge is present, else NCCL_P2P_DISABLE=1 + --disable-custom-all-reduce. NVLink rigs get the identical fast path from the base dual compose with no separate slug; force it explicitly with `NVLINK_MODE=force_on scripts/switch.sh vllm/dual` if auto-detect ever misses. Scope (prune only; no engine-image change — the v0.22.0 stable-engine consolidation is a separate follow-up): - delete 4 nvlink-*.yml composes - compose_registry.py: drop the 4 _entry blocks (50 -> 46 entries) - test-compose-registry-disk.sh: count guards 50/51 -> 46/47 - profile_runtime.yml + patches.yml: drop the 4 nvlink blocks/slug refs - test-profiles-compat.sh: retire the C13/E3 NVLink-required-compose scenarios (the estate NVLink-gating code is now dormant; cleanup tracked as a follow-up, code retained) - docs: switch.sh help, AGENTS.md, HARDWARE.md, UPSTREAM.md, patches/README.md, fp8-mtp/dflash/dflash-noviz compose headers, per-model CHANGELOG removal entry; add a docs/README.md pointer to `switch.sh --list` as the authoritative registry-derived compose x slug matrix Historical NVLink bench rows (JusefPol #31, danbedford #74/#92/#96) are preserved in BENCHMARKS.md. Full test suite green (the lone test-submit-bench failure is a worktree-isolation artifact — it needs gitignored results/rebench/ fixtures absent from a fresh worktree; passes on the working tree). Co-authored-by: noonghunna <10742901+noonghunna@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
6.3 KiB
Patches for Qwen3.6-27B on vLLM
This directory contains the model + engine-specific patches that compose variants apply at boot. As of 2026-05-05 (v7.72.2-uplift branch) the local-sidecar surface has shrunk significantly — Genesis v7.72.2 absorbed most of what we used to carry here.
Active patches
| Path | Used by | Purpose |
|---|---|---|
genesis/ |
every Genesis-loaded compose | Sandermage's genesis-vllm-patches tree (gitignored; checked out at the pin in scripts/setup.sh — currently 7b9fd319, v7.72.2) |
vllm-marlin-pad/marlin.py + MPLinearKernel.py |
every TP=2 compose with AutoRound INT4 | Vendored vLLM PR #40361 fix for Marlin GPTQ_MARLIN_MIN_THREAD_N=64 blocking sub-tile-N output dim shards |
local/qwen3coder_tool_parser_deferred_commit.py |
every Genesis-loaded compose | Local sidecar for the qwen3_coder tool parser SSE-silence bug — defers is_tool_call_started commit until <function= confirms within 64-char slack window. Filed at club-3090 issue #72 (originally reported by @troymroberts as P61c V2). Applied after apply_all in entrypoint. Drops out when vllm-project/vllm lands the canonical fix. |
carnice-chat-template.jinja |
dual/carnice-bf16mtp/bf16-mtp.yml only |
Patched chat template for Carnice-V2-27B's Hermes-style tool format |
Composes that load Genesis
7 composes currently bootstrap the Genesis tree + apply_all entrypoint:
single/autoround-int4/tq3-mtp.yml(single-card default, 48K ctx)dual/autoround-int4/turbo.yml(TP=2, TQ3 KV, MTP — daily-driver; NVLink auto-detected at boot)single/autoround-int4/long-text.yml(TP=1, 180K ctx, MTP)single/autoround-int4/long-text-no-mtp.yml(TP=1, 200K ctx, no MTP)single/autoround-int4/long-vision.yml(TP=1 with vision tower)single/autoround-int4/bounded-thinking.yml(TP=1, FSM bounded-thinking)single/autoround-int4/tools-text.yml(TP=1, 75K ctx, no MTP)
These same 7 composes also receive the qwen3coder_tool_parser_deferred_commit.py sidecar (see Active patches table above) since they all share the same entrypoint pattern.
Composes that do not mount Genesis (intentionally — Genesis-free fallback / different attention path / minimal config): dual/autoround-int4/fp8-mtp.yml (fp8 KV TP=2 — kept Genesis-free as a debugging fallback for cross-engine bisect), multi4.yml, multi4-dflash.yml, dual-dflash.yml, dual-dflash-noviz.yml, minimal.yml, carnice-bf16mtp.yml, qwopus-bf16mtp.yml. These composes do NOT currently receive the qwen3coder tool-parser sidecar — they have no entrypoint script to run it from. If you hit the <tool_call>-in-prose silent-drop bug on one of these composes, you can either (a) set --tool-call-parser hermes instead of qwen3_coder if your model template tolerates it, (b) add an entrypoint script following the dual-turbo.yml pattern, or (c) wait for the upstream vLLM fix to land. See issue #72 for context.
What was retired in v7.72.2-uplift (2026-05-05)
The following local sidecars were deleted because Genesis v7.72.2 natives supersede them:
| Retired sidecar | Genesis native that supersedes |
|---|---|
patch_inputs_embeds_optional.py |
PN35 (vllm#35975 backport, default-on since v7.69) |
patch_pn30_dst_shaped_temp_fix.py |
PN30 v7.68 dst-shaped temp (default-on since v7.69) |
patch_pn25_genesis_register_fix.py |
PN25 opaque-op pool (default-on since v7.66) |
patch_tolist_cudagraph.py |
P78 TQ tolist capture-guard (Sander explicitly noted in v7.72 CHANGELOG: "Deprecated external probes removed from 4 launch scripts; P78/PN14 supersede") |
patch_workspace_lock_disable.py |
PN34 workspace-lock relax (default-on since v7.66) |
patch_pr40798_workspace.py |
(negative-result research artifact, no compose ever mounted it) |
The dual-turbo bench on v7.72.2 with these sidecars dropped is within noise of the version that still mounted them: 81.21 vs 82.09 narr wall TPS, 108.20 vs 109.91 code wall TPS, VRAM 20.0 GB/card both ways. Genesis's natives carry the load.
vLLM PR #40361 — Marlin pad-sub-tile-n (still vendored)
What it fixes: Marlin's GPTQ_MARLIN_MIN_THREAD_N=64 blocks any W4A16 shard where per-rank out-dim falls below 64. Hits on Ampere SM 8.6 with AutoRound INT4 quants under TP=2.
Status: PR open at https://github.com/vllm-project/vllm/pull/40361, awaiting maintainer review. Until it lands, we vendor the patched files in vllm-marlin-pad/ and RO-mount them over the container's copies. No host filesystem dependency.
volumes:
- ../patches/vllm-marlin-pad/marlin.py:/usr/local/lib/python3.12/dist-packages/vllm/model_executor/kernels/linear/mixed_precision/marlin.py:ro
- ../patches/vllm-marlin-pad/MPLinearKernel.py:/usr/local/lib/python3.12/dist-packages/vllm/model_executor/kernels/linear/mixed_precision/MPLinearKernel.py:ro
When PR #40361 lands upstream, the entire vllm-marlin-pad/ directory + the four compose mount lines get deleted, and TP=2 composes just use upstream nightly. Drift recovery procedure documented in vllm-marlin-pad/README.md.
Genesis tree (genesis/)
Sandermage's genesis-vllm-patches — a runtime monkey-patcher for vLLM that fixes Qwen3-Next architectural bugs (hybrid TurboQuant gate, GDN streaming, MTP propagation, tool-parser edge cases, structured-output spec-decode timing, etc).
Setup:
- Cloned by
bash scripts/setup.sh qwen3.6-27bat the pinned SHA (currently7b9fd319= v7.72.2) - Override the pin via
GENESIS_PIN=<sha-or-tag>env var - Gitignored from this repo (we don't vendor someone else's tree)
- Pin-gate at boot enforces compatibility with the running vLLM version (allowlist-clean for both
0.20.1rc1.dev16+g7a1eb8ac2and0.20.2rc1.dev9+g01d4d1ad3; this branch ships the latter)
Cross-rig findings tracker
- PN59 streaming-GDN doesn't engage on chunked-prefill on Ampere consumer (1× RTX 3090). Eligibility check rejects calls with non-None
chunk_indices/chunk_offsets, which vLLM's--max-num-batched-tokens 4128always populates. Cliff 2b unchanged onlong-text.yml. Filed as Sandermage/genesis-vllm-patches#22 with reproducer + 4 fix proposals.