Skip to content

At ctx=32768 --max-num-seqs 32 our engine consumes ~108 GB during load and never serves; vLLM and SGLang both serve there #1963

Description

@localai-bot

At the context ceiling both vLLM and SGLang reach on this box, our engine cannot load. It consumes ~108 GB of unified memory during load and is killed before serving a single request.

Measured

Box: dgx:gpu0 (GB10, 119 GB unified), idle, under an rc lease, 114 GB available at launch.
Build: integ2/1574 @ ba3dd7cb4 = main + #1929 + #1930 + #1932 + #1952, clean CUDA build for sm_121a with -DVLLM_CPP_CUTLASS_FETCH=ON. Artifact-gated before timing: flash_fwd=1792, SpecDecodeFA2Bf16=1, CUDA FA2 compiled-arch manifest: [121a].
Launch: --max-model-len 32768 --max-num-seqs 32 --kv-cache-memory 6GiB --no-enable-prefix-caching --speculative-config '{"method":"dflash","model":"/draft","num_speculative_tokens":8}'
Checkpoints: r0b0tlab/Qwen3.8-27B-NVFP4-MTP-sm121 target, qwen3.8-27b-dflash2 draft.

Memory, sampled once per second by the watchdog:

07:38:10 avail 36 GiB
07:38:11 avail 21 GiB
07:38:12 avail 13 GiB
07:38:13 avail 10 GiB
07:38:14 avail  7 GiB   -> BREACH, container killed

From 114 GB to 7 GiB. The last 29 GB went in three seconds. Had the watchdog not fired, this is an OOM reboot — the same failure that took this box down for 5h45m earlier the same night.

Where it dies

The captured server log ends immediately after the draft loads and shares its embedding table:

vllm.cpp: DFlash draft loaded from safetensors /draft (k=8, taps=5, mask=248070, vocab=248320, shared head from the target safetensors shards)
vllm.cpp: DFlash draft embed SHARED with the target (one device copy, 2542796800 B saved)

So the collapse is after the embed dedup (#1946/#1952) has already saved its 2.54 GB, and before the server reports healthy. It is not the embedding table.

Why this matters

vLLM and SGLang both loaded and served at exactly these settings, and both were probed at 32768 surviving three sequential ~15,858-token prompts at 512 output tokens. Their ceilings are recorded as 32768. Ours does not reach the starting line, so the #1574 three-engine comparison currently has no ours row at the context both competitors reach.

Not yet attributed — candidates, in order

  1. The DFlash2 draft context store, which has never run on a device. fix(SPEC-DFLASH2): a >4K-token prompt killed EngineCore, because the draft context store was 4096 slots no matter what max_model_len said (#1919) #1932 replaced a 4096-slot constant with a resolution from max_model_len capped by an 8 GiB aggregate budget, divided by max_num_reqs. Its own spec records that budget as gated on CPU arithmetic only. This run is the first device exercise of that path. At the published draft geometry (5 layers, Hkv 4, head_dim 256 ≈ 20 KiB per context token) an uncapped store would want 32768 x 32 x 20 KiB ≈ 21.5 GB — large, but not 108 GB on its own.
  2. Something scaling with max_model_len x max_num_seqs outside the store and outside --kv-cache-memory, which was set explicitly to 6 GiB and therefore is not the KV cache.
  3. DevicePool retention: the pool never returns a block to the driver and device_pool_cap_bytes is 0 (uncapped) on every platform, so any transient during load stays resident. That converts a spike into a floor but does not by itself create one.

Owed

Filed from an operator GPU session; the watchdog killed the container rather than letting the box reboot, so the box is healthy and the evidence above is complete.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions