From 376b4a4a70054402e951d34c628c79d4c1d7e63a Mon Sep 17 00:00:00 2001 From: Richard Loyer Date: Sun, 24 May 2026 12:52:08 +0200 Subject: [PATCH] Angle revise: base upstream master (pas chraac), trou unique = prefill GDN Hexagon Co-Authored-By: Claude Opus 4.7 (1M context) --- CLAUDE.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 692fe55..c775d18 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -18,16 +18,19 @@ Sur SM8750, Qwen3.5-4B-Q4_0, **decode M=1 = memory-bandwidth bound**, pas comput | briques DSP-first custom | 5.3 | 26 | crash ~12min, abandonné | → **Angle = NPU prefill / CPU decode, exactement ce que fait llama.cpp+chraac.** Tout DSP-first sur decode plafonne (~5 tok/s) ; gros vocab + tied embeds bloque spec-dec. CPU NEON bat le HVX 3.4× sur Q6_K M=1. Bonus DDDA : 75% des couches O(1) → decode stable en long contexte. -## Socle -- `/opt/Kazeia/chraac-llama` (branch dev-refactoring 897501a) — llama.cpp + backend Hexagon = point de départ. Decode CPU + prefill HMX. -- ExecuTorch GitHub — référence/qnn_llama_runner, à dépasser pas dépendre. -- `briques-archive/` + mémoires `project_briques_qwen35*` — kernels HVX (Q6_K valign, q4x4x2 repack), pièges V79 0x2e, oracle ggml. Lire avant kernels. -- HW: i8mm+bf16+dotprod, **PAS de SVE** ; LPDDR5x ~77 GB/s, CPU eff ~25. Build `-O3 -march=armv8.6-a+dotprod+fp16+i8mm+bf16`, ggml=chraac (jamais whisper.cpp/upstream → RTF 1.5). +## Base = llama.cpp upstream master (ne PAS forker chraac) +Upstream `ggml-org/llama.cpp` a le backend Hexagon officiel Qualcomm : `libggml-hexagon` (CPU) + HTP `libggml-htp-v79.so` (notre V79), sélection auto runtime, actif (avril 2026: Linux NPU, cumsum, argsort, op-batching). chraac = fork perso superseded. Decode CPU NEON mûr déjà là. +- ExecuTorch — référence à dépasser, pas dépendance. +- `briques-archive/` + mémoires `project_briques_qwen35*` — pièces : pièges V79 0x2e, q4x4x2/Q6_K valign, oracle ggml. À ne pas refaire DSP-first. +- HW: i8mm+bf16+dotprod, **PAS de SVE** ; LPDDR5x ~77 GB/s, CPU ~25. -## Plan d'attaque mémoire-mini -1. Bench chraac CPU+HTP sur Qwen3-4B (match ExecuTorch?) + Qwen3.5-4B Q4_0 pure. -2. Mémoire mini : poids Q4_0/embeds Q6_K, prefill HTP / decode CPU, pas de double-copie poids ; viser <4 GB pour 4B. -3. Refacto Phase 8 si gap : repack Q4_0 8x8 NEON decode + HMX prefill. +## Le seul vrai trou = prefill GDN Qwen3.5 sur Hexagon +- Qwen3-4B prefill → HTP standard, flag de build, livré (159 tok/s). Qwen3.5 decode → CPU récurrent, livré. Qwen3.5 prefill: 8 FullAttn → HTP, 24 GDN → scan chunkwise, **pas de kernel HTP** (GDN fusionné = CUDA/Vulkan only). Decode toujours CPU pour les deux, verrouillé. +- ⚠ `to_delete/llama.cpp` a déjà `qwen3next` + `ggml_backend_hexagon_qwen35_compile` : amorce GDN-HTP existante → BENCHER avant d'écrire un kernel. +- Charge Kazeia: prefill 500-2000 tok/tour, CPU ~75 → 7-27s, HTP → 3-13s. Utile, pas vital. + +## Identité projet — A vs B (Richard tranche) +A = intégration+tuning upstream (produit, vite, low-risk). B = kernel GDN prefill Hexagon (mémoire, contribuable upstream, zone kernel-frontière). Sain: A colonne + B recherche. Baseline à mesurer d'abord: prefill GDN CPU Qwen3.5-4B. ## Limite assistant R&D LLM frontière (kernels HVX bit-exacts, quant) = aide partielle, je le dis au cas par cas.