Instructions to use dartags/DanbotNL-2408-260M with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use dartags/DanbotNL-2408-260M with Transformers:
# Load model directly from transformers import AutoModelForPreTraining model = AutoModelForPreTraining.from_pretrained("dartags/DanbotNL-2408-260M", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
Add Transformers 5 compatibility while preserving Transformers 4 behavior
Transformers V5がModernBERTその他をぶっ壊して、最新5.17.0でも直ってないのでそれへの対応です。
概要
DanbotNL の custom code を、Transformers 4.49 / 4.57 と Transformers 5.17 の両方で同じ推論結果になるように互換修正するPRです。
ウェイトや config.json の変換は行っていません。修正対象は以下の3ファイルだけです。
configuration_danbot_nl.pymodeling_danbot_nl.pyprocessor_danbot_nl.py
主な目的は、Transformers 5 で単にロード可能にするだけではなく、DanbotNL が学習時/従来環境で使っていた Transformers 4.49 + BF16 + SDPA の挙動を保つことです。
背景
Transformers 5 では DanbotNL に影響する互換境界がいくつかありました。
tokenizer の再構築経路
- legacy metadata を
AutoTokenizerで再解釈すると、v5 では encoder tokenizer の token ID が変わるケースがありました。 tokenizer.jsonを実体の authority としてPreTrainedTokenizerFast経由で読み込むようにしています。
- legacy metadata を
composite config の扱い
- outer config が encoder/decoder の nested config を持つ構造なので、v5 generation helper が decoder config を正しく参照できるよう
get_text_config()等を明示しました。
- outer config が encoder/decoder の nested config を持つ構造なので、v5 generation helper が decoder config を正しく参照できるよう
ModernBERT の RoPE 数値挙動
- v5 では rotary 演算の dtype 経路が変わり、BF16 で小さい数値差が出ました。
- DanbotNL の projector は従来の encoder feature を前提としているため、v5 の encoder 呼び出し中だけ従来の演算を再現します。
ModernBERT の feature semantics
hidden_states[-1]が v4.49 で DanbotNL が使っていた semantic boundary と同じとは限らなくなったため、final_normの直前の feature を明示的に取得します。
ModernBERT attention mask の構築経路
- v5 の generic mask builder 経路では logical mask は同じでも BF16 + SDPA の数値結果が完全一致しませんでした。
- v5 では v4 と同じ additive full/sliding mask を明示的に materialize します。
processor の chat template 定数名
- 4.49 の
CHAT_TEMPLATE_NAMEと、4.57+/5.x の legacy JSON filename 定数の差を吸収しています。
- 4.49 の
検証
同一の deterministic 24ケースを使い、通常の remote-code 経路
AutoProcessor.from_pretrained(..., trust_remote_code=True)
AutoModelForPreTraining.from_pretrained(..., trust_remote_code=True, attn_implementation="sdpa")
で比較しました。
| Transformers | token exact | raw text exact |
|---|---|---|
| 4.49.0 | 24/24 | 24/24 |
| 4.57.6 | 24/24 | 24/24 |
| 5.17.0 | 24/24 | 24/24 |
さらに cutoff_02 の ModernBERT pre-final-norm encoder feature は、4.49.0 / 4.57.6 / 5.17.0 の全組み合わせで bit-exact でした。
max_abs = 0.0
mean_abs = 0.0
5.17 では tokenizer class 名は TokenizersBackend になりますが、これは v5 側の通常の Rust tokenizer backend で、token/output parity は維持されています。
補足
途中で Transformers 5 の non-persistent buffer regression も疑いましたが、専用Probeでは DanbotNL の residual mismatch の原因ではないことを確認しています。
今回の変更は 重みを変更せず、custom code 側だけで v4/v5 の behavioral compatibility を維持することを狙ったものです。
もし方針として「v5 の新しい数値挙動を正として移行する」ほうが望ましければ、この互換shimを別の形に整理することもできます。ただ、現状のcheckpointの従来出力を維持するという観点では、この修正で 4.49 / 4.57 / 5.17 を同一出力にできています。