You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tvm.apache.org by GitBox <gi...@apache.org> on 2022/07/05 01:53:59 UTC
[GitHub] [tvm] lazycal opened a new issue, #12008: Resize does not reject unsupported layout during AlterOpLayout
lazycal opened a new issue, #12008:
URL: https://github.com/apache/tvm/issues/12008
This model
```python
def @main(%x: Tensor[(1, 1, 1, 1), float32] /* ty=Tensor[(1, 1, 1, 1), float32] */) -> Tensor[(1, 1, 1, 1), float32] {
%0 = image.resize2d(%x, size=[2, 4], roi=[0f, 0f, 0f, 0f], rounding_method="") /* ty=Tensor[(1, 1, 2, 4), float32] */;
%1 = transpose(%0, axes=[0, 1, 3, 2]) /* ty=Tensor[(1, 1, 4, 2), float32] */;
%2 = nn.max_pool2d(%1, pool_size=[1, 1], padding=[0, 0, 0, 0]) /* ty=Tensor[(1, 1, 4, 2), float32] */;
image.resize2d(%2, size=[1, 1], roi=[0f, 0f, 0f, 0f], rounding_method="") /* ty=Tensor[(1, 1, 1, 1), float32] */
}
```
fails with error `ValueError: NCWH layout is not supported.`, and this layout is introduced after AlterOpLayout (see below for the IR right after AlterOpLayout):
```python
def @main(%x: Tensor[(1, 1, 1, 1), float32] /* ty=Tensor[(1, 1, 1, 1), float32] */) -> Tensor[(1, 1, 1, 1), float32] {
%0 = image.resize2d(%x, size=[2, 4], roi=[0f, 0f, 0f, 0f], rounding_method="") /* ty=Tensor[(1, 1, 2, 4), float32] */;
%1 = transpose(%0, axes=[0, 1, 3, 2]) /* ty=Tensor[(1, 1, 4, 2), float32] */;
%2 = layout_transform(%1, src_layout="NCHW", dst_layout="NCWH") /* ty=Tensor[(1, 1, 2, 4), float32] */;
%3 = nn.max_pool2d(%2, pool_size=[1, 1], padding=[0, 0, 0, 0], layout="NCWH") /* ty=Tensor[(1, 1, 2, 4), float32] */;
%4 = image.resize2d(%3, size=[1, 1], roi=[0f, 0f, 0f, 0f], layout="NCWH", rounding_method="") /* ty=Tensor[(1, 1, 1, 1), float32] */;
layout_transform(%4, src_layout="NCWH", dst_layout="NCHW") /* ty=Tensor[(1, 1, 1, 1), float32] */
}
```
where the max_pool2d outputs NCWH layout and resize2d accepts it during AlterOpLayout but complains when lowering in this function:
https://github.com/apache/tvm/blob/5efe8b0bfdff4c9939185a7581dc77e23cbcb6d5/python/tvm/topi/image/resize.py#L807-L824
Not sure if this is a bug, but I guess ideally resize2d should not accept unsupported layout? The current logic
https://github.com/apache/tvm/blob/5efe8b0bfdff4c9939185a7581dc77e23cbcb6d5/src/relay/op/image/resize.cc#L49-L53
does not check this.
### Expected behavior
Pass the compilation.
### Actual behavior
Pass with opt_level=2 but fail with opt_level=4
### Environment
Ubuntu 18.04
TVM: 1787cca3f90237dff001fba01ffdbaf9a510f886
### Steps to reproduce
Run this code:
```python
import tvm
from tvm import relay
from tvm.relay.transform import InferType
@tvm.instrument.pass_instrument
class PrintIR:
"""Print the name of the pass, the IR, only before passes execute."""
def __init__(self, print_mod=True, show_meta_data=False) -> None:
self.pass_cnt = 0
self.print_mod = print_mod
self.show_meta_data = show_meta_data
def run_before_pass(self, mod, info):
with tvm.transform.PassContext(instruments=[]):
global prev_mod
if self.print_mod:
print(relay.transform.InferType()(mod))
print('>' * 40, f'Running Pass#{self.pass_cnt}:', info)
self.pass_cnt += 1
x = relay.var("x", shape=(1, 1, 1, 1))
y = relay.image.resize2d(x, (2, 4))
z = relay.transpose(y, (0, 1, 3, 2))
a = relay.nn.max_pool2d(z)
b = relay.image.resize2d(a, (1, 1))
func = relay.Function((x,), b)
mod = tvm.IRModule.from_expr(func)
print(InferType()(mod))
with tvm.transform.PassContext(opt_level=4, instruments=[PrintIR()]):
relay.create_executor("graph", mod).evaluate()
```
Part of error log:
```
6: _ZZN3tvm5relay11ExprFunctorIFNS_7runtime5ArrayINS_2te6TensorEvEERKNS_
5: tvm::relay::tec::LowerToTECompute::VisitExpr_(tvm::relay::CallNode const*)
4: tvm::relay::backend::MemoizedExprTranslator<tvm::runtime::Array<tvm::te::Tensor, void> >::VisitExpr(tvm::RelayExpr const&)
3: tvm::relay::ExprFunctor<tvm::runtime::Array<tvm::te::Tensor, void> (tvm::RelayExpr const&)>::VisitExpr(tvm::RelayExpr const&)
2: _ZZN3tvm5relay11ExprFunctorIFNS_7runtime5ArrayINS_2te6TensorEvEERKNS_
1: tvm::relay::tec::LowerToTECompute::VisitExpr_(tvm::relay::CallNode const*)
0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
File "tvm/_ffi/_cython/./packed_func.pxi", line 56, in tvm._ffi._cy3.core.tvm_callback
File "/workspace/workspace/tvm-intact/python/tvm/relay/backend/te_compiler.py", line 317, in lower_call
best_impl, outputs = select_implementation(op, call.attrs, inputs, ret_type, target)
File "/workspace/workspace/tvm-intact/python/tvm/relay/backend/te_compiler.py", line 207, in select_implementation
outs = impl.compute(attrs, inputs, out_type)
File "/workspace/workspace/tvm-intact/python/tvm/relay/op/op.py", line 126, in compute
return _OpImplementationCompute(self, attrs, inputs, out_type)
File "tvm/_ffi/_cython/./packed_func.pxi", line 331, in tvm._ffi._cy3.core.PackedFuncBase.__call__
File "tvm/_ffi/_cython/./packed_func.pxi", line 276, in tvm._ffi._cy3.core.FuncCall
File "tvm/_ffi/_cython/./base.pxi", line 181, in tvm._ffi._cy3.core.CHECK_CALL
3: TVMFuncCall
2: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<tvm::relay::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#4}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
1: tvm::relay::OpImplementation::Compute(tvm::Attrs const&, tvm::runtime::Array<tvm::te::Tensor, void> const&, tvm::Type const&)
0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
File "tvm/_ffi/_cython/./packed_func.pxi", line 56, in tvm._ffi._cy3.core.tvm_callback
File "/workspace/workspace/tvm-intact/python/tvm/relay/op/image/_image.py", line 156, in compute_resize2d
out_dtype,
File "/workspace/workspace/tvm-intact/python/tvm/topi/image/resize.py", line 824, in resize2d
raise ValueError("%s layout is not supported." % layout)
ValueError: NCWH layout is not supported.
```
--
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: commits-unsubscribe@tvm.apache.org.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org