[Bug] [Relax][ONNX] Constant INT64 Concat data becomes ShapeExpr and breaks Add

Aperta
#20,889 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
1-2 giorni
Idoneità per principianti
38/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
python
Ambito
compilers

Direzione di ricerca

The failure starts in the Relax ONNX frontend entry point from_onnx when a Concat of two constant INT64 tensors feeds an Add node named add_data, which raises "cannot handle ShapeExpr inputs". Run the reproduction script from the issue to confirm that only the all-constant variant fails, then trace where the Concat output is classified as a shape rather than tensor data. Done means both variants import and the Add returns [11, 22], matching the ReferenceEvaluator result.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

needs-triage type: bug
Expected behavior

Concatenating INT64 tensors [1] and [2], then adding [10, 20], should return the INT64 tensor [11, 22], whether the operands are constants or runtime inputs.

Actual behavior

Making both Concat operands constant causes the frontend to treat ordinary tensor data as a shape. Its Add consumer fails:

ValueError: Node add_data cannot handle ShapeExpr inputs.

Keeping one operand as runtime data imports successfully. Both ONNX variants pass full checking and reference evaluation. Unlike the mixed shape/tensor case in #19498, this graph does not construct a shape.

Environment

TVM 0.28.dev0 (local build; build commit unavailable), Python 3.12.3, Linux x86_64; ONNX 1.22.0, NumPy 2.5.4.

Steps to reproduce

Run with python repro.py:

import numpy as np
import onnx
from onnx import TensorProto as T, helper as h, numpy_helper as nh
from onnx.reference import ReferenceEvaluator
from tvm.relax.frontend.onnx import from_onnx

for constant_a in [False, True]:
    nodes = [h.make_node("Constant", [], ["b"], value=nh.from_array(np.array([2], dtype="int64")))]
    inputs = [h.make_tensor_value_info("x", T.INT64, [2])]
    feeds = {"x": np.array([10, 20], dtype="int64")}
    if constant_a:
        nodes.append(h.make_node("Constant", [], ["a"], value=nh.from_array(np.array([1], dtype="int64"))))
    else:
        inputs.append(h.make_tensor_value_info("a", T.INT64, [1]))
        feeds["a"] = np.array([1], dtype="int64")
    nodes += [h.make_node("Concat", ["a", "b"], ["c"], axis=0),
              h.make_node("Add", ["c", "x"], ["y"], name="add_data")]
    model = h.make_model(h.make_graph(nodes, "concat", inputs,
        [h.make_tensor_value_info("y", T.INT64, [2])]),
        opset_imports=[h.make_opsetid("", 18)], ir_version=10)
    onnx.checker.check_model(model, full_check=True)
    np.testing.assert_array_equal(ReferenceEvaluator(model).run(None, feeds)[0], [11, 22])
    try:
        from_onnx(model, keep_params_in_input=False)
        print("constant_a", constant_a, "imported")
    except Exception as error:
        print("constant_a", constant_a, type(error).__name__, str(error).splitlines()[-1])
Triage
  • needs-triage
Lingua principale
Python
Stelle
13.9k
Fork
4k
Merge medio
7h 59m
PR unite (30g)
159

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

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 apache/tvm

Tutte le issue di apache/tvm

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.