ホームへ戻る

GitHub Repo

PyTorchコミュニティがCPUでの分散のオーバーフローを報告、大きな定数テンソルが無限大を返す可能性

10月8日のPyTorch開発版での報告によると、CPU上で大きな定数テンソルの分散と標準偏差を計算すると、誤って無限大が返る場合があります。報告には最小再現例とアルゴリズムの分析が含まれていますが、正式リリースへの影響範囲と上流での修正はまだ確認されていません。

Pytorch Deepdream (https://github.com/gordicaleksa/pytorch-deepdream) by gordicaleksa (https://github.com/gordicaleksa/pytorch-deepdream/commits?author=gordicaleksa) · MIT · Image source
zh-Hant

PyTorchコミュニティは10月8日、数値安定性に関する問題を報告しました。CPU上で次元を指定せずに torch.var または torch.std を直接呼び出すと、一部の大きな定数テンソルで inf が返ります。報告者が挙げた環境は、2つの2.15開発版、aarch64のmacOS、x86_64のLinuxです。確認時点でissueはオープンのままで、関連する修正は記載されていません。コミュニティの報告

最小ケースでは、6つの要素すべてが 1e200 のfloat64テンソルを作成します。報告によると、torch.var(x) は無限大を返す一方、同じ入力に対する torch.var_mean(x)[0] はゼロを返します。公式ドキュメントでは、両者に同じ分散の式を使い、デフォルトの補正値はいずれも correction=1 と定義されています。6つのサンプルがすべて同じ値であれば分散はゼロになるため、自由度の設定ではこの差を説明できません。varのドキュメント、var_meanのドキュメント

報告者によるコードパスの分析では、この違いは内部のリダクションアルゴリズムに起因します。テンソル全体に対する var のCPU高速パスは、まず平均を求めてから偏差の二乗を累積します。平均値の丸め誤差によって大きな残差が残り、それを二乗するとfloat64で表現できる範囲を超えます。一方、var_mean はWelford更新を使う経路を通り、このケースでは今回のオーバーフローを回避します。この根本原因の分析は、現時点では報告者による見立てです。技術分析と再現例

エンジニアリングチームにとって、これは統計値の異常を調べる際の具体的な手掛かりになります。前処理や研究コードで分散が無限大になった場合は、2つのAPIの結果を比較し、入力サイズ、精度、実行環境を固定して確認できます。これはこのケースから導かれる診断上の提案です。一般的なモデル学習に広く影響しているという証拠はなく、APIの置き換えを汎用的な修正とみなすこともできません。

今後は、メンテナーが正式版への影響範囲を確認するか、また極端な値を扱いながら高速パスの性能を維持する修正を行うかに注目する必要があります。検証では、単一のケースが正常化しただけで数値問題全体が解決したと判断しないよう、異なるテンソルサイズや次元を指定したリダクションも対象にするべきです。

出典

  1. PyTorch issue #200235:CPU 全張量變異數與標準差溢位回報
  2. torch.var — PyTorch 2.14 documentation
  3. torch.var_mean — PyTorch 2.14 documentation