[Bug][torchlib] aten_scatter_reduce(include_self=False) uses finite finfo.min/max instead of -inf/+inf, corrupting +/-inf inputs
I maintainer di solito rispondono entro 2 giorni
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 72/100
Direzione di ricerca
Leggi aten_scatter_reduce in onnxscript/function_libs/torch_lib/ops/core.py intorno alle righe 9169–9198, poi controlla i test esistenti per scatter reduce. Riproduci il problema con include_self=False e valori sorgente infiniti per amax e amin nei tipi di dati in virgola mobile indicati. Il lavoro è completato quando i risultati ONNX esportati preservano gli infiniti attesi e il comportamento per gli interi rimane corretto.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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.)
- Lingua principale
- Python
- Stelle
- 456
- Fork
- 159
- Merge medio
- 3g 5h
- PR unite (30g)
- 23
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di microsoft/onnxscript
-
`fuse_skip_rms_normalization` fuses a float16 residual into a norm whose scale is float32, which ONNX Runtime rejectsForse già presa @justinchuby l’ha presa 8 giorni fa. Apertamodule: optimizer
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
microsoft/onnxscript#3155 · 3 commenti · 1 reazione · 2 assegnatari ·
I maintainer di solito rispondono entro 2 giorni
-
Constant folding uses onnx's plain reference ops, never onnx.reference.ops_optimizedForse già presa @todkarsant l’ha presa 8 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
microsoft/onnxscript#3003 · 3 commenti ·
I maintainer di solito rispondono entro 2 giorni
-
CI : Pin github actions to full commit SHAForse già presa @Aniketsy l’ha presa 193 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
microsoft/onnxscript#2903 · 6 commenti ·
I maintainer di solito rispondono entro 2 giorni
-
CastCast rewrite changes rounding for DOUBLE inputs by removing the FLOAT intermediateForse già presa @itsrayeedscodespace l’ha presa 1 giorno fa. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 35/100
microsoft/onnxscript#3204 ·
I maintainer di solito rispondono entro 2 giorni
-
Partial rotary fusion sets `rotary_embedding_dim` without `num_heads`, which ONNX Runtime requiresForse già presa @justinchuby l’ha presa 3 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 25/100
microsoft/onnxscript#3185 ·
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di microsoft/onnxscript
Issue simili
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
Cygnux-Labs/Tracekit#827 ·
I maintainer di solito rispondono entro 1 giorno
-
SPIDevice selects an active-high device as soon as it is createdForse già presa @mikeysklar l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 73/100
adafruit/circuitpython#11869 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 80/100
glossyio/traffic-monitor#312 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
narwhals-dev/narwhals#4154 ·
I maintainer di solito rispondono entro 1 giorno