`fuse_skip_rms_normalization` fuses a float16 residual into a norm whose scale is float32, which ONNX Runtime rejects
I maintainer di solito rispondono entro 4 giorni
@justinchuby ci sta già lavorando.
Dal 5/11/2026.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 76/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- python
- Ambito
- backend, machine-learning
Direzione di ricerca
Inizia leggendo fuse_skip_rms_normalization nelle regole di fusione ONNX Script ORT e i test correlati; l’issue fornisce un riproduttore che usa optimize_for_ort. Verifica come la regola gestisce i tipi di dati di input, skip e scale, quindi esegui i test di fusione mirati. Il risultato è raggiunto quando la fusione viene saltata in caso di tipi di dati non corrispondenti, mentre il caso float16 fornito, con tipi corrispondenti, continua a fondersi e il grafo risultante viene caricato in ONNX Runtime.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
In a float16 model whose RMS norm computes in float32 and scales by a float32 1 + weight (Gemma's), optimize_for_ort fuses the residual add and the norm into a SkipSimplifiedLayerNormalization with float16 input and skip but a float32 scale. ONNX Runtime refuses to load the session. The rule should check that the input, skip and scale dtypes match before fusing.
Repro (torch 2.13.0, onnxscript 0.7.2, onnxruntime 1.31.1):
"""onnxscript's skip RMS norm fusion fuses a float16 residual add into a norm computed in float32, which gives a
`SkipSimplifiedLayerNormalization` whose inputs have different dtypes, and ONNX Runtime rejects the graph.
The module is a Gemma-style residual block in float16: `x + y`, then an RMS norm computed in float32, scaled by
`1 + weight` in float32, and cast back.
"""
import collections
import onnx_ir as ir
import onnxruntime as ort
import torch
from onnxscript.rewriter.ort_fusions import optimize_for_ort
class Block(torch.nn.Module):
def __init__(self, hidden=64):
super().__init__()
self.weight = torch.nn.Parameter(torch.zeros(hidden, dtype=torch.float16))
def forward(self, x, y):
residual = x + y
states = residual.to(torch.float32)
states = states * torch.rsqrt(states.pow(2).mean(-1, keepdim=True) + 1e-6)
return (states * (1.0 + self.weight.float())).to(torch.float16), residual
inputs = (torch.randn(2, 8, 64, dtype=torch.float16), torch.randn(2, 8, 64, dtype=torch.float16))
program = torch.onnx.export(Block(), inputs, dynamo=True)
model, counts = optimize_for_ort(program.model)
for node in model.graph.all_nodes():
if node.op_type == "SkipSimplifiedLayerNormalization":
print("fused:", node.op_type, "input dtypes:", [str(value.dtype) for value in node.inputs[:3]])
print("ops:", dict(collections.Counter(node.op_type for node in model.graph.all_nodes())))
try:
ort.InferenceSession(ir.to_proto(model).SerializeToString(), providers=["CPUExecutionProvider"])
print("ONNX Runtime loaded the fused graph")
except Exception as error:
print("ONNX Runtime:", str(error).splitlines()[0][:300])
fused: SkipSimplifiedLayerNormalization input dtypes: ['FLOAT16', 'FLOAT16', 'FLOAT']
ONNX Runtime: [ONNXRuntimeError] : 1 : FAIL : Type Error: Type parameter (T) of Optype (SkipSimplifiedLayerNormalization) bound to different types (tensor(float16) and tensor(float) in node (node_SkipSimplifiedLayerNormalization_8).
With a Llama-style norm (float16 weight applied after the cast back) the fusion is valid, and all three inputs are float16.
- Lingua principale
- Python
- Stelle
- 457
- Fork
- 149
- Merge medio
- 3g 16h
- PR unite (30g)
- 24
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
-
Constant folding uses onnx's plain reference ops, never onnx.reference.ops_optimizedForse già presa @todkarsant l’ha presa 2 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 4 giorni
-
CI : Pin github actions to full commit SHAForse già presa @Aniketsy l’ha presa 187 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 4 giorni
-
Batch-transpose fusion into `FusedMatMul` sets `transBatchA` on inputs of different ranks, which ONNX Runtime can't computeForse già presa @Syedmudassir1604 l’ha presa 2 giorni fa. Apertamodule: optimizer
Difficoltà 3/5 1-2 giorni Idoneità per principianti 72/100
microsoft/onnxscript#3156 ·
I maintainer di solito rispondono entro 4 giorni
-
`SlicesSplit` rule makes `optimizer.optimize` quadratic in the number of `Slice` nodesForse già presa @mayuriphad l’ha presa 1 giorno fa. Apertamodule: optimizer
Difficoltà 4/5 3-5 giorni Idoneità per principianti 68/100
microsoft/onnxscript#3154 ·
I maintainer di solito rispondono entro 4 giorni
-
optimize() crashes when constant folding produces a string tensorForse già presa @nniiovoo l’ha presa 12 giorni fa. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 35/100
microsoft/onnxscript#3129 ·
I maintainer di solito rispondono entro 4 giorni
Tutte le issue di microsoft/onnxscript
Issue simili
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
micropython/micropython#19906 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
FinanceFlash/unvibecode#597 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
TomAnthony/YourOwnWeigh#21 ·
I maintainer di solito rispondono entro 1 giorno
-
[BUG]: Compliance rules never see Unity Catalog views as viewsForse già presa @wagnercsantos l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
databrickslabs/ontos#1348 ·
I maintainer di solito rispondono entro 3 giorni
-
Deprecated datetime.utcnow() is called on every log line (DeprecationWarning on Python 3.12+)Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 2 giorni