Procházet zdrojové kódy

upstream issue descriptions: b12x eh_proj loader + DFlash2 dtype (retired in sparkring, native MTP is the path); 386B capacity note

Alexander Korolev před 1 měsícem
rodič
revize
0d7c9f334e
1 změnil soubory, kde provedl 105 přidání a 0 odebrání
  1. 105 0
      specs/tech-architecture/upstream-issues-2026-09-09.md

+ 105 - 0
specs/tech-architecture/upstream-issues-2026-09-09.md

@@ -0,0 +1,105 @@
+# Upstream issue descriptions — 2026-09-09
+
+Draft for the b12x / vLLM fork owner (voipmonitor / local-inference-lab family).
+Context: we run the b12x fork stack on 2x/4x DGX Spark (DGX GB10), pinned
+builds (r27: vLLM `63a82f8d` / b12x `e8ad299b` / LMCache `822330db`;
+r28: vLLM `62f6385c` / b12x `7216f6b9` / LMCache `934c287a`), RoCEnante ON,
+GLM-5.3-Flash-NVFP4-Spark (184 GB) as the production model, seed-42 hardmode
+tool-eval bench (176-pt scale).
+
+Framing (per operator): the fork side regularly reports the stack "alive and
+breathing" — and it is: the **current** sparkring production path (native
+MTP3, dual-domain NCCL / mesh, instanttensor loader) does not touch either
+blocker below. Both blockers only appear when we combine **b12x O_DIRECT
+loader** + **DFlash2 drafter** on the r27/r28 base. Both are therefore
+integration/feature-port questions, not "your stack is broken" reports.
+
+---
+
+## 1. b12x O_DIRECT loader: `eh_proj.weight` not in the pool allocation plan
+
+**Symptom** (r28, `--load-format b12x`, GLM-5.3-Flash-NVFP4-Spark, 4x TP4/DCP4):
+
+The O_DIRECT loader itself works — 44 shards streamed, 92.6 GB physical per
+node at ~1.5 GB/s (404 s), 40.07 GiB into write-combined shared storage. It
+dies at the very last routing step:
+
+```
+ValueError: checkpoint destination was not allocated as a weight:
+  model.language_model.layers.45.eh_proj.weight
+  (b12x/loader/_checkpoint.py:370)
+```
+
+`eh_proj` is the GLM-5.3 (Step-3.5-MTP family) extra-head projection linear —
+present on every GLM-5.3 layer, absent from the pool allocation plan that
+`_checkpoint.py` builds. Everything else (attention, MoE, MLP, embeddings,
+the MTP head) routes fine; this one name is missing from the plan.
+
+**Repro**: any GLM-5.3-Flash recipe with `--load-format b12x` (we keep a
+pinned test recipe: `glm53-flash-r28-4x-dcp4-b12xload`).
+
+**Impact / our mitigation**: zero for us today — we serve GLM-5.3 with
+`--load-format instanttensor` (the default path, works, same model quality).
+The b12x loader matters only if the fork wants GLM-5.3 on the O_DIRECT path
+(lower host RAM pressure, faster shard streaming). If the allocation plan is
+data-driven from the checkpoint config, adding the `eh_proj` linear to the
+plan is likely a small fix; if it is a hardcoded per-architecture list, the
+GLM-5.3 `GlmMoeDsaForCausalLM` entry needs that extra projection.
+
+---
+
+## 2. DFlash2 drafter: bf16-KV wiring exists in the JJ R8 build, not in r27/r28 base
+
+**Symptom** (r27 and r28, 2x or 4x, DFlash2 drafter enabled):
+
+```
+ValueError: No valid attention backend found for
+  kv_cache_dtype=fp8_ds_mla, use_mla=False, block_size=256
+```
+
+Root cause (verified in the r28 source, `vllm` `62f6385c`):
+
+- The DFlash drafter (`qwen3_dflash.py:200`) inherits its KV dtype from the
+  engine-wide cache config (`get_kv_quant_mode(self.kv_cache_dtype)`); the
+  GLM-5.3 engine runs `fp8_ds_mla`.
+- The DFlash attention backend
+  (`vllm/v1/attention/backends/dflash_attn/__init__.py:219,227`) hard-requires
+  bfloat16: `q and out must be bfloat16`, `K and V caches must be bfloat16`.
+- r28's `fa4720ea` ("restore GLM boundaries across DCP and DFlash groups")
+  fixed the prefix-cache/boundary logic across DCP/DFlash groups but not the
+  dtype constraint.
+
+**The sparkring reference that proves it is solved elsewhere**: the (now
+retired) `JJ R8` GLM-5.3 TP4/DCP4 profile ran exactly this combination —
+FP8 KV (24 GiB/rank) **plus** the BF16 DFlash2 draft
+(`incoai/GLM-5.3-Flash-DFlash2`, depth 7) — on `local-inference-lab/vllm`
+`dev/jovian-judgement` (public tag `sparkring-glm53-flash-gb10-e02b1746`,
+commit `e02b1746`) + `voipmonitor/b12x` @ `9ae41c5c`. So a per-drafter
+bf16-KV path (or an fp8-capable DFlashAttention) **exists in the JJ R8/R10
+line** and simply was not carried into the r27/r28 base.
+
+**Framing question for the owner** (this decides whether there is any work):
+
+sparkring's current production GLM-5.3 profiles are **native MTP3** (the
+in-checkpoint MTP head — which is what our r27/r28 production already runs,
+MTP k=5), and the DFlash2 profile was **retired** in the README in favor of
+it. If native MTP is the long-term path, the DFlash2 dtype wiring is a
+non-issue for r27/r28 (we keep DFlash2 recipes as reference only and stop
+chasing it). If DFlash2 is still wanted (e.g. for the 386B full model where
+MTP may not be in-checkpoint), then the request is a feature port: bring the
+JJ R8 per-drafter bf16-KV wiring (or the fp8-capable DFlashAttention) into
+the r27/r28 base — a port from a known-good sibling build, not a new
+design.
+
+---
+
+## 3. Reference: 386B full model (GLM-5.3-NVFP4-Spark, 406 GiB) — capacity, not a bug
+
+Not an issue report — context for the owner if they are asked about the
+full model on Spark clusters: on 4x DGX Spark (121.63 GiB HBM/node) the
+weights alone are 101.5 GiB/node; vLLM's restart-on-OOM doubles the load
+pass and the nodes go into an unrecoverable OOM-thrash (verified; HA power
+cycle required). 5-6+ nodes is the physical requirement. DFlash2 would make
+it *worse* (a drafter adds memory, it does not save it), and no DFlash2
+variant of the 386B model exists on HF — DFlash2 checkpoints are 1.3 GB
+draft models for the 184 GB Flash model only.