ホームへ戻る

GitHub Repo

PyTorchコミュニティがCPUのlogit精度不具合を報告、0.5付近の半精度入力で結果が約半分に

10月6日に報告されたPyTorch 2.14のCPUでの再現例では、logitの中間演算での丸めにより、特定の半精度入力で相対誤差が約50%に達する可能性が示された。報告には入力の全数列挙と修正コードが含まれるが、修正は実際のビルドで検証されていない。

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月6日、CPUの数値精度に関する問題を報告した。torch.special.logitでfloat16およびbfloat16を処理すると、対数を取る前に重要な精度が失われる可能性があるという。報告された環境は、AVX512とMKLを備えたIntel Xeon上のPyTorch 2.14.0+cpu。float16入力が約0.499756の場合、出力は約−0.000488となる一方、float64の参照値は約−0.000977で、相対誤差はほぼ半分に達した。コミュニティでの再現報告

公式定義では、logitは log(x / (1 - x)) を計算し、epsを使って入力を指定範囲内に制限できる。xが0.5に近づくと比率は1に近づき、対数を取った結果はゼロに近づく。このとき、中間値の丸めによる絶対差がごく小さくても、相対誤差は大きくなり得る。入力範囲のクリッピングは主に境界への対処であり、範囲内の演算精度の問題を直接解消するものではない。APIドキュメント

報告者は、範囲内で表現可能な2種類の低精度入力をすべて列挙し、float64と比較した。その結果、CPUでは減算と除算が入力型の精度で先に丸められる一方、CUDAのコードでは先にfloatへ変換して演算することを指摘した。テストでは、先に x.float() を実行してlogitを計算し、その後で元の型に戻すと、最大誤差を0.5 ULPまで低減できた。ULPは、その数値付近における浮動小数点数の間隔を表す。テストとカーネルの分析

低精度の確率値を使ってキャリブレーション、統計変換、またはCPUでの後処理を行うエンジニアにとって、これは具体的な調査の手掛かりとなる。デバイス間の差を比較する際は、絶対誤差と相対誤差の両方を確認し、より高い精度で参照値を作るとよい。これは演算の仕組みから導かれる実務上の示唆であり、モデルの精度や学習損失への影響を示す十分な証拠は現時点でない。公式ドキュメントも、同じ入力であってもCPUとGPUの結果がビット単位で一致する保証はないと説明している。数値精度に関する説明

報告内の修正案は、中間演算をfloatで行い、最後に低精度へ戻すものだ。報告者はPyTorchをビルドできなかったと明記しており、修正の算術処理はNumPyで模擬検証したにとどまり、性能も測定していない。確認時点でissueは未解決のまま公開されている。今後は上流での実測、レビュー、リリースへの取り込み状況を確認する必要があり、提示されたコードを公開済みの修正とみなすことはできない。修正案の制約

出典

  1. CPU torch.special.logit 低精度中間捨入問題 #199867
  2. torch.special.logit — PyTorch 2.14 文件
  3. Numerical accuracy — PyTorch 2.14 文件