dist: audit intégrabilité HANDOFF — corrige passages périmés

- libkazeia_engine.so = SHARED (pas statique) -> shipper tout lib/ ensemble (ABI #277)
- KV f16 déjà rebuildé dans le .so livré (la note 'rebuild/q8_0' était stale)
- OPFILTER obsolète (fix SSM_CONV dans backend) -> libellés B/C + tableau nettoyés
- note instrumentation OPLOG/DUMP dormante dans libggml-hexagon.so (zéro-coût)
Paquet vérifié: 5 symboles JNI, source f16+routing arch conformes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Richard Loyer 2026-05-27 18:55:16 +02:00
parent b350c2be73
commit 97180b29a6
2 changed files with 20 additions and 12 deletions

30
dist/HANDOFF.md vendored
View File

@ -49,8 +49,8 @@ et `jni/dual_ctx_mt.cpp` (3 tours, prefill HTP 103-144 t/s, decode CPU ~7-9).
## Décisions (vérifiées 27/05, batterie 90%, device froid) ## 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** 1. **KV = f16 (RÉSOLU, corrigé dans le JNI).** Mesuré : decode q35-lmq4 f16=**10.9** vs q8_0=**6.5**
(40%, idem à d=512). Le déquant KV en flash-attn coûte plus que le BW épargné. `type_k/v` (40%, idem à d=512). Le déquant KV en flash-attn coûte plus que le BW épargné. `type_k/v`
repassé en `GGML_TYPE_F16`. → **rebuild `libkazeia_engine.so` avant de shipper** (le .so livré repassé en `GGML_TYPE_F16` (vérifié `jni/kazeia_engine_jni.cpp:41`). → `lib/libkazeia_engine.so`
contient encore l'ancien q8_0). q8_0 seulement si OOM KV en très long contexte. (27/05) **déjà rebuildé en f16**, prêt. q8_0 seulement si OOM KV en très long contexte.
2. **Prefill HTP : CORRIGÉ (fix intégré au backend).** Cause du charabia localisée à **une seule op, 2. **Prefill HTP : CORRIGÉ (fix intégré au backend).** Cause du charabia localisée à **une seule op,
SSM_CONV (conv1d), cassée sur HTP en multi-token (prefill) pour certains d_inner (1024/2048 ; 1536 OK)** SSM_CONV (conv1d), cassée sur HTP en multi-token (prefill) pour certains d_inner (1024/2048 ; 1536 OK)**
— bug données/marshalling côté DSP (HVX ET scalaire HTP faux, ggml-cpu correct), non localisé à la ligne. — bug données/marshalling côté DSP (HVX ET scalaire HTP faux, ggml-cpu correct), non localisé à la ligne.
@ -60,19 +60,21 @@ et `jni/dual_ctx_mt.cpp` (3 tours, prefill HTP 103-144 t/s, decode CPU ~7-9).
Mesuré : **prefill HTP 110-180 t/s** (×8-13 vs CPU 14), sortie correcte. Libs prebuilts à jour dans `lib/`. 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) : Trois options (le JNI implémente C) :
- **A CPU-only** : prefill 14, decode 10.9, 2.4 GB. Simple. - **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, - **B mono-contexte HTP** : 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. decode + lent, aucune RAM en plus, peu de code (ngl99 + `GDN_PREFILL=1`). **Recommandé** pour prompts longs/multi-tour.
- **C dual-contexte (prefill HTP+OPFILTER → transfert KV → decode CPU)** : prefill 181, decode **10.9**, - **C dual-contexte (prefill HTP → transfert KV → decode CPU)** : prefill 181, decode **10.9**,
**+2.3 GB** RAM (2e instance). Optimal mais + complexe. Harness prouvé : `jni/dual_ctx.cpp`. **+2.3 GB** RAM (2e instance). Optimal mais + complexe — **c'est ce que le JNI implémente**. Harness : `jni/dual_ctx.cpp`.
TODO propre : corriger SSM_CONV HTP (gate `test-backend-ops -o SSM_CONV` = 45/45) → enlèverait l'OPFILTER. (Plus d'`OPFILTER` : le conv1d multi-token tombe sur CPU via le gate backend `supported_ssm_conv`.)
TODO backend (optionnel) : corriger SSM_CONV HTP multi-token (gate `test-backend-ops -o SSM_CONV` = 45/45)
pour faire tourner le conv1d prefill **sur** HTP au lieu du fallback CPU actuel.
## Perf (sains, 27/05, device froid) ## Perf (sains, 27/05, device froid)
| | prefill | decode | RAM | | | prefill | decode | RAM |
|---|--:|--:|--:| |---|--:|--:|--:|
| q35-lmq4 — **C: HTP-prefill / CPU-decode (CÂBLÉ JNI)** | **103-180** (HTP, monte avec ctx) | **~7-9** (CPU, profondeur) | 4.7 GB | | q35-lmq4 — **C: HTP-prefill / CPU-decode (CÂBLÉ JNI)** | **103-180** (HTP, monte avec ctx) | **~7-9** (CPU, profondeur) | 4.7 GB |
| q35-lmq4 — A: CPU-only | 14 | 10.9 (ctx court) | 2.4 GB | | q35-lmq4 — A: CPU-only | 14 | 10.9 (ctx court) | 2.4 GB |
| q35-lmq4 — B: HTP+OPFILTER mono-ctx | 181 | 6.4 (HTP) | 2.4 GB +ION | | q35-lmq4 — B: HTP mono-ctx | 181 | 6.4 (HTP) | 2.4 GB +ION |
| q35-lmq4 — HTP sans OPFILTER | 189 *(sortie CASSÉE: SSM_CONV)* | — | — | | q35-lmq4 — HTP **sans le fix SSM_CONV** (historique) | 189 *(sortie CASSÉE)* | — | — |
Multi-tour mesuré (C) : tour1 63tok→prefill 103/decode 9 ; tour3 268tok→prefill 144/decode 6.7 ; mémoire OK. Multi-tour mesuré (C) : tour1 63tok→prefill 103/decode 9 ; tour3 268tok→prefill 144/decode 6.7 ; mémoire OK.
Decode CPU baisse avec la profondeur de contexte (normal). Un tour ~80 tok ≈ prefill 1-3 s + decode 9-12 s. Decode CPU baisse avec la profondeur de contexte (normal). Un tour ~80 tok ≈ prefill 1-3 s + decode 9-12 s.
@ -86,12 +88,18 @@ tutoiement constant, et « ne présume pas du pire, fais préciser » (le modèl
« le départ de ma fille » comme un décès). À passer tel quel en `sys` de `generate()`. « le départ de ma fille » comme un décès). À passer tel quel en `sys` de `generate()`.
## Paquet à intégrer ## Paquet à intégrer
- `lib/*.so``app/src/main/jniLibs/arm64-v8a/` (libkazeia_engine.so **statique** + ggml/htp ; - `lib/*.so``app/src/main/jniLibs/arm64-v8a/` (libkazeia_engine.so = **SHARED**, 40 KB, NEEDED
htp-v79 = celui de cette session, fp16 derrière env `KZ_F16` OFF par défaut = comportement inchangé). libllama/libggml/libggml-base/libc++_shared → **shipper TOUT le set `lib/` ensemble**, l'ABI doit
matcher, sinon crash ABI-drift comme #277 ; **rebuild app-side recommandé** pour le garantir).
htp-v79 = celui de cette session, fp16 derrière env `KZ_F16` OFF par défaut = comportement inchangé.
- `jni/kazeia_engine_jni.cpp` + `jni/EngineLlmEngine.kt` + `include/` → projet app. - `jni/kazeia_engine_jni.cpp` + `jni/EngineLlmEngine.kt` + `include/` → projet app.
- `q35-lmq4.gguf` → external storage (2.38 GB, hors git ; le pousser ou le reproduire, cf MODELS.md). - `q35-lmq4.gguf` → external storage (2.38 GB, hors git ; le pousser ou le reproduire, cf MODELS.md).
- `./package.sh` réassemble `lib/` depuis le build `ql/b` + recopie le prompt. - `./package.sh` réassemble `lib/` depuis le build `ql/b` + recopie le prompt.
`libggml-hexagon.so` embarque l'instrumentation **dormante** du chantier dense-HMX (OPLOG/DUMP,
gâchées par `GGML_HEXAGON_OPLOG`/`GGML_HEXAGON_DUMP`, off par défaut). Coût quand off = 2 `getenv`/op
(microsecondes, négligeable). Rien à retirer ; utile pour rouvrir `CHANTIER_HMX_DENSE.md`.
## Détails ## Détails
INTEGRATION.md (build/CMake), MODELS.md (modèle + recette), PERF.md (mesures+leviers morts), INTEGRATION.md (build/CMake), MODELS.md (modèle + recette), PERF.md (mesures+leviers morts),
PITFALLS.md (pièges vécus), STATUS.md (limites). Verdict qualité : `../eval/VERDICT.md`. PITFALLS.md (pièges vécus), STATUS.md (limites). Verdict qualité : `../eval/VERDICT.md`.

2
dist/STATUS.md vendored
View File

@ -9,7 +9,7 @@ LIMITES / OUVERT :
intégré au backend (`libggml-hexagon.so` : supported_ssm_conv n_t>1→CPU). Plus d'OPFILTER. Prefill HTP 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. Prebuilts 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. `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). 2. **KV = f16 (résolu)** : f16=10.9 vs q8_0=6.5 au decode. `lib/libkazeia_engine.so` (27/05) déjà rebuildé f16, prêt.
3. `generate()` applique déjà ChatML + thinking-off. App fournit `sys`/`usr` (voir system_fr.txt). 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). 4. TTS Talker GGUF chargeable mais **audio e2e non validé** (= intégration app).
5. STT inchangé (ORT-QAIRT). 9B/30B/35B écartés (lents/OOM). 5. STT inchangé (ORT-QAIRT). 9B/30B/35B écartés (lents/OOM).