Skip to content

Commit 0bf6511

Browse files
YIWENX14meta-codesync[bot]
authored andcommitted
Preserve AvoEdge eager numeric parity (pytorch#24035)
Summary: Pull Request resolved: pytorch#24035 Preserve rlllama4x query scaling and weightless sandwich-norm semantics through the landed AvoEdge trainer-override path. Keep shared rlformers conversion defaults unchanged, validate legacy head-dimension fallback before division, and gate the dense ExecuTorch scaleless post-FFN norm on a dedicated AvoEdge field so Gemma2/3 shared post_ffn_norm behavior remains unchanged. Differential Revision: D125556968
1 parent d1f7f1f commit 0bf6511

2 files changed

Lines changed: 49 additions & 0 deletions

File tree

‎examples/models/llama/llama_transformer.py‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,11 @@ def __init__(
257257
eps=args.norm_eps,
258258
zero_centered_gamma=args.norm_zero_centered_gamma,
259259
)
260+
elif (
261+
getattr(args, "weightless_post_ffn_norm", False)
262+
and self.mlp_type != "skip"
263+
):
264+
self.post_ffn_norm = ScalelessRMSNorm(args.dim, eps=args.norm_eps)
260265

261266
@classmethod
262267
def from_type(cls, layer_id, args, rope) -> "TransformerBlock":

‎examples/models/llama/tests/test_transformer_block.py‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,54 @@
1313
TransformerBlock,
1414
)
1515
from executorch.examples.models.llama.model_args import ModelArgs
16+
from executorch.examples.models.llama.norm import (
17+
RMSNormWithInputScale,
18+
ScalelessRMSNorm,
19+
)
1620
from executorch.examples.models.llama.rope import Rope
1721

1822

1923
class TestTransformerBlock(unittest.TestCase):
24+
@staticmethod
25+
def _model_args(**overrides) -> ModelArgs:
26+
args = {
27+
"dim": 4,
28+
"hidden_dim": 8,
29+
"n_heads": 1,
30+
"n_kv_heads": 1,
31+
"head_dim": 4,
32+
**overrides,
33+
}
34+
return ModelArgs(**args)
35+
36+
def test_dedicated_weightless_post_ffn_norm(self) -> None:
37+
args = self._model_args()
38+
args.weightless_post_ffn_norm = True # pyrefly: ignore[missing-attribute]
39+
40+
block = TransformerBlock(args, AttentionSkip()).eval()
41+
42+
self.assertIsInstance(block.post_ffn_norm, ScalelessRMSNorm)
43+
44+
def test_learnable_post_ffn_norm_takes_precedence(self) -> None:
45+
args = self._model_args(use_ffn_learnable_scales=True)
46+
args.weightless_post_ffn_norm = True # pyrefly: ignore[missing-attribute]
47+
48+
block = TransformerBlock(args, AttentionSkip()).eval()
49+
50+
self.assertIsInstance(block.post_ffn_norm, RMSNormWithInputScale)
51+
52+
def test_shared_post_ffn_norm_does_not_select_weightless_norm(self) -> None:
53+
args = self._model_args(post_ffn_norm=True)
54+
55+
block = TransformerBlock(args, AttentionSkip()).eval()
56+
57+
self.assertFalse(hasattr(block, "post_ffn_norm"))
58+
59+
def test_default_has_no_post_ffn_norm(self) -> None:
60+
block = TransformerBlock(self._model_args(), AttentionSkip()).eval()
61+
62+
self.assertFalse(hasattr(block, "post_ffn_norm"))
63+
2064
def test_zero_centered_gamma_applies_to_main_norms(self) -> None:
2165
args = ModelArgs(
2266
dim=4,

0 commit comments

Comments
 (0)