[Bug][torchlib] aten_scatter_reduce(include_self=False) uses finite finfo.min/max instead of -inf/+inf, corrupting +/-inf inputs
メンテナーはふだん 2 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 72/100
調査の方向性
onnxscript/function_libs/torch_lib/ops/core.pyの9169~9198行付近にあるaten_scatter_reduceを読み、既存のscatter reduceテストを確認してください。指定された浮動小数点データ型全体で、include_self=Falseと無限大のソース値を使い、amaxとaminを再現してください。エクスポートされたONNXの結果で期待される無限大が保持され、整数の動作も正しい状態になれば完了です。
索引モデルが issue の本文から書いたものです。
説明
Describe the bug
When include_self=False and reduce="amax" or reduce="amin", aten_scatter_reduce in onnxscript/function_libs/torch_lib/ops/core.py (lines 9169–9198) pre-fills impacted target indices before calling op.ScatterElements(..., reduction="max" | "min").
Although the comment on line 9169 notes # fill a dummy value (inf or -inf), the implementation fills finite np.finfo(dtype).min / np.finfo(dtype).max (±3.4028235e+38 for float32, ±65504.0 for float16) and torch.finfo(torch.bfloat16).min / max (±3.3895314e+38 for bfloat16) instead of IEEE-754 -inf / +inf.
As a result, whenever src contains -inf (under reduce="amax") or +inf (under reduce="amin"), max(-3.4028235e38, -inf) / min(+3.4028235e38, +inf) silently produces a finite float instead of -inf / +inf across float16, bfloat16, float32, and float64.
Minimal Reproduction
import onnx.reference
import torch
class ScatterReduceMaxNoSelf(torch.nn.Module):
def forward(self, x: torch.Tensor, index: torch.Tensor, src: torch.Tensor) -> torch.Tensor:
return torch.scatter_reduce(x, 0, index, src, reduce="amax", include_self=False)
model = ScatterReduceMaxNoSelf()
x = torch.tensor([10.0, 20.0], dtype=torch.float32)
index = torch.tensor([0], dtype=torch.int64)
src = torch.tensor([-float("inf")], dtype=torch.float32)
eager_out = model(x, index, src)
prog = torch.onnx.export(model, (x, index, src), dynamo=True)
ref = onnx.reference.ReferenceEvaluator(prog.model_proto)
(onnx_out,) = ref.run(None, {"x": x.numpy(), "index": index.numpy(), "src": src.numpy()})
print("PyTorch eager:", eager_out) # tensor([-inf, 20.])
print("ONNX exported:", onnx_out) # [-3.4028235e+38 20. ]
Root Cause
In onnxscript/function_libs/torch_lib/ops/core.py (aten_scatter_reduce):
reduce == "amax"usesnp.finfo(np_dtype).min/torch.finfo(torch.bfloat16).minfor floating-point dtypes instead of-float("inf").reduce == "amin"usesnp.finfo(np_dtype).max/torch.finfo(torch.bfloat16).maxfor floating-point dtypes instead of+float("inf").
(Integer dtypes do not have±inf, sonp.iinfo(np_dtype).min/maxremains the exact identity there.)
Environment
onnxscript:0.7.2andmain(f51083c)torch:2.11.0+cpuonnx:1.23.2
(Note: I noticed #3094 is currently open touching aten_scatter_reduce for reduce="mean", so I avoided opening a competing PR to prevent merge conflicts—happy to submit a small fix with float/int dtype tests once #3094 lands if helpful.)
- 主要言語
- Python
- スター
- 456
- フォーク
- 159
- 平均マージ
- 3日 5時間
- マージ済み PR(30日)
- 23
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
microsoft/onnxscript のほかの issue
-
`fuse_skip_rms_normalization` fuses a float16 residual into a norm whose scale is float32, which ONNX Runtime rejects対応中かも @justinchuby が 8 日前に担当しました。 オープンmodule: optimizer
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
microsoft/onnxscript#3155 · コメント 3 件 · リアクション 1 件 · 担当者 2 名 ·
メンテナーはふだん 2 日以内に返信
-
Constant folding uses onnx's plain reference ops, never onnx.reference.ops_optimized対応中かも @todkarsant が 8 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
microsoft/onnxscript#3003 · コメント 3 件 ·
メンテナーはふだん 2 日以内に返信
-
CI : Pin github actions to full commit SHA対応中かも @Aniketsy が 193 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
microsoft/onnxscript#2903 · コメント 6 件 ·
メンテナーはふだん 2 日以内に返信
-
CastCast rewrite changes rounding for DOUBLE inputs by removing the FLOAT intermediate対応中かも @itsrayeedscodespace が 1 日前に担当しました。 オープン
難易度 3/5 1〜2日 初心者へのやさしさ 35/100
microsoft/onnxscript#3204 ·
メンテナーはふだん 2 日以内に返信
-
Partial rotary fusion sets `rotary_embedding_dim` without `num_heads`, which ONNX Runtime requires対応中かも @justinchuby が 3 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 25/100
microsoft/onnxscript#3185 ·
メンテナーはふだん 2 日以内に返信
microsoft/onnxscript の issue をすべて見る
似ている issue
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
Cygnux-Labs/Tracekit#827 ·
メンテナーはふだん 1 日以内に返信
-
SPIDevice selects an active-high device as soon as it is created対応中かも @mikeysklar が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 73/100
adafruit/circuitpython#11869 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 80/100
glossyio/traffic-monitor#312 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
narwhals-dev/narwhals#4154 ·
メンテナーはふだん 1 日以内に返信