ホームへ戻る

GitHub Repo

PyTorchコミュニティがCUDA補間のショートカットに不具合を報告、出力サイズが同じ場合にリサンプリングをスキップする可能性

PyTorch開発版での再現例では、非整数の倍率でも出力サイズが入力と同じになると、CUDAの双三次補間が入力値をそのまま返す場合があります。コミュニティから修正案が提出されていますが、まだマージされておらず、正式リリースへの影響範囲は確認されていません。

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月3日、画像リサンプリングで気付きにくい数値エラーが起きると報告しました。CUDAの eager 実行で F.interpolate に双三次補間を指定した場合、倍率が1でなくても、計算後の出力サイズが入力と同じなら補間がスキップされる可能性があります。再現例の環境は開発版 2.15.0a0、CUDA 12.6、RTX A6000です。この報告だけから、すべての正式リリースが影響を受けるとは判断できません。問題報告

再現コードでは、4×4テンソルに scale_factor=(1.2,1.2)、mode='bicubic'、align_corners=False を指定しても、出力は4×4のままでした。報告者がCPUの倍精度結果を基準に比較したところ、CUDA eager実行での最大絶対誤差は約1.673でした。一方、CPUの単精度とCUDAの torch.compile 経路では、誤差は約100万分の1以下でした。この比較では、差は通常の浮動小数点丸め誤差を大きく上回っています。再現方法と測定結果

技術的な要点は、出力形状が同じでもサンプリング座標が同じとは限らないことです。公式ドキュメントによると、align_corners=False はピクセル境界を基準に位置を合わせます。また、recompute_scale_factor=True を指定すると、まず出力サイズを計算し、その後に補間倍率を導出するため、元の倍率を直接使う場合とは結果が異なることがあります。したがって、テンソルのサイズだけを確認して演算を省略できるかどうかを判断するのは不十分です。APIドキュメント

同日に提出された修正案は、「同じサイズならコピーする」高速経路が原因だとし、明示された倍率が1であるか、倍率が指定されていない場合に限って補間をスキップするよう提案しています。提案は複数のCPU、CUDA、量子化カーネルを対象としていますが、これは提案者が示した修正範囲です。元の再現例が直接裏付けているのは、CUDAの双三次補間のケースです。確認時点で提案はオープンのままで、修正がリリースされた証拠はありません。修正案

視覚モデルのエンジニアにとって、この事例は、前処理や特徴マップのリサイズに非整数の倍率を使う場合、小さなテンソルでは形状だけでなく数値も照合する必要があることを示しています。実務では、出力サイズが同じになる非単位倍率の回帰テストを追加し、CPU、CUDA、コンパイル経路の結果を比較できます。今後は修正案のレビュー、影響を受けるバージョン、ほかの補間モードでの検証結果を追う必要があります。実際のモデル精度への影響を定量化する証拠は、現時点ではありません。

出典

  1. CUDA F.interpolate(mode="bicubic") incorrectly returns the input when a non-unit scale_factor rounds to the same output size
  2. Fix F.interpolate incorrectly using identity shortcut when scale_factor != 1.0
  3. torch.nn.functional.interpolate — PyTorch 2.14 documentation