fPecc opened a new issue, #12814:
URL: https://github.com/apache/tvm/issues/12814

   ### Expected behavior
   
   Be able to build a relay containing relay.vision.non_max_suppression or 
relay.vision.multibox_transform_loc.
   
   ### Actual behavior
   
   Obtained error:
   
   ```
   Traceback (most recent call last):
     File "test.py", line 45, in <module>
       mod = relay.build(mod, executor=EXECUTOR, target=TARGET,runtime=RUNTIME)
     File "/local_disk/local_sw/tvm_main/tvm/python/tvm/relay/build_module.py", 
line 364, in build
       graph_json, runtime_mod, params = bld_mod.build(
     File "/local_disk/local_sw/tvm_main/tvm/python/tvm/relay/build_module.py", 
line 161, in build
       self._build(
     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
   ValueError: Traceback (most recent call last):
     41: TVMFuncCall
     40: 
tvm::relay::backend::RelayBuildModule::GetFunction(std::__cxx11::basic_string<char,
 std::char_traits<char>, std::allocator<char> > const&, 
tvm::runtime::ObjectPtr<tvm::runtime::Object> 
const&)::{lambda(tvm::runtime::TVMArgs, 
tvm::runtime::TVMRetValue*)#3}::operator()(tvm::runtime::TVMArgs, 
tvm::runtime::TVMRetValue*) const
     39: tvm::relay::backend::RelayBuildModule::BuildRelay(tvm::IRModule, 
tvm::runtime::String const&)
     38: 
tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<tvm::relay::backend::AOTExecutorCodegenModule::GetFunction(std::__cxx11::basic_string<char,
 std::char_traits<char>, std::allocator<char> > const&, 
tvm::runtime::ObjectPtr<tvm::runtime::Object> 
const&)::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> 
>::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, 
tvm::runtime::TVMRetValue*)
     37: tvm::relay::backend::AOTExecutorCodegen::Codegen(tvm::IRModule, 
tvm::relay::Function, tvm::runtime::String)
     36: tvm::transform::Pass::operator()(tvm::IRModule) const
     35: tvm::transform::Pass::operator()(tvm::IRModule, 
tvm::transform::PassContext const&) const
     34: tvm::transform::SequentialNode::operator()(tvm::IRModule, 
tvm::transform::PassContext const&) const
     33: tvm::transform::Pass::operator()(tvm::IRModule, 
tvm::transform::PassContext const&) const
     32: tvm::transform::ModulePassNode::operator()(tvm::IRModule, 
tvm::transform::PassContext const&) const
     31: 
_ZN3tvm7runtime13PackedFuncObj9ExtractorINS0_16PackedFuncSubObjIZNS0_15TypedPackedFuncIFNS_8IRModuleES5_NS_9transform11PassContextEEE17AssignTypedLambdaIZNS_5relay3tec7LowerTEENS0_6StringENS_17CompilationConfigESt8functionIFvNS_8BaseFuncEEEEUlS5_S7_E_EEvT_EUlRKNS0_7TVMArgsEPNS0_11TVMRetValueEE_EEE4CallEPKS1_SL_SP_
     30: tvm::relay::tec::LowerTE(tvm::IRModule const&, tvm::runtime::String 
const&, std::function<void (tvm::BaseFunc)>, tvm::CompilationConfig)
     29: tvm::transform::Pass::operator()(tvm::IRModule) const
     28: tvm::transform::Pass::operator()(tvm::IRModule, 
tvm::transform::PassContext const&) const
     27: tvm::relay::transform::FunctionPassNode::operator()(tvm::IRModule, 
tvm::transform::PassContext const&) const
     26: 
_ZN3tvm7runtime13PackedFuncObj9ExtractorINS0_16PackedFuncSubObjIZNS0_15TypedPackedFuncIFNS_5relay8FunctionES6_NS_8IRModuleENS_9transform11PassContextEEE17AssignTypedLambdaIZNS5_3tec15LowerTensorExprENSD_10TECompilerESt8functionIFvNS_8BaseFuncEEENS_17CompilationConfigEEUlS6_S7_S9_E_EEvT_EUlRKNS0_7TVMArgsEPNS0_11TVMRetValueEE_EEE4CallEPKS1_SM_SQ_
     25: tvm::relay::ExprMutator::VisitExpr(tvm::RelayExpr const&)
     24: 
_ZZN3tvm5relay11ExprFunctorIFNS_9RelayExprERKS2_EE10InitVTableEvENUlRKNS_7r
     23: 
tvm::relay::transform::DeviceAwareExprMutator::VisitExpr_(tvm::relay::FunctionNode
 const*)
     22: 
tvm::relay::tec::LowerTensorExprMutator::DeviceAwareVisitExpr_(tvm::relay::FunctionNode
 const*)
     21: _ZN3tvm5relay9transform22DeviceAwareExprMutator21DeviceAwareVisit
     20: tvm::relay::ExprMutator::VisitExpr_(tvm::relay::FunctionNode const*)
     19: tvm::relay::ExprMutator::VisitExpr(tvm::RelayExpr const&)
     18: 
_ZZN3tvm5relay11ExprFunctorIFNS_9RelayExprERKS2_EE10InitVTableEvENUlRKNS_7r
     17: 
tvm::relay::transform::DeviceAwareExprMutator::VisitExpr_(tvm::relay::LetNode 
const*)
     16: 
tvm::relay::tec::LowerTensorExprMutator::PreVisitLetBinding_(tvm::relay::Var 
const&, tvm::RelayExpr const&)
     15: tvm::relay::ExprMutator::VisitExpr(tvm::RelayExpr const&)
     14: 
_ZZN3tvm5relay11ExprFunctorIFNS_9RelayExprERKS2_EE10InitVTableEvENUlRKNS_7r
     13: 
tvm::relay::transform::DeviceAwareExprMutator::VisitExpr_(tvm::relay::CallNode 
const*)
     12: tvm::relay::ExprMutator::VisitExpr(tvm::RelayExpr const&)
     11: 
_ZZN3tvm5relay11ExprFunctorIFNS_9RelayExprERKS2_EE10InitVTableEvENUlRKNS_7r
     10: 
tvm::relay::transform::DeviceAwareExprMutator::VisitExpr_(tvm::relay::CallNode 
const*)
     9: 
tvm::relay::tec::LowerTensorExprMutator::DeviceAwareVisitExpr_(tvm::relay::CallNode
 const*)
     8: tvm::relay::tec::TECompilerImpl::Lower(tvm::relay::tec::CCacheKey 
const&)
     7: 
tvm::relay::tec::TECompilerImpl::LowerInternal(tvm::relay::tec::CCacheKey 
const&, tvm::GlobalVarSupply)
     6: tvm::relay::tec::PrimFuncFor(tvm::relay::Function const&, tvm::Target 
const&, tvm::GlobalVarSupply)
     5: tvm::relay::tec::ScheduleBuilder::Create(tvm::relay::Function const&, 
tvm::GlobalVarSupply)
     4: tvm::relay::tec::LowerToTECompute::Lower(tvm::relay::Function const&)
     3: 
tvm::relay::backend::MemoizedExprTranslator<tvm::runtime::Array<tvm::te::Tensor,
 void> >::VisitExpr(tvm::RelayExpr const&)
     2: 
_ZZN3tvm5relay11ExprFunctorIFNS_7runtime5ArrayINS_2te6TensorEvEERKNS_9Relay
     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*) [clone .cold]
     File "tvm/_ffi/_cython/./packed_func.pxi", line 56, in 
tvm._ffi._cy3.core.tvm_callback
     File 
"/local_disk/local_sw/tvm_main/tvm/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 
"/local_disk/local_sw/tvm_main/tvm/python/tvm/relay/backend/te_compiler.py", 
line 207, in select_implementation
       outs = impl.compute(attrs, inputs, out_type)
     File "/local_disk/local_sw/tvm_main/tvm/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*) [clone .cold]
     File "tvm/_ffi/_cython/./packed_func.pxi", line 56, in 
tvm._ffi._cy3.core.tvm_callback
     File 
"/local_disk/local_sw/tvm_main/tvm/python/tvm/relay/op/strategy/generic.py", 
line 1262, in _compute_nms
       return topi_compute(
     File 
"/local_disk/local_sw/tvm/tvm/lib/python3.8/site-packages/decorator.py", line 
232, in fun
       return caller(func, *(extras + args), **kw)
     File 
"/local_disk/local_sw/tvm_main/tvm/python/tvm/target/generic_func.py", line 
287, in dispatch_func
       return func(*args, **kwargs)
     File "/local_disk/local_sw/tvm_main/tvm/python/tvm/topi/vision/nms.py", 
line 577, in non_max_suppression
       out, box_indices = hybrid_nms(
     File 
"/local_disk/local_sw/tvm/tvm/lib/python3.8/site-packages/decorator.py", line 
232, in fun
       return caller(func, *(extras + args), **kw)
     File "/local_disk/local_sw/tvm_main/tvm/python/tvm/te/hybrid/__init__.py", 
line 60, in wrapped_func
       return source_to_op(src, args, func.__globals__, closure_vars)
     File "/local_disk/local_sw/tvm_main/tvm/python/tvm/te/hybrid/parser.py", 
line 645, in source_to_op
       parser = parse_python(src, args, symbols, closure_vars)
     File "/local_disk/local_sw/tvm_main/tvm/python/tvm/te/hybrid/parser.py", 
line 615, in parse_python
       parser.parsed_body = parser.visit(root)
     File "/usr/lib/python3.8/ast.py", line 371, in visit
       return visitor(node)
     File "/local_disk/local_sw/tvm_main/tvm/python/tvm/te/hybrid/parser.py", 
line 229, in visit_Module
       return self.visit(node.body[0])
     File "/usr/lib/python3.8/ast.py", line 371, in visit
       return visitor(node)
     File "/local_disk/local_sw/tvm_main/tvm/python/tvm/te/hybrid/parser.py", 
line 242, in visit_FunctionDef
       res = visit_list_to_block(self.visit, node.body)
     File "/local_disk/local_sw/tvm_main/tvm/python/tvm/te/hybrid/parser.py", 
line 58, in visit_list_to_block
       lst = [visit(stmt) for stmt in lst if not utils.is_docstring(stmt)]
     File "/local_disk/local_sw/tvm_main/tvm/python/tvm/te/hybrid/parser.py", 
line 58, in <listcomp>
       lst = [visit(stmt) for stmt in lst if not utils.is_docstring(stmt)]
     File "/usr/lib/python3.8/ast.py", line 371, in visit
       return visitor(node)
     File "/local_disk/local_sw/tvm_main/tvm/python/tvm/te/hybrid/parser.py", 
line 303, in visit_Assign
       rhs = self.visit(node.value)
     File "/usr/lib/python3.8/ast.py", line 371, in visit
       return visitor(node)
     File "/local_disk/local_sw/tvm_main/tvm/python/tvm/te/hybrid/parser.py", 
line 388, in visit_Subscript
       _internal_assert(
     File "/local_disk/local_sw/tvm_main/tvm/python/tvm/te/hybrid/utils.py", 
line 43, in _internal_assert
       raise ValueError(err)
   ValueError: All indices are supposed to be constants
   ```
   
   ### Environment
   
   Branch main, commit 9b17f344a31a13226458a2d48dcb7b55ce282274
   
   ### Steps to reproduce
   
   Code to reproduce:
   
   ```python
   from tvm.relay.op.vision import non_max_suppression
   from tvm import te
   import numpy as np
   from tvm import topi
   import tvm
   from tvm import relay
   
   nms = False
   
   if not nms:
       x0 = relay.var("x0", relay.ty.TensorType((1, 6, 5), "float32"))
       x1 = relay.var("x1", relay.ty.TensorType((1, 5 * 4), "int32"))
       x2 = relay.var("x1", relay.ty.TensorType((1, 5, 4), "int32"))
       z = relay.vision.multibox_transform_loc(
           x0, x1, x2, clip=False, threshold=-float("inf"), variances=(1.0, 
1.0, 1.0, 1.0)
       )
       z = z.astuple()
       func = relay.Function([x0, x1, x2], z)
   else:
       x0 = relay.var("x0", relay.ty.TensorType((1, 100, 6), "float32"))
       x1 = relay.var("x1", relay.ty.TensorType((1,), "int32"))
       x2 = relay.var("x2", relay.ty.TensorType((1, 100), "int32"))
       x3 = relay.var("x3", relay.ty.TensorType((), "int32"))
       z = relay.vision.non_max_suppression(
           x0,
           x1,
           x2,
           x3,
           iou_threshold=0.5,
           force_suppress=True,
           top_k=4,
           return_indices=True,
           invalid_to_bottom=False,
       )
       z = z.astuple()
       func = relay.Function([x0, x1, x2, x3], z)
       
   mod = tvm.IRModule()
   mod["main"] = func
   
   print(mod["main"])
   TARGET = tvm.target.target.Target({"kind": "c"})
   mod = relay.build(mod, target=TARGET)
   
   print(mod)
   ```
   
   I started to try to understand what the problem is, but my experience with 
hybrid_script is very low. What I noticed is that function visit_Index in 
[parser.py](https://github.com/apache/tvm/blob/main/python/tvm/te/hybrid/parser.py)
 is returning a list, which then breaks function visit_Subscript (same file). 
But I was not able to understand the reason why visit_Index is now returning a 
list. A change was probably done before, that is making visit_Index return a 
list.
   


-- 
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]

Reply via email to