CastCast rewrite changes rounding for DOUBLE inputs by removing the FLOAT intermediate
Los mantenedores suelen responder en 2 días
@itsrayeedscodespace ya está trabajando en esto.
Desde el 12/11/2026.
- #3205 de @itsrayeedscodespace — abierto
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Estancado
- Stack tecnológico
- python
- Área
- backend-api-design
Línea de trabajo
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.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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.
- Lenguaje dominante
- Python
- Estrellas
- 456
- Forks
- 159
- Merge medio
- 3 d 5 h
- PR fusionados (30 d)
- 23
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de microsoft/onnxscript
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
microsoft/onnxscript#3200 ·
Los mantenedores suelen responder en 2 días
-
`fuse_skip_rms_normalization` fuses a float16 residual into a norm whose scale is float32, which ONNX Runtime rejectsPosiblemente ocupada @justinchuby la tomó hace 8 días. Abiertomodule: optimizer
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
microsoft/onnxscript#3155 · 3 comentarios · 1 reacción · 2 asignados ·
Los mantenedores suelen responder en 2 días
-
Constant folding uses onnx's plain reference ops, never onnx.reference.ops_optimizedPosiblemente ocupada @todkarsant la tomó hace 8 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
microsoft/onnxscript#3003 · 3 comentarios ·
Los mantenedores suelen responder en 2 días
-
CI : Pin github actions to full commit SHAPosiblemente ocupada @Aniketsy la tomó hace 193 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
microsoft/onnxscript#2903 · 6 comentarios ·
Los mantenedores suelen responder en 2 días
-
Partial rotary fusion sets `rotary_embedding_dim` without `num_heads`, which ONNX Runtime requiresPosiblemente ocupada @justinchuby la tomó hace 3 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 25/100
microsoft/onnxscript#3185 ·
Los mantenedores suelen responder en 2 días
Todos los issues de microsoft/onnxscript
Issues similares
-
fleet size/m
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
sipyourdrink-ltd/bernstein#7548 ·
Los mantenedores suelen responder en 1 día
-
good first issue help wanted level 1 wocs
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
GianlucaBave/murmury#73 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
G-nn-r/lg_heatpump#52 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
agno-agi/agno#11657 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
category:codebase:gpi category:codebase:handle type:bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
Los mantenedores suelen responder en 1 día