ホームへ戻る

GitHub Repo

TensorFlowコミュニティ、CPUでのバッチ行列乗算に異常を報告 特定のfloat32入力で誤った結果が出る可能性

10月23日のTensorFlowコミュニティからの報告によると、特定のCPU構成でfloat32のバッチ行列乗算を実行すると、警告なしに大きくずれた不定の結果が生じる可能性があります。報告には再現コードとoneDNNを無効にした比較テストが添えられていますが、根本原因、影響範囲、正式な修正はいずれも未確認です。

Max Eddy · CC BY-SA 4.0 · Image source
zh-Hant

TensorFlowのGitHubに10月23日、数値の正確性に関する報告が投稿されました。CPUで3次元のfloat32テンソルに対してtf.matmulを実行すると、バッチサイズが2~16で、積和の次元が20,000以上の場合に、例外や警告なしで明らかに誤った出力が得られることがあるというものです。報告者はTensorFlow 2.20.0および2.21.0で問題を確認しました。環境はWSL2上のUbuntuとAMD Ryzen 9 7950Xで、ほかのプロセッサやOSにも当てはまるかは分かっていません。コミュニティからの報告

報告では、NumPyのfloat64による結果を基準として、バッチ行列乗算、サンプルごとの2次元行列乗算、float64の経路を比較しています。テストでは後者2つは正常に動作しました。oneDNNを無効にすると、問題が起きていた組み合わせでも結果は基準値に近づきました。同じ入力で呼び出しを繰り返しても出力が変わることから、さらなる調査が必要ですが、これらの比較だけでは根本原因を特定できません。テストコードと出力

この演算自体はAPIの仕様に沿った使い方です。公式ドキュメントによると、tf.matmulは2次元以上のテンソルに対応し、最内側の2つの次元で行列乗算を行い、外側の次元をバッチとして扱います。そのため、同様の構成で異常が見られた場合、エンジニアリングチームは実際の演算形状と実行経路を確認し、小規模な参照計算で数値を検証する必要があります。処理が正常終了したかどうかだけに頼るべきではありません。研究用コードでは、誤った中間値によって後続のアルゴリズムが機能しなくなり、問題の切り分けが難しくなるおそれもあります。行列乗算のドキュメント

TensorFlowは以前、oneDNNの最適化では浮動小数点演算の順序が変わることで、わずかな数値差が生じる場合があると説明し、無効化する方法としてTF_ENABLE_ONEDNN_OPTS=0を案内しています。今回報告された差の大きさと、実行ごとに結果が変わる点については、別途検証が必要です。影響を懸念するチームは、TensorFlowの起動前にこの環境変数を設定して比較し、そのうえで性能への影響を評価できます。確認時点でこのIssueはオープンのままで、メンテナーによる再現確認の結論や修正へのリンクはありません。今後は、ほかのCPUでのテスト結果、Nightlyへの影響、最終的に修正が含まれるバージョンに注目する必要があります。oneDNNに関する公式説明

出典

  1. TensorFlow issue #129498:CPU float32 批次矩陣乘法錯誤回報
  2. tf.linalg.matmul API 文件
  3. What's new in TensorFlow 2.9?