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