napronald opened a new pull request, #20050:
URL: https://github.com/apache/tvm/pull/20050

   ## Summary 
   This adds support for the `start` and `end` attributes introduced for ONNX 
`Shape` in opset 15.
   
   The Relax ONNX frontend previously reused the opset 13 implementation, which 
always returned the full input shape. As a result, models using sliced shape 
values could construct an incorrect target shape and fail in downstream 
operators such as `Reshape`:
   
   ```text
   ValueError: Reshape expects the new shape to be convertible from the old 
shape. However, the old shape is R.shape([12]), with product T.int64(12), while 
the new shape is R.shape([2, 3, 4]), with product T.int64(24)
   ```
   
   ### Minimal reproduce
   
   ```python
   import onnx
   from tvm.relax.frontend.onnx import from_onnx
   
   input_shape = [2, 3, 4]
   data_shape = [12]
   expected_shape = [3, 4]
   start = 1
   end = None
   opset = 15
   
   shape_attrs = {"start": start}
   if end is not None:
       shape_attrs["end"] = end
   
   model = onnx.helper.make_model(
       onnx.helper.make_graph(
           [
               onnx.helper.make_node("Shape", ["x"], ["shape"], **shape_attrs),
               onnx.helper.make_node("Reshape", ["data", "shape"], ["y"]),
           ],
           "shape_start_end_repro",
           [
               onnx.helper.make_tensor_value_info(
                   "x", onnx.TensorProto.FLOAT, input_shape
               ),
               onnx.helper.make_tensor_value_info(
                   "data", onnx.TensorProto.FLOAT, data_shape
               ),
           ],
           [
               onnx.helper.make_tensor_value_info(
                   "y", onnx.TensorProto.FLOAT, expected_shape
               )
           ],
       ),
       opset_imports=[onnx.helper.make_opsetid("", opset)],
   )
   print(f"Shape attributes: start={start}, end={end}")
   print(f"Expected Shape output: {input_shape[start:end]}")
   print(from_onnx(model, opset=opset).script())
   ```
   
   The new implementation applies `start` and `end` slicing to static and 
symbolic shape expressions. It also handles runtime-produced shape values by 
converting them to a tensor, applying `strided_slice`, and converting the 
result back to a shape.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to