Skip to content

Engine aborts itself every 60 s during a prompt prefill: 24 stall reports in 10 days (0.1.44.1, 0.1.45, 0.1.48), 23 minidumps attached #3979

Open

Description

@Wanderingss

Title: Engine aborts itself every 60 s during a prompt prefill: 24 stall reports in 10 days (0.1.44.1, 0.1.45, 0.1.48), 23 minidumps attached

Hi - this is a Windows/RTX 4090 box running 0.1.48 (CUDA 13 build) on Qwen3.8-Flash-Next UD-Q4_K_XL. Since
2026-10-15 the issue #29 watchdog has fired 24 times: 1 on 0.1.44.1, 14 on 0.1.45, 9 on 0.1.48, so it
is neither new nor fixed by the upgrade. Twenty-three minidumps are attached (md5 in the description below).

What the stall always looks like - the only two things true in all 24 reports:

strata serve: no progress for 60 s during a request (reading the prompt (batched): layer 1 of the prompt
    chunk from token 241482) - stopping the engine so the server starts it again (issue #29)
strata serve: stall report (engine 0.1.48): ... for 60 s; 0 layers served since the last beat
  expert pool: epoch 100, batch epoch 100: 48 of 48 jobs claimed, 48 done; 15 of 15 workers parked, 15 sleeping
  memory: 75978 MiB resident, 105141 MiB committed, 19384 MiB RAM available; 42340014 page faults so far
2 s later:
  expert pool: epoch 100, batch epoch 100: 48 of 48 jobs claimed, 48 done; ... 42345784 page faults so far
strata: released the verify window's GPU waits (#267): the GPU finished in 0 ms
  • 0 layers served since the last beat in 24 / 24,
  • and the expert pool: line is identical in the two samples 2 s apart in 24 / 24 - the epoch never
    advances, so no new layer work is being claimed, while the GPU reports nothing pending.

Two shapes. (A) 10/24 report the GPU rang 0 and 0 of 0 jobs claimed in 8 of them; 9 of all 24 have no
completed prompt in that process at all
- the engine dies on the first prompt it ever computes, aged 3-14
min. (B) 14/24 report the GPU rang 48 after up to 56 h of good service, with the last verify window at
positions 252 ... 421,121 tokens.

Already ruled out (numbers in the report): not commit space (19-22 GiB RAM available, 105-106 of 223.8 GiB
committed at death); not the RAM conversation cache (9 kills happened with --conversation-cache-mib 0 and
zero cache lines in those runs); not the MTP/verify path (shape A never ran a window); not a full card as a
cause (VRAM free when this request began was 0 MiB in only 2 of 24 - though 10 were under 1 GiB); and not a
context limit, because it is not deterministic: the same engine served a 438,055-token prompt at 2,115
tok/s minutes before stalling at chunk from token 151370 of a 315,199-token conversation, and after a
restart the same binary/config read 308454 = 36682 reused + 271772 read in 263446 ms and generated 5,496
tokens without stalling.

Three questions:

  1. Between 48 of 48 jobs claimed, 48 done for the layer and layer N served, what is the prompt loop
    waiting on?
    In every one of these 24 dumps the CPU pool shows the last epoch fully done and unchanging,
    the GPU has nothing pending, and the layer counter never moves. The stacks should name it - could someone
    symbolise strata-stall-47896.dmp and strata-stall-50560.dmp (0.1.48) first?

  2. Does the [gfx1200, 2x RX 9060 XT layer split] prompt-read stalls (watchdog #29 aborts) + run-to-run prefill degradation: fresh prompts slow 3-4x mid-run, file tier re-reads 24-35 GB per request #1407 allowance ever engage on Windows in 0.1.48? It printed 3 times in 24 and the process
    died 11-16 s later each time (71/76/72 s without a step) although the line promises up to 600 s. For those
    three that is explicable - their fault rate was 8-12/s, and PageFaultCount >> 3 is then 1-2/s, below the
    a >= io_last + 16 gate. But kill 34218 (2026-10-24 22:51:41) reports 5,770 page faults in the 2 s
    between its own two samples
    - about 360/s after >>3, comfortably over the gate - and printed no
    allowance line before aborting. Is file_tier_activity() on Windows actually reading the process's page
    faults in 0.1.48, or only IO_COUNTERS.ReadTransferCount?

  3. Is the --vram-reserve-mib reserve accounted before or after the VRAM free when this request began
    reading?
    Two requests started at 0 MiB free with --vram-reserve-mib 1800 set, and the report's own text
    says a card that full can page GPU memory to system RAM.

Why this costs a lot here: the abort is the recovery, not the problem - serve restarts the engine in
66-82 s - but the empty prompt cache afterwards forces the client to re-read the whole conversation cold
(421534 = 0 reused + 134986 of 421534 read in 216498 ms), which is the path that hangs again. So one hang
turns into a burst: 14:30, 14:34, 14:42 and 22:30, 22:42, 22:51 on 2026-10-24.

Attachments (md5 list and the exact config are in the campaign folder described below): 23 minidumps,
442-465 KB each, strata-stall-<pid>.dmp, 2026-10-20 to 2026-10-24; the full verbatim text of all 24 stall
reports; a per-report table of the fields above; and a 2 s sampler CSV that caught one death (commit 151.5 to
119.7 GiB in a single sample).

Machine: Windows 11 build 26300, i9-14900KF (no AVX-512), 128 GiB RAM, RTX 4090 24 GiB (driver 616.92) with a
desktop full of GPU contexts, plus a GTX 1660 Ti for strata-vision.exe. Engine md5
1984bc5ee7049a118dd63ca04e53ff7f. Config = 38 arguments: --max-context 524288 --kv int8 --kv-resident 32768 --expert-cache 4608 (per layer) --pcie-frac 0.0 --vram-reserve-mib 1800 --ple-io direct --conversation-cache-mib 0 --mtp .../mtp/rt --spec 4 --spec-min-p 0.5; STRATA_WATCHDOG_S /
STRATA_WATCHDOG_IO_S unset (defaults 60 s / 600 s); engine env also carries STRATA_MMQ_KQ=1 STRATA_HC_Q8=1 STRATA_ADAPT_OVERLAP=1 STRATA_PREFILL_STREAM_MIN=4096 STRATA_PREFILL_CPU_SHARE=auto STRATA_MMVQ_IL=0.

Full method, per-report tables, every count and the limitations (no debugger, so no symbolised stack here) are
in bench/results/2026-10-24-win4090-prefill-hang-0148/README.md.

strata-stall-44072.dmp
strata-stall-44600.dmp
strata-stall-46592.dmp
strata-stall-47144.dmp
strata-stall-47896.dmp
strata-stall-50560.dmp
strata-stall-51160.dmp
strata-stall-55896.dmp
strata-stall-56292.dmp
strata-stall-57008.dmp
strata-stall-2172.dmp
strata-stall-3216.dmp
strata-stall-6004.dmp
strata-stall-14112.dmp
strata-stall-19548.dmp
strata-stall-23080.dmp
strata-stall-26072.dmp
strata-stall-27212.dmp
strata-stall-38416.dmp
strata-stall-38696.dmp
strata-stall-40064.dmp
strata-stall-40948.dmp
strata-stall-43024.dmp

Activity

  1. github-actions commented on Oct 24, 2026

    @github-actions

    Thanks for the issue. To keep the tracker readable, every item needs an area prefix in the title and the parts of the issue form filled in. This one is missing:

    • Start the title with its area: [Engine], [GUI], [TUI], [Benchmark], [Docs] or [Other], then a short description. Example: "[Engine] decode stops after 2 minutes".

    Edit the issue (title and description) and this note goes away on its own. If it is still missing parts in 5 days it will be closed, which is not a rejection: fix it and comment /reopen.

    Details: CONTRIBUTING.md

  2. PiccataPro commented on Oct 26, 2026

    @PiccataPro

    Still reproduces on 0.1.50

    Two RTX 3080 20 GiB (GA102-200, PCI 10de:2206), Windows 11 WDDM, driver 610.88 (CUDA UMD 13.3), 128 GiB.
    VERSION file says 0.1.49.1, commit c33fa7ba; the stall headers self-report 0.1.48 (Oct 24) and 0.1.50 (Oct 25/26).

    Four watchdog kills in ~4.2 days (2026-10-24 → 10-26), 4,683 requests served. Same invariant you found: 0 layers served since the last finished step in 4/4, and host idle for 61594 / 170900 / 64134 / 68699 ms.

    A distinction I have not seen in the other reports: they split 2 + 2 by an independent signal

    When Stage nvlddmkm events within ±60 s
    10-24 (instance 15:13:52) layer 1 of the prompt chunk from token 16384 0 — the entire day has zero
    10-24 (instance 19:21:22) layer 1 of the prompt chunk from token 16384 0 — the entire day has zero
    10-25 23:39 layer 23 of the prompt chunk from token 41812 208, all at 23:39:38
    10-26 13:56 layer 23 of the prompt chunk from token 63642 141 at 13:56:14, +7 ID-153 at 13:56:33–39

    Clean 4/4 in both directions. So these are two different bugs sharing one symptom:

    Class A (layer 1, ×2) — disk, not GPU. The engine warns about exactly this at every start:

    --ple-io direct measures slow here (313 rows/s, about 1 MB/s of random 4 KiB reads):
    a prompt can spend minutes reading layer 1 and trip the stall watchdog (#1425, #1629)
    

    Recorded across restarts: 313 / 333 / 3756 / 3914 / 4401 / 4608 / 4670 / 4734 / 5682 rows/s (1–23 MB/s). The drive is a DRAM-less ZHITAI Ti600 with 170 GB free of 932 (82% full). Both stalls land on token 16384, exactly the --prefill auto:16384 chunk boundary. I have not tried --ple-io mmap yet.

    Class B (layer 23, ×2) — GPU. This is the one that matters for #3979.

    Supporting your "not a full card" conclusion

    • Allocation failures in the whole log: 0 (out of memory / cudaErrorMemoryAllocation / failed to allocate / insufficient memory — four patterns, zero hits).
    • Free VRAM at the time: nvidia-smi 1,254 / 1,456 MiB; the engine's own figures at load 825 MiB (CUDA0) / 637 MiB (CUDA1).
    • The prompt-path scratch is carved out before the request, not during it: 6.72 GiB borrowed per card from the expert cache (2,295 / 2,305 of 4,276 slots), verify windows 96.2 MiB × 2, MTP head 275.7 MiB, --pipeline-windows 2 reserve 272 MiB.

    Answering your question 3 about --vram-reserve-mib

    On this box VRAM free when this request began: 683 MiB appears byte-identically in all four stall reports — including the two with zero GPU involvement. It is a comparison against --vram-reserve-mib 1024, which this config has never met (it loads at 637–825 MiB), and the companion line WARNING: only … MiB of VRAM free at the start of this request (below 1024 MiB) fires 72 times in this log. I read it as a standing condition, not a discriminator, and I would not use it as the reserve accounting you are probing for.

    Cross-link to #3801: same hand-off, same driver signature

    #3801 (--pipeline-windows 2, RTX 3080 Ti + V100, Windows/WDDM) is the closest match and it is currently closed without a fix. Three things line up exactly:

    1. Their correlated events: "nvlddmkm IDs 13, 14, and 153" — identical to ours.
    2. Their V100 went to Device Manager Code 10 (STATUS_INSUFFICIENT_RESOURCES) and vanished from nvidia-smi. On 2026-10-26 11:57 we got the escalated version of that same state: a 0x116 VIDEO_TDR_ERROR with parameter 3 = 0xC000009A (STATUS_INSUFFICIENT_RESOURCES), preceded by ggml_cuda_init: failed to initialize CUDA: no CUDA-capable device is detected after a 53-token prompt degraded to 2.5 tok/s.
    3. Their narrowed arm: "the earliest narrowed hang was after all 22 CUDA0 layers in the final stage-0 D2H hand-off followed by cudaStreamSynchronize(m.cs)". With --layer-split 23 the CUDA0 stage is exactly layers 0–22, so our layer 23 stall is the same hand-off seen from the other side — we never see layer 23 start, they never see the stage-0 copy finish.

    Both of us run --pipeline-windows 2. #3801's reporter disabled pipelining in production. Given how cheap the test is: is dropping --pipeline-windows 2 still the recommended mitigation on Windows/WDDM for a two-card split, or does 0.1.50 contain work that makes the pipelined hand-off safe?

    Artifacts

    • strata-stall-18080.dmp — 2026-10-26 13:57, 26,459 bytes
    • strata-stall-12868.dmp — 2026-10-25 23:40, 26,459 bytes (identical size)
    • C:\Windows\Minidump\102626-10390-01.dmp — the 0x116
    • Full engine log (4.1 MB) on request

    Two notes for whoever triages: across 3 faults in 4,683 requests, every one is in a data-movement / dequantisation kernel (copy_i32 ×2, iq_dequant_gu_f16 ×1), never in a math kernel. And one earlier instance (2026-10-25 21:09) died with two faults in a row (copy_i32: illegal memory access then iq_dequant_gu_f16: illegal memory access) without ever tripping the 60 s watchdog — a context-wide failure rather than a wedge.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-formatTitle or template does not follow CONTRIBUTING.md yet

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions