Transformers
Safetensors
Japanese
English
danbot_nl
pretraining
custom_code

Add Transformers 5 compatibility while preserving Transformers 4 behavior

#2
by John6666 - opened

Transformers V5がModernBERTその他をぶっ壊して、最新5.17.0でも直ってないのでそれへの対応です。


概要

DanbotNL の custom code を、Transformers 4.49 / 4.57 と Transformers 5.17 の両方で同じ推論結果になるように互換修正するPRです。

ウェイトや config.json の変換は行っていません。修正対象は以下の3ファイルだけです。

  • configuration_danbot_nl.py
  • modeling_danbot_nl.py
  • processor_danbot_nl.py

主な目的は、Transformers 5 で単にロード可能にするだけではなく、DanbotNL が学習時/従来環境で使っていた Transformers 4.49 + BF16 + SDPA の挙動を保つことです。

背景

Transformers 5 では DanbotNL に影響する互換境界がいくつかありました。

  1. tokenizer の再構築経路

    • legacy metadata を AutoTokenizer で再解釈すると、v5 では encoder tokenizer の token ID が変わるケースがありました。
    • tokenizer.json を実体の authority として PreTrainedTokenizerFast 経由で読み込むようにしています。
  2. composite config の扱い

    • outer config が encoder/decoder の nested config を持つ構造なので、v5 generation helper が decoder config を正しく参照できるよう get_text_config() 等を明示しました。
  3. ModernBERT の RoPE 数値挙動

    • v5 では rotary 演算の dtype 経路が変わり、BF16 で小さい数値差が出ました。
    • DanbotNL の projector は従来の encoder feature を前提としているため、v5 の encoder 呼び出し中だけ従来の演算を再現します。
  4. ModernBERT の feature semantics

    • hidden_states[-1] が v4.49 で DanbotNL が使っていた semantic boundary と同じとは限らなくなったため、final_norm の直前の feature を明示的に取得します。
  5. ModernBERT attention mask の構築経路

    • v5 の generic mask builder 経路では logical mask は同じでも BF16 + SDPA の数値結果が完全一致しませんでした。
    • v5 では v4 と同じ additive full/sliding mask を明示的に materialize します。
  6. processor の chat template 定数名

    • 4.49 の CHAT_TEMPLATE_NAME と、4.57+/5.x の legacy JSON filename 定数の差を吸収しています。

検証

同一の 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 を同一出力にできています。

p1atdev changed pull request status to merged

Sign up or log in to comment