Qwen3.8 Flash Next on 2x 8 GB (vektorprime PP2)
More actions
| Reported 2 x 8 GB | |
| Quant | AWQ INT4: cyankiwi/Qwen3.8-Flash-Next-AWQ-INT4; 95 GiB BF16 PLE table in host RAM (FP8 table optional) |
|---|---|
| Engine | vLLM nightly + PR #53899 (a5530b9) + the repo's patch scripts 0.1.dev1+ga5530b90c.d20260829 |
| Topology | PP2 with PLE CPU offload |
| Context | 262,144 |
| Decode | 75.4 tok/s |
| VRAM per card | 64 GiB; weights PP0 39.48 GiB, PP1 45.53 GiB; --gpu-memory-utilization 0.9 |
| Flags | --pipeline-parallel-size 2 --max-num-seqs 8 --mamba-cache-mode align --mamba-ssm-cache-dtype float32 --speculative-config mtp --enable-prefix-caching --async-scheduling; VLLM_PLE_CPU_OFFLOAD=1, VLLM_GDN_DECODE_KERNEL=triton, PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True |
| Tested | @vektor_prime on 2026-08-29 |
| Source | link |
| Confirmations | None yet. |
A build recipe and vLLM patch set that serves an AWQ INT4 Qwen3.8-Flash-Next on two 64 GB cards with pipeline parallel 2 plus PLE CPU offload, a combination upstream vLLM refuses in six places. The author avoids TP2 because these cards sit on slow PCIe lanes and TP all-reduce dies there. Later parts add prefix-caching fixes, an FP8 PLE table, a deterministic-MoE patch and sampled MTP drafting; the author's production moved to PP3 (two 64 GB cards plus a 40 GB card). Infobox decode is single stream with MTP k=1. Source: repo github.com/vektorprime/qwen38-flash-next-pp2 by vektorprime on GitHub, posted by @vektor_prime, 2026-10-07
Prerequisites
- Two GPUs with at least about 48 GiB each (two CMP 170HX at 64 GiB; Driver unlock, 8 GB card).
- At least about 110 GiB of free host RAM for the PLE offload (author ran 178 GiB), about 250 GiB of disk for the HF cache (174 GB, 38 shards), Docker with the NVIDIA Container Toolkit, a Hugging Face token for the checkpoint (passed as a file, never stored).
Source: repo github.com/vektorprime/qwen38-flash-next-pp2 by vektorprime on GitHub, posted by @vektor_prime, 2026-10-07
Steps
git clone https://github.com/vektorprime/qwen38-flash-next-pp2 && cd qwen38-flash-next-pp2
docker build -t qwen38-flash-next-pp2:latest -f Dockerfile .
bash scripts/launch.sh /path/to/hf_token.txt
- The Docker build must print exactly 23 "patched" lines (11 from
patch_pp.py, 12 frompatch_p0.py). Any "WARNING ... pattern not found" means the PR head moved and the image is unsafe. - Launch (
scripts/launch.sh, port 8001):--pipeline-parallel-size 2 --gpu-memory-utilization 0.9 --max-num-seqs 8 --mamba-cache-mode align --mamba-ssm-cache-dtype float32 --speculative-config '{"method":"mtp","num_speculative_tokens":3}' --enable-prefix-caching --async-scheduling --reasoning-parser qwen3 --tool-call-parser qwen3_coder; envVLLM_GDN_DECODE_KERNEL=triton VLLM_BT_POOL=5 PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True CUDA_DEVICE_ORDER=PCI_BUS_ID; Docker--ipc=host --shm-size=96g. - The PLE table lives on exactly one layer (
language_model.model.layers.1.ple), which always lands on PP rank 0, so the upstream PP=1 restriction is a set of guards, not an architectural limit; the six patch sites remove them.
Source: repo github.com/vektorprime/qwen38-flash-next-pp2 by vektorprime on GitHub, posted by @vektor_prime, 2026-10-07
Measured numbers
- Verified 2026-08-29: KV cache 1,196,679 tokens (14.97 GiB), 4.56x concurrency at full context; cold start about 9 minutes.
- MTP on PP2 with AWQ INT4: k=1 gives 75.4 to 75.8 tok/s single stream against 58.1 to 58.6 without MTP (+29%); k=3 gives 64 to 65 tok/s (+11%). Per-position acceptance 0.61 / 0.40 / 0.22, so the author recommends k=1 (a later part validates k=2).
- FP8 PLE table (
VLLM_PLE_FP8_TABLE=1): host RAM for the table 96.8 to 48.4 GiB; KLD against BF16 0.0163, top-1 95.98%. Production went back to the BF16 table on 2026-10-02. - On the PP3 rig: batch-invariance stack 73 tok/s decode; sampled MTP drafting raised accept length 2.354 to 2.806 and decode 52.5 to 61.9 tok/s.
Source: repo github.com/vektorprime/qwen38-flash-next-pp2 by vektorprime on GitHub, posted by @vektor_prime, 2026-10-07
Known issues
PYTORCH_ALLOC_CONF(wrong name) is silently ignored; the allocator then runs non-expandable and weight-load fragmentation kills a worker at about 41 of 63.5 GiB with 22 GiB "free".- "No CUDA GPUs are available" with a healthy
nvidia-smiis usually a--restart alwayscrash loop holding the card:docker rm -f, confirm 0 MiB, relaunch. - MTP plus PP2 deadlocks in warmup (NCCL BROADCAST 600 s timeout) without the zebgop-ops
pp_utils.pydraft relay. - PP + MTP + prefix caching + mamba align degenerates into repeated tokens ("duct duct duct") from all-NaN logits after a few dozen 8-way requests without patch P0-0010; patches 0011 and 0012 together fix cross-request state bleed (never ship 0011 alone; do not apply 0008-WITHDRAWN).
moe_align_block_sizeGPU atomics made repeat runs differ (top-1 differs at 3.6% of positions); patch 0015 (VLLM_MOE_DETERMINISTIC_ALIGN, default on) costs 4 to 6 us per MoE layer.- Pinned to PR #53899 at a5530b9 and breaks when the PR head moves. Several images are made by
docker cpanddocker commit, so the production lineage is not reproducible from one build. No license file.
Source: repo github.com/vektorprime/qwen38-flash-next-pp2 by vektorprime on GitHub, posted by @vektor_prime, 2026-10-07
Related
Sources
- Repo: vektorprime/qwen38-flash-next-pp2 (no license file), last commit 2026-10-02. Depends on zebgop-ops/qwen38-flashnext-pp. Discord handle Ryko.