Commit Graph

78 Commits

Author SHA1 Message Date
Richard Loyer 97180b29a6 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>
2026-05-27 18:55:16 +02:00
Richard Loyer b350c2be73 chantier dense-HMX #3: uninit VTCM matmul écarté (zéro-init ne corrige pas). Source -inf non-det = amont, instrumentation DSP requise.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 16:54:58 +02:00
Richard Loyer 464d4e69c0 chantier dense-HMX: avancement #2 (replay) — root = fault HMX non-déterministe, instrumentation DSP requise (bloquée sans root). Tools committés.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 14:35:14 +02:00
Richard Loyer 224b375a10 chantier dense-HMX: avancement — ni magnitude, ni NaN, ni shape pure (value/context-spécifique)
3 hypothèses éliminées par mesure: overflow fp16 (act=9.8), NaN/Inf inputs (0), shape pure (isolation
synthétique k=4096 ne crashe pas). Op fautive = o_proj MUL_MAT q4_0 k=4096 après FLASH_ATTN_EXT.
Prochaines étapes révisées (dump-and-replay value-vs-context, instrumentation DSP log-vers-buffer).
OPLOG mis à jour (nan/inf) dans dist/lib. ql -> commit OPLOG.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 14:09:52 +02:00
Richard Loyer 5aa4457567 chantier: instrumentation crash dense-HTP-HMX + .pte retiré (engine seul runtime)
CHANTIER_HMX_DENSE.md: analyse + outils pour le crash matmul HMX dense. Finding: PAS un overflow
fp16 (activation du matmul fautif = 9.8) — c'est un bug de tiling/buffer HMX pour k=4096 (o_proj
après FLASH_ATTN_EXT). Localisé via OPLOG CPU-side (FARF DSP bloqué sans root). Étapes + repro documentés.

HANDOFF: .pte retiré -> engine seul runtime LLM. Dense=HVX (40) sur l'engine; HMX (295)=ce chantier.
dist/lib refreshé (libggml-hexagon.so avec OPLOG dormant, htp-v79 propre). ql -> 7d4cade.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 13:29:32 +02:00
Richard Loyer 0407ac8b71 dist: ROOT CAUSE crash dense-HTP = matmul HMX (fp16) ; fix = HVX pour le dense
Analyse complète (méthode SSM_CONV) du crash dense-HTP:
- bench HTP synthétique (pp512, +tg8) = OK ; cli/engine texte réel crashe 0x2e > ~14 tokens.
- OPFILTER bisect: SOFT_MAX/ROPE/RMS_NORM/GET_ROWS/CPY/CONT/ADD n'arrêtent PAS le crash ; MUL_MAT->CPU OUI.
- GGML_HEXAGON_USE_HMX=0 (matmul HVX) supprime le crash, =1 le reproduit. => le matmul HMX (fp16 tile)
  faute sur les activations réelles du dense (massive activations Qwen3 > plage fp16 ; bench synthétique
  ne déclenche pas l'overflow). Analogue du SSM_CONV pour la 3.5, mais ici c'est le matmul HMX coeur.

Câblage: lecture general.architecture dans le GGUF AVANT init backend -> hybride (qwen35/qwen3next):
HMX on + option C (préservé) ; dense: USE_HMX=0 + HTP contexte-unique (HVX, ~40 prefill =3x CPU, decode ~11,
stable). Repli CPU si pas de HTP. Validé test_jni_native: dense (HVX HTP) + 3.5 (option C) cohérents.
TODO backend: matmul HMX robuste aux activations hors plage fp16.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 12:42:15 +02:00
Richard Loyer c166391f49 dist: routage par structure (is_hybrid) — 3.5->option C, dense->CPU robuste
Détection au load via llama_model_is_hybrid/is_recurrent (structure, pas string d'archi):
- hybride GDN (qwen3.5/qwen3next) -> option C (prefill HTP/decode CPU), préservé+validé.
- dense (qwen3, etc.) / pas de HTP -> CPU pur (universel, robuste).
Charge l'instance CPU d'abord (détection + universel), n'ajoute l'instance HTP que pour l'hybride.

Diagnostic dense-HTP: le prefill dense sur HTP CRASHE (dspqueue_read 0x2e) sur prompt réaliste
(reproduit aussi en llama-cli -dev HTP0 -fa 1; le "ça marche" antérieur = prompt minuscule sans fa,
cas chanceux). Bug backend HTP attention dense multi-token, non corrigé. Dense a un .pte (451) de
toute façon -> dense=CPU robuste. Validé test_jni_native: dense (CPU) + 3.5 (option C) cohérents.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 12:30:43 +02:00
Richard Loyer eeffbc350f dist: JNI générique (auto-détecte archi) — tout LLM, sans dégrader la 3.5
Le JNI lit general.architecture: qwen35/qwen3next -> option C (prefill HTP/decode CPU, préservé
et revalidé cohérent+mémoire). Tout le reste (qwen3 dense, etc.) -> CPU pur (universel, jamais de
crash). Dense Qwen3-4B validé via le moteur (CPU, cohérent). 3.5 non régressée.

Diagnostic crash dense-HTP: ce n'est PAS le HTP (dense single-context HTP marche: cli 36.8/11.4
cohérent, llama-bench pp512=98). Le crash 0x2e (dspqueue_read, flush_pending) survient UNIQUEMENT
en dual-load (option C: 2 instances modèle) appliqué au dense. Or le dense n'a pas besoin de
l'option C (decode HTP 11.4 ≈ CPU 11.7, pas de pénalité GDN). Donc dense -> CPU (ou single-ctx HTP).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 12:11:44 +02:00
Richard Loyer 771d64a998 dist: multi-tour propre (generateRaw + ChatSession) + JNI validé end-to-end natif
Ferme les 2 derniers trous d'intégration:
- generateRaw(prompt) exposé (cœur option C partagé avec generate). EngineLlmEngine.kt: ChatSession
  gère l'historique + construit le ChatML Qwen3.5 validé -> multi-tour propre sans que l'app connaisse
  le template (structure identique à dual_ctx_mt).
- test_jni_native.cpp: dlopen + JNIEnv mock teste le .so shippé bout-en-bout sur device
  (load/generate/generateRaw/free). Résultat: FR cohérent + mémoire conversationnelle OK
  ("Marc, je me souviens parfaitement de ton prénom"). Marshalling JNI réel validé.
libkazeia_engine.so reconstruit (5 symboles). Paquet dist/ prêt à intégrer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 11:18:20 +02:00
Richard Loyer 6935089459 dist: libkazeia_engine.so rebuild option C (paquet cohérent), notes rebuild MAJ
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) <noreply@anthropic.com>
2026-05-27 10:45:47 +02:00
Richard Loyer 2699b631a3 dist: prefill HTP corrigé (SSM_CONV gate backend), JNI option C sans OPFILTER
Fix intégré dans libggml-hexagon.so (ql e872623): ggml_hexagon_supported_ssm_conv route le
conv1d multi-token (prefill) sur ggml-cpu (le kernel HTP est faux multi-token pour d_inner
1024/2048). Plus besoin de GGML_HEXAGON_OPFILTER -> retiré du JNI. Validé: oracle SSM_CONV 18/18,
cli -dev HTP0 cohérent, multi-tour cohérent+mémoire, prefill HTP 110-180 t/s. libggml-hexagon.so
rafraîchi. Rebuild requis avant ship: libggml-hexagon.so + libkazeia_engine.so. Docs MAJ.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 10:39:08 +02:00
Richard Loyer 2c89ec01a2 dist: JNI option C câblé (prefill HTP / decode CPU), validé multi-tour
generate() = prefill prompt sur instance HTP (ngl99, device HTP0, OPFILTER=SSM_CONV +
GDN_PREFILL posés au load) -> llama_state_seq transfère le KV -> decode sur instance CPU
(ngl0, t4+fa, KV f16). 2 instances (~4.7GB). Sans état entre appels (app passe l'historique).
Validé multi-tour via jni/dual_ctx_mt.cpp: 3 tours cohérents FR + mémoire conversationnelle
(rappelle prénom/âge du tour 1 au tour 3), prefill HTP 103-144 t/s, decode CPU ~7-9.
Compile+linke OK (4 symboles JNI, CMakeLists inchangé). Rebuild libkazeia_engine.so requis
avant ship (le .so livré = ancienne version CPU-only/q8_0).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 10:24:55 +02:00
Richard Loyer 501abb67e5 dist: prefill HTP RÉCUPÉRABLE — charabia = 1 op (SSM_CONV) cassée, fix OPFILTER
Investigation détaillée: décomposé le prefill HTP charabia op par op (test-backend-ops -b HTP0
par op + OPFILTER bisect en génération). Coupable unique = SSM_CONV (conv1d) cassé sur HTP en
multi-token (prefill) pour d_inner=1024/2048 (oracle FAIL ERR~1.3; decode n=1 OK; 1536 passe;
bug backend hexagon, HVX+scalaire HTP faux, ggml-cpu correct). FIX immédiat: GGML_HEXAGON_OPFILTER
=SSM_CONV (conv sur CPU, reste HTP) -> prefill HTP 181 t/s + sortie FR cohérente, x13 vs CPU 14.
Renverse le "prefill HTP mort": il est récupérable. 3 configs (A CPU-only livrée / B mono-ctx
HTP+OPFILTER 181/6.4 / C dual-ctx 181/10.9 +2.3GB). TODO: corriger SSM_CONV HTP (gate oracle).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 10:12:37 +02:00
Richard Loyer 2256c077c9 dist: prefill HTP = CASSÉ (sortie charabia), prefill obligatoirement CPU
Vérifié 27/05 batterie pleine, 3 fois (harness dual-ctx, device HTP0 explicite, llama-cli
-dev HTP0 sortant de l'anglais cassé sur prompt FR). Le débit HTP (126-189 t/s) est réel mais
l'état/logits produits sont corrompus -> generation inutilisable. Preuve que c'est le prefill et
non le transfert: decode CPU depuis état prefillé-CPU = FR cohérent, depuis état prefillé-HTP =
charabia. Dense Qwen3-4B sur HTP crashe (V79 0x2e). Donc les "189/98/285 prefill HTP" cités partout
= débit jamais validé en sortie. Renverse l'hypothèse de fond "prefill HTP utilisable".

=> JNI reste ngl0 (CPU prefill 14 + CPU decode 10.9), seule config correcte. jni/dual_ctx.cpp =
harness de validation (prouve aussi que le KV transfer 2-contextes CPU->CPU est cohérent et prêt
le jour où le prefill HTP sera numériquement correct = bug backend frontière). Docs corrigées.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 09:42:59 +02:00
Richard Loyer c9d4e625eb dist: métriques vérifiées batterie pleine — KV f16 (pas q8_0), q35-lmq4 HTP=189
Reconfirmé device froid 90% (les chiffres throttlés d'hier soir étaient faux):
- KV f16 >> q8_0 au decode: q35-lmq4 f16=10.9 vs q8_0=6.5 (-40%, idem d=512). Le déquant KV
  flash-attn coûte plus que le BW. JNI corrigé type_k/v=F16 (rebuild .so requis avant ship;
  le .so livré=q8_0 validé, inchangé).
- q35-lmq4 prefill HTP=189 ~= 2x Qwen3.5-Q4_0 (98): embeds/output Q4 restent sur NPU vs Q6_K
  fallback CPU. Argument fort de plus pour q35-lmq4 (+5% decode ET ~2x prefill HTP).
- decode sain: q35-lmq4 10.9, dense 11.7. prefill CPU JNI=14 (t4).
Decision KV résolue; decision prefill CPU-only vs HTP ouverte (189 motive le câblage).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 09:23:57 +02:00
Richard Loyer fac50d69ce dist: bandeau HANDOFF source de vérité sur README/INTEGRATION (9B historique)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 23:34:15 +02:00
Richard Loyer 9417aba6cb dist: handoff intégration aligné décisions 26/05 (modèle q35-lmq4, perf, prompt)
HANDOFF.md = point d'entrée: modèle Speaker tranché = q35-lmq4 (éval qualité), 9B écarté,
kernel GDN clos. État JNI: config OK (t4/fa/thinking-off/greedy) MAIS CPU-only (ngl0) ->
2 décisions ouvertes documentées (prefill CPU vs HTP non câblé; KV q8_0 à revérifier, peut
coûter au decode). system_fr.txt = prompt prod (garde-fous 3114 + tutoiement + ne-pas-présumer,
correctifs issus de l'éval). MODELS/PERF/STATUS réalignés (decode 10.8, prefill 89.5 HTP capacité
mais JNI=CPU ~19, quant sous-Q4 morte). package.sh réassemble lib/ depuis ql/b.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 23:33:41 +02:00
Richard Loyer 21784d52de eval: verdict (assisté, à valider) -> ship Qwen3.5-lmq4
16 prompts FR notés. SAFETY 2/2 à Qwen3.5 (cite 3114/15, dense reste générique malgré
le même system) = décisif pour le domaine psy. SUPPORT majorité 3.5 (dense: fuite "too",
fautes). Reste ~nul. Règle de décision remplie. Faiblesses 3.5 à corriger par system
(registre tu/vous instable; sur-interprétation item 2 "départ"->"décès"). Decode 10.8 vs
dense 11.7 (-8%), justifié par sécurité. Spot-check humain conseillé items 2/8/9.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 23:23:00 +02:00
Richard Loyer 777c6979c1 eval: kit qualité A/B aveugle Qwen3.5-lmq4 vs dense (decode CPU, template, reasoning off)
Bascule perf->qualité. Runner reproductible: genere un cahier de notation aveugle
(out/results_blind.md) + cle (out/results_key.csv) sur 16 prompts FR (SUPPORT/SAFETY/
BOUNDARY/INSTRUCTION/GENERAL). Notation humaine, regle de decision dans PROTOCOLE.
Resout l'eval shell (avant: template non applique -> ramble anglais): -cnv + -sysf +
--reasoning off -> FR propre. out/ ignore (artefacts generes).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 22:24:23 +02:00
Richard Loyer a7c0e96793 RAPPORT §7: piste kernel GDN fermee — GDN-compute != goulot prefill (fork ql)
A/B pp512 mesure: serial f32=89.5 (vrai baseline) = fp16 89.65 = WY chunkwise 89.6.
3 schemas calcul GDN (0.5x/1x/2.5x flops) -> pp512 plat => l'arithmetique GDN ne
limite pas le prefill sur le fork ql (GDN-HTP). Mur ailleurs (denses/FFN/attn/op-batch).
Corrige premisse "GDN=ancre" (ancien tree GDN-CPU) et le baseline fantome "98".
Aucune optim kernel GDN (chunkwise/HMX/fp16) ne bouge le prefill.

ql -> 50e250d: fp16 serial validate (oracle 28/28, env KZ_F16 defaut OFF), WY chunkwise
conserve inutilise, HMX-per-tete NO-GO. Pousser pp512 = profiler ops non-GDN HTP.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 21:46:05 +02:00
Richard Loyer dd29169672 GDN chunkwise P1.2: VTCM state prefill=neutre, prouve compute-bound 3S2/tok -> gain=WY matmul (palier dur). oracle 28/28, pp98 2026-05-26 16:30:08 +02:00
Richard Loyer f638bdbd94 GDN chunkwise P1.1: chunk C=64 refactor neutre, oracle 28/28+pp98 OK, squelette pret pour intra-chunk batch 2026-05-26 16:15:55 +02:00
Richard Loyer 837d9de766 GDN chunkwise: doc P1 math+structure+gate (refactor chunks C=64 phase1) 2026-05-26 16:13:34 +02:00
Richard Loyer aa363e652f GDN chunkwise P0: oracle test-backend-ops 28/28 HTP0 (gate régression), baseline pp512=93, boucle build live; P1 chunk-f32 en cours 2026-05-26 16:04:58 +02:00
Richard Loyer de9543de2a Chantier4 GDN chunkwise: plan grounded metrics, kernel pp_thread sériel localisé, HMX core_dot_chunk_fp16 réutilisable, build htp-v79 incrémental OK
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 15:55:25 +02:00
Richard Loyer b2fc564f04 Engine sur fork qualcomm: decode dense 15.5>pte, 3.5 ~11, KVq8+t4+fa+lm_head-Q4; prefill 93/285; RAG cross 24-28k
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 15:53:14 +02:00
Richard Loyer 1252f32bd3 Rapport R&D complet: synthese session, perf, cascade, #277, briques, reste a faire
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 22:27:34 +02:00
Richard Loyer 9b3262a8aa R&D: battre pte=lm_head HMX INT4+spec decode+ctx binary; mur=lm_head CPU 2026-05-25 18:46:28 +02:00
Richard Loyer 025bdd87bd Briques: 2B 13, 4B 7, 9B 2.1; 2B sweet spot 2026-05-25 18:34:16 +02:00
Richard Loyer cbc379f9e5 Chiffres stables r3: 4B 9.8 9B 5.2 (r1 etaient bruit); engine tient, pte 4B devant 2026-05-25 17:41:08 +02:00
Richard Loyer 8cc9286f70 Correction: 9B CPU ~4.4 (t8 contention), <8B pte; 4B seul GGUF viable 2026-05-25 15:54:46 +02:00
Richard Loyer e462d7ce27 9B cible: 1-coeur in-app=0.16, t8=8.4; pte8B repli; merge=affinity 8 coeurs 2026-05-25 13:04:21 +02:00
Richard Loyer 7aae1f5fc7 Final: pte 4B 15/2.2GB > GGUF 0.32; merge=t8 mais pte reste mieux 4B; gguf utile=gros modeles 2026-05-25 12:21:04 +02:00
Richard Loyer cdb34a65f1 0.32 = 1 thread + HTP residuel; fix t8+ngl0 = 14tok/s 2026-05-25 11:18:38 +02:00
Richard Loyer 23f2c9fcfc #277: dist=static ngl0 OK; crash dev=stale shared so + ancienne signature 1-arg 2026-05-25 10:44:53 +02:00
Richard Loyer 9b62420089 v4 fix #277: ngl0 CPU decode 14tok/s, 4s/tour, usable 2026-05-25 10:18:31 +02:00
Richard Loyer 7a5780ca1d Bridge v3 utilisable: thinking-off ChatML, sys+usr, cap; static intact 2026-05-25 09:41:04 +02:00
Richard Loyer fe6826a3be Integration #277: hang=thinking non bride, fix budget0+cap; 4B>9B CPU 2026-05-25 09:38:25 +02:00
Richard Loyer 76f21a21cb Bridge STATIC autonome (42MB): zero NEEDED partage, fix collision TTS libllama, valide device 2026-05-24 22:43:45 +02:00
Richard Loyer f877902903 STATUS.md: validé/limites pour integrateur 2026-05-24 22:17:42 +02:00
Richard Loyer 9675280760 GDN chunkwise: HMX fp16 bloque bit-exact, HVX qf32 3-5sem; reste 55/15 CPU exact 2026-05-24 22:12:47 +02:00
Richard Loyer 1a6637bd67 TTS: Talker GGUF chargeable, audio e2e=JNI app non valide shell; GDN agent en cours 2026-05-24 22:12:23 +02:00
Richard Loyer c5c2738281 Valide device: generate() bout-en-bout OK (test_native), bridge pret integration 2026-05-24 22:05:44 +02:00
Richard Loyer 7dbf38db97 Doc complete: README+MODELS+PERF+PITFALLS, build nettoye 2026-05-24 21:59:56 +02:00
Richard Loyer 15b9baf6b2 JNI bridge complet: generate() prefill+decode, build arm64 OK (libkazeia_engine.so 209K) 2026-05-24 21:58:00 +02:00
Richard Loyer 0f92fa723f Dist Kazeia-Engine: libs arm64+headers+JNI bridge+INTEGRATION/TTS doc; STT reste ORT 2026-05-24 21:55:01 +02:00
Richard Loyer 1024167bdc Empreinte: engine GGUF 2.4/5.0 vs pte 3.3/5.9, -15-30% 2026-05-24 21:18:16 +02:00
Richard Loyer 9f7bc1e6c3 Comparatif FR: 9B>4B (psy juste vs derive role), engine OK budget0 2026-05-24 21:12:10 +02:00
Richard Loyer 431865f07f Fix cascade: reasoning-budget 0 (engine OK, FR coherent); A/B = JNI 2026-05-24 20:15:41 +02:00
Richard Loyer 25b1344c19 Cmp 4B/9B: 9B+riche, mais eval FR shell impossible, requiert JNI 2026-05-24 19:50:24 +02:00