[Bug] [Relax][ONNX] Resize align_corners divides by zero for a unit output extent

Aperta Adatta ai principianti
#20,932 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à
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
78/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
python

Direzione di ricerca

Inizia da python/tvm/topi/image/resize.py, partendo dal calcolo delle coordinate collegato nell’issue, poi leggi la regola align_corners di ONNX Resize-13 per dimensioni di output pari a uno. Esegui la riproduzione fornita per le altezze 3 e 1; il lavoro è completato quando il caso con altezza 1 viene compilato e restituisce [[[[0, 0.5, 1]]]], mentre il caso di controllo con altezza 3 continua a passare. Aggiungi o individua un test di regressione per questo caso.

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

Descrizione

needs-triage type: bug
Expected behavior

Resize-13 maps the coordinate to zero when an align_corners output extent is one. Resizing this input to (1,1,1,3) should return [[[[0,0.5,1]]]].

Actual behavior

Output height 3 executes correctly; changing only height to 1 fails while building with Divide by zero. The coordinate calculation divides by output_size-1 without the unit-extent case. This differs from #20877, which concerns the tf_crop_and_resize branch.

Environment

TVM 0.28.dev0, LLVM 18.1.3, Linux x86_64; Python 3.12.3, NumPy 2.5.4, ONNX 1.22.0. Installed binary build revision is unknown. Current main was inspected statically, not rebuilt.

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

x = np.arange(4, dtype="float32").reshape(1, 1, 2, 2)
for height in [3, 1]:
    shape = [1, 1, height, 3]
    model = h.make_model(h.make_graph([
        h.make_node("Resize", ["x", "", "", "sizes"], ["y"], mode="linear", coordinate_transformation_mode="align_corners")],
        "resize", [h.make_tensor_value_info("x", T.FLOAT, x.shape)],
        [h.make_tensor_value_info("y", T.FLOAT, shape)],
        [nh.from_array(np.array(shape, dtype="int64"), "sizes")]),
        opset_imports=[h.make_opsetid("", 13)], ir_version=10)
    onnx.checker.check_model(model, full_check=True)
    expected = ReferenceEvaluator(model).run(None, {"x": x})[0]
    if height == 1:
        np.testing.assert_array_equal(expected, [[[[0, .5, 1]]]])
    try:
        mod = from_onnx(model, keep_params_in_input=False)
        vm = relax.VirtualMachine(relax.build(mod, target="llvm"), tvm.cpu())
        actual = vm["main"](tvm.runtime.tensor(x)).numpy()
    except Exception as error:
        if height != 1:
            raise
        assert "zero" in str(error).lower()
        print("size-one failure:", type(error).__name__, str(error).splitlines()[-1])
    else:
        np.testing.assert_allclose(actual, expected)
        assert height != 1, "Expected the reported divide-by-zero failure"
        print("non-unit output control passed")
Triage
  • needs-triage
Lingua principale
Python
Stelle
13.9k
Fork
4k
Merge medio
8h 6m
PR unite (30g)
147

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.