Commit Graph

4 Commits

Author SHA1 Message Date
noonghunna
eaa7a8c1ad docs+scripts: finish <quant>/ path migration across full repo sweep
Repo-wide follow-up to the compose quant-layer move (9821c94). The
mechanical move + registry/launch/test rewire covered the launchable
surface; a full-tree sweep found compose-path refs the move invalidated
in docs, two functional scripts, and one half-migrated mapping.

Functional fixes:
- bench-row-formatter.sh infer_compose_path(): 6 dual entries
  (int8-tq3, tq3-mtp-genesis, tq3-nomtp, tq3-mtp, int8, bf16) were left
  at bare dual/<file>.yml while the rest were migrated -> would emit
  dead compose paths into BENCHMARKS rows.
- residency-instrument/run-instrumented-soak.sh: case->COMPOSE_FILE
  paths (long-text, long-text-no-mtp, tools-text, dual default) now
  resolve under <quant>/.

Docs: README layout line + tree, engine/model READMEs, patch-README
quick-recipes, diagnostics, FAQ/CLIFFS/KV_MATH/DTYPE/MULTI/SINGLE/
STRUCTURED_COT/TQ3/UPSTREAM, issue template, sglang cross-refs
(-> vllm prod path). Per-model targets: qwen-vllm->autoround-int4,
llama-cpp->unsloth-q4km, gemma defaults (bf16-mtp/fp8-mtp),
carnice->own slug dir.

Intentionally left as historical/append-only records: CHANGELOG x2,
BENCHMARKS row-labels (live paths already correct in row bodies),
calibration source: provenance citations, switch.sh/parity history
comments. Separate follow-ups: gpu-mode.sh (#417 deprecated-repo
repoint), bench-row-formatter compose_display() docker-compose.yml
branch (PR-B). Flagged pre-existing-stale: dual/int8-tq3.yml in
pr40798/pr40914 READMEs (predate this refactor; ambiguous target).

Guard tests (registry-disk, mounts-resolve, switch-parity,
launch-compat) all PASS post-edit. Leak-clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 16:50:13 +00:00
noonghunna
b1b851318f sglang: park EAGLE-3 path for Qwen3-Next (MTP wins everywhere) (#176)
The SGLang+EAGLE-3 path for Qwen3-Next is parked. Three independent
findings, each sufficient on its own:

1. EAGLE-3 is sub-MTP for Qwen3-Next, even on Blackwell where it works.
   Ex0bit's own published numbers on the PRISM-PRO-DQ model card:
   native MTP = 121 TPS (1.51x) vs EAGLE-3 chain = 111 TPS (1.39x).
   The model family has a strong built-in MTP head; routing through
   an external drafter is structurally slower.

2. CUTE_DSL capture-hang on Ampere. SGLang v0.5.12's get_version() does
   pkgutil.walk_packages during cuda-graph capture, hits
   `cutlass.cute.experimental` which raises NotImplementedError under
   CUDA<13.1, and deadlocks against the locked capture stream. Three
   patch iterations (pre-import, sys.modules stub at engine init,
   per-process sys.modules stub at sglang/__init__.py) all failed —
   the walk re-fires during capture regardless of cache state. Workaround
   `--disable-cuda-graph` caps decode at ~15-18 TPS.

3. vLLM-MTP-dual already beats this path on the same rig. vllm/dual/turbo.yml
   delivers ~85 TPS on dual-3090; this SGLang path tops at ~15-18 TPS
   with the cuda-graph workaround.

Changes:

- docs/engines/SGLANG.md: status flipped from "experimental, validated to
  boot" to "PARKED 2026-05-21" with the 3-finding rationale.
- models/qwen3.6-27b/sglang/README.md: parking banner, full "Why parked"
  section, updated TL;DR statuses, expanded re-test triggers list.
- compose/dual/eagle3-experimental.yml: PARKED banner above the existing
  profile header. Internal config unchanged.
- compose/single/eagle3-experimental.yml: PARKED banner. Single-card never
  reached first forward pass (OffloaderV1 tied-weights bug); now both
  blocked AND structurally inferior.

The compose tree + vendored patches stay for archival reference. Re-test
triggers if SGLang ships MTP for Qwen3-Next OR upstream lands a CUTE_DSL
Ampere fallback.

Production paths for Qwen3-Next remain vllm/dual/turbo.yml and
llamacpp/mtp.yml — both MTP-based, both validated.

Co-authored-by: noonghunna <10742901+noonghunna@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 05:40:59 +05:00
noonghunna
941fa0644e sglang: experimental EAGLE-3 + Qwen3-Next dual-3090 path (Codex-led patch)
First validated SGLang + EAGLE-3 + Qwen3-Next AutoRound INT4 boot on
consumer Ampere. Dual 3090 (TP=2) boots cleanly and serves coherent output
with two vendored patches:

- patch_sglang_eagle3.py — provided by Ex0bit/Qwen3.6-27B-PRISM-EAGLE3,
  adds set_eagle3_layers_to_capture hook to Qwen3_5ForConditionalGeneration
- patch_sglang_autoround_fused_bf16.py — local fix for the AutoRound +
  Qwen3-Next loader bug (Codex-led 5h diagnosis). Root cause: SGLang's
  auto-round loader drops packed_modules_mapping, so fused linear_attn.in_proj_ba
  routes to GPTQ-Marlin instead of staying BF16. Was previously cached as
  "same kernel-pad bug as vLLM PR #40361" — wrong layer; this is name-mapping.

Composes:
- compose/single/eagle3-experimental.yml — boots past Marlin but blocked
  on SGLang OffloaderV1 tied-weights bug; kept as reference
- compose/dual/eagle3-experimental.yml — boots + serves; TPS/accept-rate
  pending prolonged bench

Critical Ampere caveats baked into the dual compose:
- --disable-cuda-graph (CUTLASS CUTE capture hangs on Ampere)
- --speculative-draft-model-quantization unquant (BF16 drafter must opt
  out of target's INT4 quant)
- --disable-custom-all-reduce (PCIe-only, per CLAUDE.md hardware truth)
- --kv-cache-dtype fp8_e5m2 (smallest practical KV on Ampere; SGLang's
  fp4_e2m1 falls back to slow un-fused dequant)

Docs rewritten:
- docs/engines/SGLANG.md — engine-level pros/cons + KV cache options
  + Ampere quirks (previously "blocked, watch list")
- models/qwen3.6-27b/sglang/README.md — quick recipe + validated vs
  not-yet-validated breakdown (previously "re-test pending")

Status: ⚠️ EXPERIMENTAL. Boots + serves coherent output verified
2026-05-20. TPS / accept-rate / quality 8-pack / verify-stress / soak
pending the next testing session.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 21:39:03 +00:00
noonghunna
3fa33332ce Initial commit — club-3090: model-agnostic LLM serving recipes for RTX 3090
Consolidates and supersedes:
  - noonghunna/qwen36-27b-single-3090
  - noonghunna/qwen36-dual-3090

The two predecessor repos partitioned by card count (1× vs 2×). This
repo partitions by engine instead, which matches how users actually
decide ("vLLM or llama.cpp?" before "1 card or 2"). Card count becomes
a config variant within each engine.

Structure (model-agnostic from day 1):

  docs/                       cross-model engine + hardware docs
    engines/                    vLLM / llama.cpp / SGLang comparison + per-engine deep dives
    HARDWARE.md                 Ampere SM 8.6+, NVLink, power, VRAM ceilings
    GLOSSARY.md                 plain-language definitions
    img/                        illustrations (vram-budget.svg)
    ARCHITECTURE.md             how this stack thinks about LLM serving on 24 GB

  models/<model-name>/        everything specific to a model
    qwen3.6-27b/                today's only model
      README.md / INTERNALS.md / USE_CASES.md / CHANGELOG.md
      vllm/                     vLLM-specific configs for this model
        compose/                  docker-compose files (single + dual variants)
        patches/                  tolist_cudagraph + Marlin pad notes
      llama-cpp/                llama.cpp recipes for this model
        recipes/                  shell scripts (single-card default + 262K max-ctx)
      sglang/                   SGLang status (currently blocked)

  scripts/                    shared, model-aware
    setup.sh                    bash setup.sh <model> → downloads + verifies
    verify.sh / verify-full.sh  smoke + functional tests
    bench.sh                    canonical TPS bench

vLLM compose variants (all under models/qwen3.6-27b/vllm/compose/):

  Single-card:
    docker-compose.yml              DEFAULT — TQ3 + Genesis P65, 48K, 51/68 TPS
    docker-compose.fast-chat.yml   fp8 + 20K, 55/70 TPS — fastest at small ctx
    docker-compose.tools-text.yml  fp8 + 75K, 53/70 TPS — best for long single prompts
    docker-compose.no-genesis-mtp.yml control variant
    docker-compose.minimal.yml     no spec-decode

  Dual-card:
    docker-compose.dual.yml              fp8 + 262K + MTP + vision, 71/89 TPS
    docker-compose.dual-turbo.yml       TQ3 + Genesis v7.14 — 4-stream concurrency
    docker-compose.dual-dflash.yml      DFlash N=5 + 185K + vision — 78/128 TPS
    docker-compose.dual-dflash-noviz.yml DFlash + 200K text-only

llama.cpp recipes (under models/qwen3.6-27b/llama-cpp/recipes/):

  single-card-default.sh    Q4_K_M + 65K
  single-card-max-ctx.sh    Q4_K_M + q4_0 KV at full 262K — the standout recipe

Old repos remain readable for issue history + external links (Medium,
Reddit, Twitter, Sandermage's PR threads). New issues should be filed
here.

Credits in README. Apache 2.0.
2026-04-28 10:24:14 +00:00