Summary
After merging the dense-balanced RKNPU placement fixes from PR #3, the original llama-cli crash path appears resolved on ROCK 5 / RK3588, but a new issue shows up on the long-lived server path.
With the merged dense-balanced hybrid configuration:
llama-cli now succeeds repeatedly on the validated post-merge path
llama-server starts, loads the same model/config successfully, and serves at least one request
- a subsequent request causes the connection to drop / server to die
- the first successful completion also looked semantically corrupted / garbled rather than like sane natural-language output
This issue tracks the new post-merge problem so it can be investigated separately from the earlier packed-weight placement crash.
Environment
Hardware / OS:
- Radxa ROCK 5C / RK3588
- Debian 12
- native DRM render-node path is the correct runtime path on this board
/dev/rknpu symlink should remain absent
Repo state:
Build:
build-rknpu
GGML_RKNPU2=ON
llama-cli and llama-server both built successfully
Model:
/home/radxa/hf_models/Qwen_Qwen3.5-4B-Q8_0.gguf
What is already validated
The earlier dense-balanced failure mode appears fixed enough for CLI validation:
- 3/3
llama-cli runs completed successfully with EXIT:0
- merged placement fix is active in logs:
*.ffn_up.weight -> CPU-visible
*.ffn_gate.weight -> CPU-visible
*.ffn_down.weight -> RKNPU
- the old
ffn_up_gate-35 packed-weight fallback copy crash did not reappear
Relevant routed tensor summary from successful CLI logs:
- CPU tensors: 395 (~4154 MiB)
- RKNPU tensors: 32 (~765 MiB)
- top-level RKNPU routed buffer alloc: 720 MiB
- top-level CMA alloc still fails, system heap fallback succeeds
Server repro
Server launch:
env HYBRID_MANIFEST=./examples/hybrid-manifests/dense-balanced.json \
HYBRID_STRICT=1 \
RKNN_SPLIT_FACTOR=1 \
RKNPU_B_CACHE_SIZE=1024 \
RKNPU_CTX_CACHE_SIZE=64 \
RKNPU_B_MEM_MODE=copy \
./build-rknpu/bin/llama-server \
-m /home/radxa/hf_models/Qwen_Qwen3.5-4B-Q8_0.gguf \
--host 127.0.0.1 --port 8081 \
--n-gpu-layers 99 \
-c 256 -t 1 -b 32 -ub 32 \
--no-warmup
Observed startup state:
/health returns OK
/props returns OK
- server log shows model fully loaded and HTTP server listening
Example request path:
POST /completion
{
"prompt": "Say hello in five words.",
"n_predict": 8,
"temperature": 0.2,
"stream": false
}
Observed behavior:
- first request succeeds
- returned content is garbled / semantically suspicious, for example:
- a subsequent request fails with connection drop / reset
- from the client side this showed up as:
Remote end closed connection without response
- then
Connection reset by peer
Key log evidence
Server log confirms merged placement fix is active before serving:
ffn_gate.weight resolved to CPU with reason: tensor must stay CPU-visible for ggml_fused_up_gate
ffn_up.weight resolved to CPU with same reason
ffn_down.weight still routed to RKNPU
Server log also shows normal startup:
- model loaded
- HTTP server listening on
127.0.0.1:8081
- first task launched on slot 0
Hypotheses
Most likely categories now:
- Long-lived / repeated-request stability bug specific to server mode on the dense-balanced hybrid path
- Semantic corruption in the current
RKNPU_B_MEM_MODE=copy path even when the process does not immediately crash
- A server-only cache / slot / context lifecycle issue that does not show up in one-shot
llama-cli runs
Next debugging targets
- Reproduce with exactly 2 sequential
/completion requests against one server process
- Capture the server log immediately after the second request failure
- Check whether the server process actually exits or whether the connection dies while the process remains alive
- Inspect
dmesg / kernel logs right after the failed second request
- Compare semantic quality against CPU-only and/or legacy non-manifest runs on the same short prompts
- Verify whether the corruption is specific to server mode, repeated requests, or the broader dense-balanced
RKNPU_B_MEM_MODE=copy path itself
Why this is separate from the previous issue
The earlier crash was a packed-weight storage contract issue around ggml_fused_up_gate inputs living in packed RKNPU storage. That appears resolved for the validated CLI path. This new issue is about:
- repeated-request server stability
- semantic quality of returned text
Those should be investigated separately from the already-merged placement fix.
Summary
After merging the dense-balanced RKNPU placement fixes from PR #3, the original
llama-clicrash path appears resolved on ROCK 5 / RK3588, but a new issue shows up on the long-lived server path.With the merged dense-balanced hybrid configuration:
llama-clinow succeeds repeatedly on the validated post-merge pathllama-serverstarts, loads the same model/config successfully, and serves at least one requestThis issue tracks the new post-merge problem so it can be investigated separately from the earlier packed-weight placement crash.
Environment
Hardware / OS:
/dev/rknpusymlink should remain absentRepo state:
mainat merge commit89c410a52Build:
build-rknpuGGML_RKNPU2=ONllama-cliandllama-serverboth built successfullyModel:
/home/radxa/hf_models/Qwen_Qwen3.5-4B-Q8_0.ggufWhat is already validated
The earlier dense-balanced failure mode appears fixed enough for CLI validation:
llama-cliruns completed successfully withEXIT:0*.ffn_up.weight-> CPU-visible*.ffn_gate.weight-> CPU-visible*.ffn_down.weight-> RKNPUffn_up_gate-35packed-weight fallback copy crash did not reappearRelevant routed tensor summary from successful CLI logs:
Server repro
Server launch:
env HYBRID_MANIFEST=./examples/hybrid-manifests/dense-balanced.json \ HYBRID_STRICT=1 \ RKNN_SPLIT_FACTOR=1 \ RKNPU_B_CACHE_SIZE=1024 \ RKNPU_CTX_CACHE_SIZE=64 \ RKNPU_B_MEM_MODE=copy \ ./build-rknpu/bin/llama-server \ -m /home/radxa/hf_models/Qwen_Qwen3.5-4B-Q8_0.gguf \ --host 127.0.0.1 --port 8081 \ --n-gpu-layers 99 \ -c 256 -t 1 -b 32 -ub 32 \ --no-warmupObserved startup state:
/healthreturns OK/propsreturns OKExample request path:
Observed behavior:
bung N -尽 ’Remote end closed connection without responseConnection reset by peerKey log evidence
Server log confirms merged placement fix is active before serving:
ffn_gate.weightresolved to CPU with reason: tensor must stay CPU-visible forggml_fused_up_gateffn_up.weightresolved to CPU with same reasonffn_down.weightstill routed to RKNPUServer log also shows normal startup:
127.0.0.1:8081Hypotheses
Most likely categories now:
RKNPU_B_MEM_MODE=copypath even when the process does not immediately crashllama-clirunsNext debugging targets
/completionrequests against one server processdmesg/ kernel logs right after the failed second requestRKNPU_B_MEM_MODE=copypath itselfWhy this is separate from the previous issue
The earlier crash was a packed-weight storage contract issue around
ggml_fused_up_gateinputs living in packed RKNPU storage. That appears resolved for the validated CLI path. This new issue is about:Those should be investigated separately from the already-merged placement fix.