Kazeia-engine/RAPPORT_RD.md

2.3 KiB

Kazeia-Engine — Rapport R&D complet (24-25/05/2026)

Synthèse de toute la session. Matériel : OnePlus Pad3, SM8750 (Snapdragon 8 Elite, Hexagon V79), 16 GB, sans root. Mémoire LPDDR5x ~77 GB/s, CPU ~25. NDK r27d, Hexagon SDK 6.5.0.0.

1. Objectif

Faire tourner Qwen3.5-4B (et 9B) en GGUF, sans conversion .pte, en exploitant le NPU pour le prefill et le CPU pour le decode. Cible : égaler/battre ExecuTorch (4B .pte = 15 tok/s, 2.2 GB), empreinte mémoire mini.

2. Le fait dur (mesuré, reproductible)

Decode M=1 = memory-bandwidth bound, pas compute. Le NPU n'aide pas le decode (bus DDR saturé), il aide le prefill (batché, compute-bound). Donc : prefill NPU / decode CPU, verrouillé pour 4B et 9B.

3. Performances stables (r3, ±2%) — moteur llama.cpp upstream

Modèle prefill HTP decode CPU RAM
Qwen3.5-4B-Q4_0 ~50 (ngl99/t8/b512) 9.8 2.4 GB
Qwen3.5-9B-Q4_0 ~41 5.2 5.0 GB
Qwen3-4B dense 103 17 2.2 GB
4B ExecuTorch .pte ~451 15 3.3 GB
Prefill 3.5 plafonne à 55 : les 24 couches GDN tournent CPU (pas de kernel HTP). Le dense fait 103 (matmuls HMX). 30B/35B = OOM. r1 antérieurs (8.4→2.1) = bruit, écartés.

4. Cascade Thinker+Guard : RAM OK

9B+Guard-4B = 7.5 GB ; 9B+Guard-8B = 9.5 GB ; +TTS/STT → 11.5. Tient sur 16 GB. 9B>4B en qualité FR.

5. Engine vs briques

briques (stack NPU+lm_head CPU) : 2B 13, 4B 7, 9B 2.1 tok/s. 2B briques 13/2.5GB = sweet spot, > engine 4B 9.8. Repo /opt/Kazeia/to_delete/briques_qwen35. Pour le 4B, .pte reste devant (15, 2.2GB). GGUF utile = 9B/modèles sans pte.

6. Intégration #277 (dev) — débloquée, 2 fixes

hang in-app = thinking non bridé + 1 thread. FIX : signature generate(sys,usr,maxTok), ChatML+<think></think>, ngl0 + n_threads=8 → 14 tok/s. Bridge STATIC (0 NEEDED libllama, coexiste TTS). dist /opt/Kazeia-engine/dist/ : libkazeia_engine.so + htp-v79.so + EngineLlmEngine.kt + docs.

7. R&D pousser prefill = HVX chunkwise GDN

55→100 crédible mais HMX accumule fp16 (pas bit-exact). Voie HVX qf32, 3-5 sem. lm_head NPU = mort (CPU 31ms < HVX 104). Fork qualcomm/llama.cpp cloné (ql/) avec IQ4_NL HVX — test bench IQ4_NL = à finir (quantize on-device).

8. À FAIRE : quantize 4B IQ4_NL on-device + bench, brancher JNI, valider qualité FR. STT reste ORT-QAIRT. Détail commits : git log.