[Bug][torchlib] aten_scatter_reduce(include_self=False) uses finite finfo.min/max instead of -inf/+inf, corrupting +/-inf inputs

Aperta Adatta ai principianti
#3,200 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

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
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
python, pytorch
Ambito
backend, testing

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" uses np.finfo(np_dtype).min / torch.finfo(torch.bfloat16).min for floating-point dtypes instead of -float("inf").
  • reduce == "amin" uses np.finfo(np_dtype).max / torch.finfo(torch.bfloat16).max for floating-point dtypes instead of +float("inf").
    (Integer dtypes do not have ±inf, so np.iinfo(np_dtype).min / max remains the exact identity there.)
Environment
  • onnxscript: 0.7.2 and main (f51083c)
  • torch: 2.11.0+cpu
  • onnx: 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

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di microsoft/onnxscript

Tutte le issue di microsoft/onnxscript

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.