diff --git a/CHANTIER_HMX_DENSE.md b/CHANTIER_HMX_DENSE.md index b913f7b..6b986cb 100644 --- a/CHANTIER_HMX_DENSE.md +++ b/CHANTIER_HMX_DENSE.md @@ -53,6 +53,30 @@ Hypothèses **éliminées** par mesure (OPLOG + isolation) : **Conclusion** : crash **value/context-spécifique** — un pattern de valeurs réelles (non reproduit par du random synthétique), OU un état de contexte/VTCM/session hérité des ops précédentes (FA), qui fait fauter le MAC HMX. +## Avancement #2 (dump-and-replay) — signature NON-DÉTERMINISME / mémoire non-initialisée +- **Replay** : l'activation réelle du o_proj injectée dans le matmul isolé (test-backend-ops, poids q4_0 + aléatoire) → **HTP0=NaN** en sortie (vs random→fini), MAIS **pas de crash** en isolation. Donc le matmul + ne crashe pas seul ; il PRODUIT/propage un NaN à partir de cette activation, et le crash 0x2e est en aval. +- **Analyse de l'activation capturée** (`kz_act.bin`, f32 [4096,38]) : **94% de zéros + 8987 −inf**. + MAIS un run OPLOG précédent du MÊME op disait `inf=0 amax=9.8`. → **non-déterminisme** (le prefill HTP est + non-déterministe, déjà observé : 1er token 271 vs 15 selon les runs) ET/OU **capture peu fiable** si le + src1 du o_proj est une **view non-contiguë** (lire `ggml_nbytes` octets attrape de la mémoire non-init). +- **OPFILTER=FLASH_ATTN_EXT** (FA→CPU) : **ne stoppe PAS** le crash. Donc le −inf ne vient pas (que) de FA. +- **Seuil** : n≤32 (~12 mots, 1 tuile N) OK ; n>32 (~16 mots, 2 tuiles) crashe. Mais le synthétique n=38 + (2 tuiles) ne crashe pas → ce n'est pas le multi-tuile seul. + +**Faisceau d'indices → mémoire non-initialisée lue par le chemin HTP** (la non-déterminisme en est la +signature classique ; le « 94% zéros + qq −inf » ressemble à un buffer partiellement écrit). Candidats : +staging activation/poids VTCM non zéro-paddé pour n>32 multi-tuiles, ou un buffer de sortie/accumulateur +réutilisé sans reset entre ops dans la séquence du modèle (absent en isolation synthétique). + +## Limite atteinte (honnête) +Le root cause est un **fault HMX non-déterministe** (mémoire non-init probable) dans la région o_proj/FA à n>32, +qui ne se reproduit pas en isolation synthétique. Le **pinner exactement demande de l'instrumentation côté DSP** +(dump des buffers VTCM/activation DANS le skel, au moment du MAC) — **bloquée sans root** (FARF inaccessible, +getenv inopérant côté skel). C'est du debug niveau backend Qualcomm. Outils CPU-side (OPLOG/DUMP) committés et +réutilisables ; la suite nécessite soit un device rooté (capture FARF), soit un log-vers-buffer-hôte ajouté au skel. + ## Prochaines étapes (révisées après l'avancement ci-dessus) 1. **Dump-and-replay** (tranche value-vs-context) : capturer la vraie activation `[4096,38]` + le poids q4_0 du o_proj fautif (CPU-side dans `enqueue_op`, écrire en fichier), puis rejouer EXACTEMENT ces octets dans un diff --git a/dist/lib/libggml-hexagon.so b/dist/lib/libggml-hexagon.so index da8881a..65e6b93 100755 Binary files a/dist/lib/libggml-hexagon.so and b/dist/lib/libggml-hexagon.so differ diff --git a/ql b/ql index 5e054ee..956f72f 160000 --- a/ql +++ b/ql @@ -1 +1 @@ -Subproject commit 5e054eed6ae3eff3bc5c45f7a12a6edc1daf0872 +Subproject commit 956f72ffe4fe2758e7c5236ac8ea84752a48f7e3