Apertus xIELU formula / param-space mismatch — forward pass NaN's on real Apertus-8B Q4_K_S
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 30/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Tranquilla
- Stack tecnologico
- kotlin
- Ambito
- backend, machine-learning
Direzione di ricerca
Read ApertusXIELU.kt at line 27 and compare its activation formula with the Hugging Face Apertus modeling code; inspect the layer 0 parameters in the reference checkpoint and compare them with the GGUF values. The issue also points to ApertusWeightLoader.kt, the DSL wiring in apertusNetwork(), and ApertusRealGgufLoadingTest for a forward pass probe. Done means identifying the source of the NaNs and confirming the corrected activation produces finite logits.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
After PR #102 the load → convert → fromWeights → forward chain runs to completion against unsloth/Apertus-8B-Instruct-2509-GGUF (Q4_K_S) — but the logit vector is all-NaN at the first forward pass. The propagation source is ApertusXIELU.xielu(buf, params) in layer 0.
Diagnosis
ApertusXIELU.kt evaluates:
alpha_p_eff = softplus(alpha_p)
alpha_n_eff = beta + softplus(alpha_n)
if x > 0: alpha_p_eff * x*x + beta * x
else: (expm1(min(x, eps)) - x) * alpha_n_eff + beta * x
with softplus(x) = if (x > 20) x else ln(1 + exp(x)).
The unsloth GGUF stores per-layer xIELU params (verified via gguf Python lib):
| layer | alpha_p | alpha_n | beta | eps |
|---|---|---|---|---|
| 0 | 166.0 | 40.75 | 0.5 | -9.98e-7 |
| 1 | 174.0 | 31.625 | 0.5 | -9.98e-7 |
| 2 | 128.0 | 22.875 | 0.5 | -9.98e-7 |
| … | (decaying) | (decaying) | 0.5 | -9.98e-7 |
| 11 | -0.477 | … | 0.5 | -9.98e-7 |
| … | (small / negative) | … | 0.5 | -9.98e-7 |
For layer 0, softplus(166) ≈ 166 (the > 20 shortcut applies), so the activation collapses to 166·x² + 0.5·x. Any input value |x| past a few causes the FFN output to overflow, and the post-FFN matmul + residual chain NaN-poisons the rest of the forward.
Hypothesis
Either:
- The unsloth GGUF stores
alpha_p/alpha_nin a different transform space thanApertusXIELU.ktexpects.softplus(stored)may already be applied (i.e. these are the post-softplusalpha_p_effvalues, not the raw learned parameters). In that case the right thing is to drop thesoftpluscalls in the activation and use the stored values directly — which would still leave layer 0 withalpha_p_eff = 166, and the activation would still overflow for any non-trivial input. ApertusXIELU.kt's formula diverges from the Apertus-8B reference. Possible candidates:- The reference may scale
alpha_pby some normalization factor. - The
if x > 0branch might usealpha_p_eff * (e^x - x - 1)(an ELU-like form) rather thanalpha_p_eff * x². beta,eps, etc. may participate in a different combination.
- The reference may scale
- The unsloth converter is upstream-buggy and writes the wrong values in the wrong fields.
What to verify
- Pull the HF reference checkpoint
swiss-ai/Apertus-8B-Instruct-2509and inspect the actualact_fnparameter values for layer 0 — see whether they match the unsloth-stored values or are very different (e.g. small). - Diff
ApertusXIELU.xieluagainst the activation forward in the HF Apertus modeling code (modeling_apertus.pyor similar). - Quick sanity probe: replace
ApertusXIELUwith a no-op linear (or withsilu) and re-run the forward pass. If logits become finite, the failure is fully inside xIELU. - If a different unsloth quant of Apertus is available, repro under it to rule out a unsloth-conversion glitch isolated to Q4_K_S.
Where the formula lives
llm-inference/apertus/src/commonMain/kotlin/sk/ainet/models/apertus/ApertusXIELU.kt:27- The DSL wiring is
apertusNetwork()line 65:stage.xielu(id = \"act_fn\"). The DSL-emitted op is in skainet-lang-core; need to confirm it computes the same thing asApertusXIELU.xielureference. - Per-layer params are loaded by
extractXIELUParams/extractXIELUParamsFromStreamingMetainApertusWeightLoader.kt, then converted to scalar tensors namedblk.N.mlp.act_fn.{alpha_p,alpha_n,beta,eps}byApertusNetworkLoader.applyWeightsToNetwork.
Out of scope
This issue is only about the activation. Loader / module construction / Q4_K dispatch are all correct (PR #102 verified loader + fromGguf().load() end-to-end on real Apertus-8B). When the activation is fixed, forward / generate / tool calling smoke tests in ApertusRealGgufLoadingTest should pass without further loader work.
- Lingua principale
- Kotlin
- Stelle
- 8
- Fork
- 3
- Merge medio
- 1g 16h
- PR unite (30g)
- 48
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di SKaiNET-developers/SKaiNET-transformers
-
documentation good first issue size:xs skill:docs sub-issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
SKaiNET-developers/SKaiNET-transformers#478 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement skill:kotlin-core
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
SKaiNET-developers/SKaiNET-transformers#502 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
SKaiNET-developers/SKaiNET-transformers#483 ·
I maintainer di solito rispondono entro 1 giorno
-
coding good first issue size:s skill:kotlin-core sub-issue
Difficoltà 4/5 1-2 giorni Idoneità per principianti 64/100
SKaiNET-developers/SKaiNET-transformers#477 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
coding good first issue size:s skill:numerics sub-issue
Difficoltà 4/5 3-5 giorni Idoneità per principianti 55/100
SKaiNET-developers/SKaiNET-transformers#476 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di SKaiNET-developers/SKaiNET-transformers
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
commons-app/apps-android-commons#7072 ·
I maintainer di solito rispondono entro 1 giorno
-
bug ci good first issue help wanted severity: medium
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
dhananjay-nautiyal/music#17 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Watch Next: last engagement time is in seconds for played items and in milliseconds for the othersAperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 79/100
damontecres/Wholphin#2112 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
beppe2880/opencode-mobile#60 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 72/100