Apertus xIELU formula / param-space mismatch — forward pass NaN's on real Apertus-8B Q4_K_S
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Accessibilité débutants
- 30/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Calme
- Stack technique
- kotlin
- Domaine
- backend, machine-learning
Piste de recherche
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.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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.
- Langage dominant
- Kotlin
- Étoiles
- 8
- Forks
- 3
- Merge moyen
- 19 h 45 min
- PR mergées (30 j)
- 38
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de SKaiNET-developers/SKaiNET-transformers
-
documentation good first issue size:xs skill:docs sub-issue
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
SKaiNET-developers/SKaiNET-transformers#478 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 4/5 3-5 jours Accessibilité débutants 48/100
SKaiNET-developers/SKaiNET-transformers#483 ·
Les mainteneurs répondent en général sous 1 jour
-
coding good first issue size:s skill:kotlin-core sub-issue
Difficulté 4/5 1-2 jours Accessibilité débutants 64/100
SKaiNET-developers/SKaiNET-transformers#477 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
coding good first issue size:s skill:numerics sub-issue
Difficulté 4/5 3-5 jours Accessibilité débutants 55/100
SKaiNET-developers/SKaiNET-transformers#476 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
moonshine stream: the final encoder window is zero-padded and the encoder has no attention maskOuverte
Difficulté 4/5 3-5 jours Accessibilité débutants 25/100
SKaiNET-developers/SKaiNET-transformers#458 ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de SKaiNET-developers/SKaiNET-transformers
Issues similaires
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
openbase/planetsudo.engine#107 ·
Les mainteneurs répondent en général sous 1 jour
-
native-cpu: -Wreturn-type in skainet_row_threads.c:150 (worker fn has no return)Peut-être pris @Doomguy-BFG9000 l’a pris aujourd’hui. Ouvertegood first issue size:xs skill:native
Difficulté 1/5 Moins d'une heure Accessibilité débutants 78/100
SKaiNET-developers/SKaiNET#1358 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 63/100
IBRAHIMDANS/i18nSupportPlus#577 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
PostHog/posthog-kmp#100 ·
Les mainteneurs répondent en général sous 2 jours
-
Toronto time zone missingOuvertefeature request needs triage
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
FossifyOrg/Clock#521 ·
Les mainteneurs répondent en général sous 1 jour