From 97180b29a6d334e6b4770de8b925fb2a987208c2 Mon Sep 17 00:00:00 2001 From: Richard Loyer Date: Wed, 27 May 2026 18:55:16 +0200 Subject: [PATCH] =?UTF-8?q?dist:=20audit=20int=C3=A9grabilit=C3=A9=20HANDO?= =?UTF-8?q?FF=20=E2=80=94=20corrige=20passages=20p=C3=A9rim=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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) --- dist/HANDOFF.md | 30 +++++++++++++++++++----------- dist/STATUS.md | 2 +- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/dist/HANDOFF.md b/dist/HANDOFF.md index cbc308c..f83dae5 100644 --- a/dist/HANDOFF.md +++ b/dist/HANDOFF.md @@ -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) 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` - repassé en `GGML_TYPE_F16`. → **rebuild `libkazeia_engine.so` avant de shipper** (le .so livré - contient encore l'ancien q8_0). q8_0 seulement si OOM KV en très long contexte. + repassé en `GGML_TYPE_F16` (vérifié `jni/kazeia_engine_jni.cpp:41`). → `lib/libkazeia_engine.so` + (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, 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. @@ -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/`. 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. - - **C dual-contexte (prefill HTP+OPFILTER → transfert KV → decode CPU)** : prefill 181, decode **10.9**, - **+2.3 GB** RAM (2e instance). Optimal mais + complexe. Harness prouvé : `jni/dual_ctx.cpp`. - TODO propre : corriger SSM_CONV HTP (gate `test-backend-ops -o SSM_CONV` = 45/45) → enlèverait l'OPFILTER. + - **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 + `GDN_PREFILL=1`). **Recommandé** pour prompts longs/multi-tour. + - **C dual-contexte (prefill HTP → transfert KV → decode CPU)** : prefill 181, decode **10.9**, + **+2.3 GB** RAM (2e instance). Optimal mais + complexe — **c'est ce que le JNI implémente**. Harness : `jni/dual_ctx.cpp`. + (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) | | 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 — 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 — HTP sans OPFILTER | 189 *(sortie CASSÉE: SSM_CONV)* | — | — | +| q35-lmq4 — B: HTP mono-ctx | 181 | 6.4 (HTP) | 2.4 GB +ION | +| 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. 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()`. ## Paquet à intégrer -- `lib/*.so` → `app/src/main/jniLibs/arm64-v8a/` (libkazeia_engine.so **statique** + ggml/htp ; - htp-v79 = celui de cette session, fp16 derrière env `KZ_F16` OFF par défaut = comportement inchangé). +- `lib/*.so` → `app/src/main/jniLibs/arm64-v8a/` (libkazeia_engine.so = **SHARED**, 40 KB, NEEDED + 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. - `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. +ℹ️ `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 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`. diff --git a/dist/STATUS.md b/dist/STATUS.md index b3894ab..10d012f 100644 --- a/dist/STATUS.md +++ b/dist/STATUS.md @@ -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 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). +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). 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).