Skip to content

fix(modernbert): use config hidden_activation in MLP (support silu for Granite)#211

Open
amgix-dev wants to merge 1 commit into
StarlightSearch:mainfrom
amgix-dev:modernbert-mlp-activation
Open

fix(modernbert): use config hidden_activation in MLP (support silu for Granite)#211
amgix-dev wants to merge 1 commit into
StarlightSearch:mainfrom
amgix-dev:modernbert-mlp-activation

Conversation

@amgix-dev

Copy link
Copy Markdown

Problem

ModernBertMLP always used gelu_erf() on the gate branch of the gated FFN, regardless of config.json.

Models such as ibm-granite/granite-embedding-97m-multilingual-r2 set hidden_activation: "silu" (SwiGLU-style). Running them with GeGLU produces incorrect hidden states and poor embedding quality.

Solution

  • Add optional hidden_activation to Config (#[serde(default)] for backward compatibility)
  • Select MLP activation at load time:
    • "gelu"gelu_erf() (default when field is absent)
    • "silu"silu()

Backward compatibility

Existing ModernBERT checkpoints without hidden_activation in config continue to use gelu, matching current behavior.

Testing

Verified embedding parity against Sentence Transformers implementation:

  • ibm-granite/granite-embedding-97m-multilingual-r2 (hidden_activation: silu): Sentence Transformer parity, cosine ≈ 1.0
  • Alibaba-NLP/gte-modernbert-base (hidden_activation: gelu): Sentence Transformer parity, cosine ≈ 1.0

ModernBertMLP always applied gelu_erf on the gate tensor, but some
ModernBERT-based models (e.g. ibm-granite/granite-embedding-97m-multilingual-r2)
set hidden_activation: "silu" in config.json.

Read hidden_activation from config (default: gelu) and use the matching
gated-FFN activation. Missing config field keeps existing GeGLU behavior.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant