CastCast rewrite changes rounding for DOUBLE inputs by removing the FLOAT intermediate
I maintainer di solito rispondono entro 2 giorni
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 35/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Ferma
- Stack tecnologico
- python
- Ambito
- backend-api-design
Direzione di ricerca
Find the CastCast rewrite rule in onnxscript.rewriter.rules.common and read how it determines whether the intermediate cast can be removed. Add focused tests for the reported DOUBLE rounding boundary and for supported mixed precision source types, then run the relevant rewrite tests. Done means the rewrite preserves both casts for DOUBLE or unknown source types while still collapsing the supported combinations; an open linked pull request already addresses this issue.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Description
The CastCast rewrite checks the intermediate/output dtype pair but ignores the source dtype. It currently treats both Cast(Cast(X, FLOAT), FLOAT16) and Cast(Cast(X, FLOAT), BFLOAT16) as equivalent to a direct cast for every source type.
That is not true for wider sources: rounding to FLOAT can land exactly on a lower-precision midpoint, so the second rounding can differ from a direct cast. This silently changes valid model outputs.
Reproduction
Reproduced locally on main f51083c, Python 3.12.16, macOS arm64, using the ONNX reference evaluator:
import numpy as np
import onnx
import onnx.reference
import onnx_ir as ir
from onnxscript.rewriter.rules.common import _basic_rules
h = onnx.helper
model = h.make_model(
h.make_graph(
[
h.make_node("Cast", ["X"], ["M"], to=onnx.TensorProto.FLOAT),
h.make_node("Cast", ["M"], ["Y"], to=onnx.TensorProto.FLOAT16),
],
"rounding",
[h.make_tensor_value_info("X", onnx.TensorProto.DOUBLE, [1])],
[h.make_tensor_value_info("Y", onnx.TensorProto.FLOAT16, [1])],
),
opset_imports=[h.make_opsetid("", 18)],
ir_version=10,
)
rewritten = ir.from_proto(model)
print(_basic_rules.cast_cast_rule.apply_to_model(rewritten)) # 1
feeds = {"X": np.array([1.00048828125 + 2**-30], dtype=np.float64)}
for candidate in (model, ir.to_proto(rewritten)):
y = onnx.reference.ReferenceEvaluator(candidate).run(None, feeds)[0]
print(y, y.view(np.uint16))
Original: [1.] [15360]
Rewritten: [1.001] [15361]
NumPy independently gives the same distinction for x.astype(np.float32).astype(np.float16) versus x.astype(np.float16).
This is semantic correctness evidence from the reference evaluator, not a GPU/performance claim. In my local ONNX Runtime CPU check, both graphs returned the lower value; that runtime result does not independently demonstrate this rewrite's numerical difference.
Proposed fix
Restrict elimination to source dtypes for which widening to FLOAT is exact, retaining the intended mixed-precision cases (FLOAT, FLOAT16 and BFLOAT16). Preserve both casts for DOUBLE, unproven source types, or missing source-type information. Add exact-result tests around rounding boundaries plus positive tests that the supported mixed-precision combinations still collapse.
I checked open PRs and searched issues/PRs for CastCast and cast rounding/precision; I did not find a competing fix for this source-type guard.
- 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
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
microsoft/onnxscript#3200 ·
I maintainer di solito rispondono entro 2 giorni
-
`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
-
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
-
Export `EagerAllowed` and `IntoBackend` from stable.v2Forse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
narwhals-dev/narwhals#4154 ·
I maintainer di solito rispondono entro 1 giorno