Skip to content

geniex serve crashes with dspqueue_read failed: 0x00000072 on requests with a system message #1186

Description

Describe the bug

On the GPU/GGUF backend (llama.cpp + ggml-hexagon DSP offload), geniex serve crashes the entire server process at the first DSP dispatch when a /v1/chat/completions request contains a system-instruction message. Crash signature:

ggml-hexagon.cpp:2233: ggml-hex: dspqueue_read failed: 0x00000072

Isolation results (each trial on a fresh serve):

  • Trigger is the system message, not the output language — a preamble request with English output still crashes; a bare user request with Chinese output does not.
  • Not max_tokens / output length — a bare request generating 277 tokens survives; a preamble request generating 1 token crashes.
  • geniex infer on the same GPU/weights/DSP works at the same moment → fault is specific to the serve chat path, not the device.
  • NPU (qairt) backend is unaffected.
  • The crash kills the whole process; the offending POST never reaches the GIN access log.

To Reproduce (run on the serve host, fresh GPU/GGUF serve, unsloth/Qwen3-4B-Instruct-2507-GGUF:Q4_0)

  1. Crashing request — WITH system message:
    {"model":"unsloth/Qwen3-4B-Instruct-2507-GGUF:Q4_0","messages":[{"role":"system","content":"You are a professional translator. Translate the user English text into Chinese. Output only the translation."},{"role":"user","content":"The quick brown fox jumps over the lazy dog near the riverbank."}],"max_tokens":64,"temperature":0}
  2. Serve prints dspqueue_read failed: 0x00000072 and the process exits.
  3. Control — bare user request, no system message (succeeds):
    {"model":"unsloth/Qwen3-4B-Instruct-2507-GGUF:Q4_0","messages":[{"role":"user","content":"Translate into Chinese: The quick brown fox jumps over the lazy dog."}],"max_tokens":64,"temperature":0}

Note: the serve oscillates between a healthy window (requests succeed) and a fragile one. The system-message discriminator is deterministic within a fragile window; if step 1 succeeds on the first shot, repeat it until the serve drifts fragile.

Expected behavior

geniex serve should handle a request containing a system message without crashing — as geniex infer does. A bad request should at most return an HTTP error, never terminate the server.

Serve-side crash log

[GIN] 200 | GET "/v1/models"
[GIN] 200 | GET "/v1/models"
ggml-hexagon.cpp:2233: ggml-hex: dspqueue_read failed: 0x00000072

(The crashing POST /v1/chat/completions is absent — the process dies before the access-log line.)

Environment

  • OS: Windows on ARM, build 28000 (Snapdragon)
  • GenieX CLI: v0.3.14
  • QAIRT Runtime: v2.45.0.260326
  • LlamaCPP Hash: be4a6a6
  • Backend (crashing): GPU / GGUF (ggml-hexagon DSP offload); NPU/qairt unaffected
  • Model: unsloth/Qwen3-4B-Instruct-2507-GGUF (Q4_0)

Additional context

Suspected DSP-queue lifecycle issue on the serve dispatch path (stale/leaked dspqueue handle across the model destroy+reload cache, or a DSP init race). Evidence of a time-varying state: one serve logged 17 consecutive successes → 35 consecutive crashes → 6 successes, same process, no restart; a machine reboot did not reliably clear it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions