ホームへ戻る

GitHub Repo

TransformersコミュニティがRoPEの精度差を報告、読み込み後のbf16変換で長文脈の角度誤差が拡大する可能性

10月4日の再現報告によると、モデル読み込み後にbf16へ変換するとRoPEの周波数バッファーの精度も低下し、bf16で直接読み込む場合と結果が異なる可能性がある。コミュニティの修正案は10月5日にメンテナーによってクローズされ、実モデルの品質への影響や今後の対応は未確認だ。

Marcus Qwertyus · Public domain · Image source
zh-Hant

Transformersコミュニティは10月4日、一般的なbf16モデルの初期化方法2種類で、位置エンコーディングの数値が異なる可能性を報告した。この事例は5.18.0と当時のメインブランチで再現された。from_pretrained(dtype=torch.bfloat16)を使って直接読み込むと、RoPEのinv_freqはfp32のまま保持される。一方、読み込み後にmodel.to(torch.bfloat16)を呼び出すと、周波数バッファーもbf16に変換される。報告によると、Trainerのbf16_full_eval=Trueは後者の経路を通る。再現報告

この差は、長文脈における数値安定性に関わる。公式ドキュメントでは、RoPEは位置に応じてattentionのqueryベクトルとkeyベクトルを回転させ、モデルに相対位置情報を与えると説明されている。そのため、周波数値は回転角度の計算に直接使われる。この仕組みから考えると、周波数を低精度で丸めた後に大きな位置インデックスを掛けることで、角度のずれが拡大する可能性がある。RoPE公式ドキュメント

報告者は小型のLlama、32,768個の位置、fp32の参照値を使って比較した。bf16で直接読み込んだ場合の平均角度誤差は約0.0006ラジアンだったのに対し、読み込み後に変換した場合は約0.6733ラジアンだった。これは回転角度の測定値であり、回答の正答率や長文検索能力の低下幅に換算できるものではない。また、このテストではGPU、分散ラッパーで包まれたモデル、実際の重みを使った下流タスクの指標は検証されていない。テスト方法と制約

その後、コミュニティはPreTrainedModel._applyで該当するfp32バッファーを保持し、重みは指定どおりに変換しつつ、位置周波数は元の精度を維持する修正案を提案した。しかし、メンテナーは10月5日にこの方法を受け入れないと表明してPRをクローズした。ページには詳しい理由が記されていないため、現時点で上流に修正が取り込まれたとは言えない。修正案とメンテナーの回答

エンジニアリングチームにとって、この報告は長文脈の評価で精度変換の手順を記録する必要性を示している。同じ重みと入力を使い、dtypeを直接指定して読み込む場合、読み込み後に変換する場合、完全な評価フローを実行する場合を比較し、まず周波数バッファーを確認したうえで、logitsとタスク性能を測定することが推奨される。メンテナーが代替案を提示するか、実モデルやデプロイ先のハードウェアで品質への観察可能な影響が生じるかを、今後追跡する必要がある。

出典

  1. RoPE 頻率緩衝區轉型差異重現:Transformers issue #49288
  2. 保留 RoPE fp32 緩衝區修補提案:PR #49294,10 月 5 日關閉
  3. Rotary embeddings utilities