From 693508945975fa5c54c33b7d2c6eb861ba53eef7 Mon Sep 17 00:00:00 2001 From: Richard Loyer Date: Wed, 27 May 2026 10:45:47 +0200 Subject: [PATCH] =?UTF-8?q?dist:=20libkazeia=5Fengine.so=20rebuild=20optio?= =?UTF-8?q?n=20C=20(paquet=20coh=C3=A9rent),=20notes=20rebuild=20MAJ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit libkazeia_engine.so reconstruit depuis le JNI option C (37KB strippé, 4 symboles JNI, SHARED, NEEDED llama/ggml/ggml-base/log/c++_shared). Le paquet dist/ est désormais interne-cohérent: sources + prebuilts alignés (option C + fix SSM_CONV). Docs: prebuilts à jour, rebuild app-side recommandé pour ABI/STL. Logique validée via dual_ctx_mt (JNI non testé via Java ici). Co-Authored-By: Claude Opus 4.7 (1M context) --- dist/HANDOFF.md | 9 +++++---- dist/STATUS.md | 4 ++-- dist/lib/libkazeia_engine.so | Bin 49336 -> 37768 bytes 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/dist/HANDOFF.md b/dist/HANDOFF.md index 25c8d79..9ca9a02 100644 --- a/dist/HANDOFF.md +++ b/dist/HANDOFF.md @@ -20,8 +20,9 @@ Le JNI implémente **C** (prefill HTP / decode CPU), validé multi-tour (`jni/du - `generate()` : prefill du prompt sur HTP → `llama_state_seq_get/set_data` transfère le KV → decode sur CPU. Sans état entre appels (l'app passe l'historique complet dans le prompt → re-prefill HTP, rapide). - KV **f16**, flash_attn ON, thinking OFF (`` vide), greedy. API inchangée : `load/generate/reset/free`. -- ⚠ **Rebuild `libkazeia_engine.so` requis** (le .so livré est l'ancienne version CPU-only/q8_0). - `CMakeLists.txt` inchangé (linke llama+ggml+ggml-base+log) ; compile+linke vérifié (4 symboles JNI OK). +- `lib/libkazeia_engine.so` **à jour (option C, 37 KB, 4 symboles JNI, variante SHARED)** + `libggml-hexagon.so` + (fix SSM_CONV) + `libggml-htp-v79.so` à jour. Prebuilts utilisables tels quels (NDK r27d) ; **rebuild depuis + `jni/` dans ton build app recommandé** pour garantir l'ABI/STL (CMakeLists.txt fourni, linke llama+ggml+ggml-base+log). ## Décisions (vérifiées 27/05, batterie 90%, device froid) 1. **KV = f16 (RÉSOLU, corrigé dans le JNI).** Mesuré : decode q35-lmq4 f16=**10.9** vs q8_0=**6.5** @@ -34,8 +35,8 @@ Le JNI implémente **C** (prefill HTP / decode CPU), validé multi-tour (`jni/du **Fix livré dans `libggml-hexagon.so`** (`ggml_hexagon_supported_ssm_conv` : `n_t>1 → CPU`) : le conv1d prefill tourne sur ggml-cpu (correct, bon marché), le reste du prefill sur HTP, decode conv sur HTP (n_t=1). Plus besoin de `OPFILTER`. Validé : oracle SSM_CONV 18/18, cli `-dev HTP0` cohérent, multi-tour cohérent+mémoire. - Mesuré : **prefill HTP 110-180 t/s** (×8-13 vs CPU 14), sortie correcte. → **rebuild `libggml-hexagon.so` - + `libkazeia_engine.so` avant ship.** Trois options (le JNI implémente C) : + Mesuré : **prefill HTP 110-180 t/s** (×8-13 vs CPU 14), sortie correcte. Libs prebuilts à jour dans `lib/`. + Trois options (le JNI implémente C) : - **A CPU-only** : prefill 14, decode 10.9, 2.4 GB. Simple. - **B mono-contexte HTP + OPFILTER** : prefill **181**, decode HTP **6.4**, 2.4 GB (+ION). Gros gain prefill, decode + lent, aucune RAM en plus, peu de code (ngl99 + env). **Recommandé** pour prompts longs/multi-tour. diff --git a/dist/STATUS.md b/dist/STATUS.md index fc5eca4..b3894ab 100644 --- a/dist/STATUS.md +++ b/dist/STATUS.md @@ -7,8 +7,8 @@ Perf : prefill clos côté kernel GDN (pas le goulot), decode au plafond CPU. LIMITES / OUVERT : 1. **Prefill HTP CORRIGÉ** (27/05) : charabia = 1 op (SSM_CONV conv1d) cassée sur HTP en multi-token. Fix intégré au backend (`libggml-hexagon.so` : supported_ssm_conv n_t>1→CPU). Plus d'OPFILTER. Prefill HTP - 110-180 t/s cohérent. JNI = option C (prefill HTP→transfert KV→decode CPU), validé multi-tour. **Rebuild - libggml-hexagon.so + libkazeia_engine.so avant ship.** Options A/B/C dans HANDOFF.md déc.2. + 110-180 t/s cohérent. JNI = option C (prefill HTP→transfert KV→decode CPU), validé multi-tour. Prebuilts + `lib/` à jour (libkazeia_engine.so option C + libggml-hexagon.so fix) ; rebuild depuis jni/ recommandé (ABI). Options A/B/C dans HANDOFF.md déc.2. 2. **KV = f16 (résolu, JNI corrigé)** : f16=10.9 vs q8_0=6.5 au decode. Rebuild .so requis (livré=q8_0). 3. `generate()` applique déjà ChatML + thinking-off. App fournit `sys`/`usr` (voir system_fr.txt). 4. TTS Talker GGUF chargeable mais **audio e2e non validé** (= intégration app). diff --git a/dist/lib/libkazeia_engine.so b/dist/lib/libkazeia_engine.so index f786b53754dd80819e88c9c5c2b750c8d77e4931..863c70f9ae57754add4f909c2448fa023fb1eb2c 100755 GIT binary patch delta 13599 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