Découverte historique remise au jour : la mémoire 'TTS RTF<1 atteint via
chraac-llama' (projet d'origine /opt/Kazeia, 02/05) documente que le
décodeur TTS atteint RTF 0.96 avec ggml-cpu de chraac-llama (dev-refactoring
commit 897501a) vs 1.47 avec llama-upstream (= notre ql/ggml actuel).
Notre Kazeia-Engine builde contre ql/ggml = github.com/qualcomm/llama.cpp
fork = essentiellement llama-upstream + hexagon backend. NEON heads optim
sortie cette session a déjà compensé une partie mais pas tout.
Validation reproductibilité :
Bench historique decoder seul (T=56) sur Pad3 chargée : RTF 0.935
(legèrement mieux que 0.961 historique, batterie pleine + device froid).
Build chraac variant :
- libs runtime : copies de /opt/Kazeia/chraac-llama/build-android-kazeia/bin
poussées dans /data/local/tmp/kz-engine/bin-chraac
- libqwen3tts-decoder.a : rebuild fresh contre chraac/ggml dans
/opt/Kazeia/kazeia-tts-decoder-ggml/build-android-chraac-fresh
(code actuel avec load_with_backends + snake_consts)
- tts_pipeline_chraac : linké contre ces libs, headers
/opt/Kazeia/chraac-llama/include + ggml/include
Mesure A/B Pad3 (KZTTS_THREADS=6 GGML_NUM_THREADS=8 seed=42) :
Phrase 'Bonsoir, comment tu te sens ce soir ?' :
Baseline ql/ggml : N=41 RTF 2.43 talker=31.5 cp=70.2 decoder/frame=98.1 ms
chraac-llama : N=64 RTF 2.04 talker=31.2 cp=57.5 decoder/frame=76.9 ms
Delta per-frame : -16% -1% -18% -22%
Phrase 'Bonjour Kazeia' :
Baseline : N=33 RTF 2.47 / Chraac : N=64 RTF 2.02
(Différence N = trajectoire diverge — précision f32 différente entre
stacks fait que le sampler talker produit des codes différents et
génère une phrase plus longue avant EOS)
Gains :
- Decoder -22% confirmé (cohérent avec ratio chraac 0.96 / llama-upstream 1.47)
- CP -18 à -21% (ggml_graph_compute repack/sgemm ARM optimisé chraac)
- Talker -1% (déjà au plafond NEON via llama.cpp)
- RTF total -16 à -18%
Bug découvert (à traiter plus tard) :
Phrase historique 56 codes 'Bonjour, je m'appelle Kazeia, je suis encore en phase de développement' (= ~60 frames) crash ggml_sin chraac (GGML_ABORT 'unsupported types' probable). Phrases moyennes (<= 50 frames)
passent OK. Sans doute incompat de types entre snake_consts (ctx_const dans
Decoder) et le path ggml_sin de chraac (qui n'a peut-être pas la même
variante f16/f32 que les ops récentes).
Path actuel ql/ggml RESTE le défaut. Le chraac est build séparé tts_pipeline_chraac
opt-in pour A/B. Libs chraac dans dist/lib-chraac/ (gitignored).
À faire next :
- Investiger crash ggml_sin chraac sur T>= ~50 frames
- Décider : swap définitif Kazeia-Engine sur chraac (avec lib-chraac
comme runtime principal) OU rester sur ql/ggml et patch chraac repack
optims dedans
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| decoder_patches | ||
| include | ||
| jni | ||
| lib | ||
| CMakeLists.txt | ||
| HANDOFF.md | ||
| INTEGRATION.md | ||
| MODELS.md | ||
| PERF.md | ||
| PERF_ANALYSIS.md | ||
| PERF_CPU_OPTIMS.md | ||
| PERF_INFRA_TESTS.md | ||
| PERF_VULKAN_TESTS.md | ||
| PITFALLS.md | ||
| README.md | ||
| STATUS.md | ||
| TTS.md | ||
| build_ggml_vulkan.sh | ||
| build_kazeia_tts.sh | ||
| build_test_engine_2calls.sh | ||
| build_test_tokenizer.sh | ||
| build_tts_pipeline.sh | ||
| build_tts_pipeline_chraac.sh | ||
| llama-cli | ||
| package.sh | ||
| system_fr.txt | ||
| test_native | ||
README.md
⚠ Source de vérité à jour = HANDOFF.md (26/05). Modèle tranché =
q35-lmq4(Qwen3.5-4B), 9B écarté. Les mentions de 9B/cascade ci-dessous sont historiques.
Kazeia-Engine — intégration kazeia-android
Moteur LLM (+ TTS) GGUF, sans .pte, fork llama.cpp upstream + backend Hexagon.
Remplace ExecuTorch/Genie pour le LLM. STT reste ORT-QAIRT (inchangé). Prefill NPU /
decode CPU. Modèle dense (Qwen3) plein NPU ; hybride (Qwen3.5 DDDA) GDN sur NPU corrigé.
0. Périmètre
| Brique | Avant | Après |
|---|---|---|
| LLM Speaker/Thinker | ExecuTorch .pte |
Kazeia-Engine GGUF |
| TTS Talker/CP | ggml-cpu | engine (Talker prefill HTP option.) |
| TTS Decoder | libtts_decoder_ggml | inchangé |
| STT Whisper | ORT-QAIRT | inchangé |
1. Contenu du paquet
lib/:libkazeia_engine.so(bridge JNI) +libllama.so+libggml{,-base,-cpu,-hexagon}.so+libggml-htp-v68/69/73/75/79/81.so(sélection auto = V79 sur Pad3). 168 MB.jni/:kazeia_engine_jni.cpp,EngineLlmEngine.kt.include/,CMakeLists.txt.INTEGRATION.md(steps),TTS.md,MODELS.md,PERF.md,PITFALLS.md.
2. Build (5 étapes)
lib/*.so→kazeia-android/app/src/main/jniLibs/arm64-v8a/jni/kazeia_engine_jni.cpp→app/src/main/jni/,include/*.hà côtéEngineLlmEngine.kt→com/kazeia/llm/,System.loadLibrary("kazeia_engine")- CMake: lib avec libllama+libggml+libggml-base,
-march=armv8.6-a+dotprod+fp16+i8mm+bf16 - GGUF → external storage, paths via
KazeiaApplication.LLM_DIR
3. Cascade — remplace LlmProcessor cascade
Thinker Guard-4B → 4 bullets ; Speaker 9B = SYS_KAZEIA+bullets. Mono-moteur, reset() entre tours. Prompts: voir RAPPORT_KAZEIA §8. --reasoning-budget 0 impératif (sinon ramble anglais) : EngineLlmEngine met thinking off. Mesuré: 9B>4B qualité, Speaker=9B.
→ MODELS.md (choix), PERF.md (chiffres), PITFALLS.md (params_fit, no tty, OOM 30B+), INTEGRATION.md (détail API). API: load/generate/reset/free.
VALIDÉ DEVICE 24/05
test_native (=logique generate bridge) sur Pad3: load 4B HTP+decode CPU+detok = OUT propre, exit0. Pipeline prefill-NPU/decode-CPU prouve end-to-end. dist/jni/test_native.cpp = harness reproductible. Bridge so: 4 symboles JNI + deps ok. Reste app: gradle+jniLibs+template chat.
v2 STATIC (collision libllama TTS resolue)
TTS Talker/CP linke vs son libllama.so -> conflit ABI. FIX: libkazeia_engine.so STATIC (llama+ggml+ggml-cpu+hexagon en .a, --whole-archive hexagon). NEEDED= libm/log/dl/c only, 42MB. Coexiste avec libllama TTS. Drop: libkazeia_engine.so + libggml-htp-v79.so. Valide device 4B HTP. Build: bstatic BUILD_SHARED_LIBS=OFF.
v3 utilisable: thinking-off bridge
generate(sys,usr,max): wrap ChatML + vide = stop reasoning, decode 4B 15tok/s ~5s/tour. test 4B: "Je suis desole..." 40s(load)+gen. signature 2-arg. cap maxTok 64. dist=libkazeia_engine.so static + htp-v79. #277 fix livre.
v4 USABLE: ngl0 CPU decode (vrai fix #277)
Hang in-app=0.21tok/s: ngl99 -> decode ping-pong NPU/GDN-CPU. FIX: n_gpu_layers=0 decode CPU pur 14tok/s. test 4B: reponse FR 4s/tour. dev avait raison: pas thinking. cap64 garde. Speaker=4B CPU ngl0. RAM 4.5G. dist=libkazeia_engine.so. utilisable, #277 debloque.