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>
Re-analyse globale plateforme : le GPU n'avait JAMAIS été testé. Build
ggml-vulkan pour Android arm64 (NDK r27d + SPIRV-Headers + vulkan.hpp
téléchargés depuis github, libomp.so poussé sur tablette).
Adreno 830 détecté : uma=1 fp16=1 matrix cores=NONE (compute shaders seuls).
3 patterns testés :
(1) Decoder weights Vulkan buft + CPU compute : NEUTRE
RTF 2.45 -> 2.40-2.47 (bruit), WAV bit-exact
Cause : UMA = même DRAM, pas de gain BW
(2) Decoder + sched (GPU compute attendu) : tout CPU
sched route UMA buffer -> CPU (logique is_host)
Cause : sched ne déclenche pas l'offload pour buffers UMA
(3) Talker offload 29/29 layers via llama.cpp : REGRESSION +128%
Prefill 87->775 ms, talker 32->45 ms, decoder 3.3->6.6s
Cause : 0.6B + batch=1 + bus contention GPU/CPU sur DRAM partagée
Verdict cumulé HTP + Vulkan : sur SM8750 ce TTS spécifique, ni HTP ni
GPU n'apportent gain net. NEON CPU optimisé reste la voie unique
réaliste sur ce hardware.
Conso énergie : Vulkan talker = pipeline ×2.3 plus long, conso ~×2.
NEON CPU = meilleure efficience.
Verdict : RESTE SUR NEON CPU pour la prod.
Code committé opt-in (KZTTS_VULKAN_LIB, KZTTS_DECODER_VULKAN,
KZTTS_TALKER_VULKAN), désactivé par défaut. Path principal RTF 2.45 intact.
Détails complets dans dist/PERF_VULKAN_TESTS.md.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>