apache / tvm

Open deep learning compiler stack for cpu, gpu and specialized accelerators
https://tvm.apache.org/
Apache License 2.0
11.84k stars 3.48k forks source link

[BYOC][DNNL] TVMError: Unknown composite function:"dnnl.qnn.dense" and Check failed: const_var_ndarray_.count(var) > 0 (0 vs. 0) : ConstLoaderModuleNode is missing entry for constant 'tvmgen_default_dnnl_main_0_const_0' for function 'tvmgen_default_dnnl_main_0' #13222

Closed yuwenjun1988 closed 2 years ago

yuwenjun1988 commented 2 years ago

1、Expected behavior No Crash

2、Actual behavior Crash Stack

(1)test_dnnl.py:1758:


test_dnnl.py:1414: in check_result check_vm_result() test_dnnl.py:1397: in check_vm_result exe = relay.vm.compile(mod, target=target, params=params) ../../../python/tvm/relay/backend/vm.py:67: in compile compiler.lower(mod, target, target_host) ../../../python/tvm/relay/backend/vm.py:126: in lower self._lower(mod, raw_targets)


self = <tvm.runtime.packed_func.PackedFunc object at 0x7f3698105080> args = (#[version = "0.0.5"] def @main(%in_0: Tensor[(2, 10), uint8] / ty=Tensor[(2, 10), uint8] /) -> Tensor[(2, 16), uint...AATUMAAIjBAAAOwwAAyEEAAPBBAABCwwAAEUMAANDBAAA/Qw==" ], "attrs": {"tvm_version": "0.11.dev0"} }, [llvm -keys=cpu ]) temp_args = [], values = <tvm._ffi._ctypes.packed_func.TVMValue_Array_2 object at 0x7f368e874ac0>, tcodes = <tvm._ffi._ctypes.packed_func.c_int_Array_2 object at 0x7f368e874cc0>

def __call__(self, *args):
    """Call the function with positional arguments

    args : list
       The positional arguments to the function call.
    """
    temp_args = []
    values, tcodes, num_args = _make_tvm_args(args, temp_args)
    ret_val = TVMValue()
    ret_tcode = ctypes.c_int()
    if (
        _LIB.TVMFuncCall(
            self.handle,
            values,
            tcodes,
            ctypes.c_int(num_args),
            ctypes.byref(ret_val),
            ctypes.byref(ret_tcode),
        )
        != 0
    ):
      raise get_last_ffi_error()

E tvm._ffi.base.TVMError: Traceback (most recent call last): E 22: TVMFuncCall E 21: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<tvm::relay::vm::VMCompiler::GetFunction(std::cxx11::basic_string<char, std::char_traits, std::allocator > const&, tvm::runtime::ObjectPtr const&)::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue)#1}> >::Call(tvm::runtime::PackedFuncObj const, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue) E 20: tvm::relay::vm::VMCompiler::Lower(tvm::IRModule, tvm::runtime::Array<tvm::Target, void> const&) E 19: tvm::relay::vm::VMCompiler::LowerImpl(tvm::IRModule) E 18: tvm::relay::vm::VMCompiler::OptimizeModuleImpl(tvm::IRModule) E 17: tvm::transform::Pass::operator()(tvm::IRModule) const E 16: tvm::transform::Pass::operator()(tvm::IRModule, tvm::transform::PassContext const&) const E 15: tvm::transform::SequentialNode::operator()(tvm::IRModule, tvm::transform::PassContext const&) const E 14: tvm::transform::Pass::operator()(tvm::IRModule, tvm::transform::PassContext const&) const E 13: tvm::transform::SequentialNode::operator()(tvm::IRModule, tvm::transform::PassContext const&) const E 12: tvm::transform::Pass::operator()(tvm::IRModule, tvm::transform::PassContext const&) const E 11: tvm::transform::ModulePassNode::operator()(tvm::IRModule, tvm::transform::PassContext const&) const E 10: _ZN3tvm7runtime13PackedFuncObj9ExtractorINS0_16PackedFuncSubObjIZNS0_15TypedPackedFuncIFNS_8IRModuleES5_NS_9transform11PassContextEEE17AssignTypedLambdaIZNS_5relay3tec7LowerTEENS0_6StringENS_17CompilationConfigESt8functionIFvNS_8BaseFuncEEEEUlS5_S7_E_EEvT_EUlRKNS0_7TVMArgsEPNS0_11TVMRetValueEE_EEE4CallEPKS1_SLSP E 9: tvm::relay::tec::LowerTE(tvm::IRModule const&, tvm::runtime::String const&, std::function<void (tvm::BaseFunc)>, tvm::CompilationConfig) E 8: tvm::relay::tec::TECompilerImpl::LowerExternalFunctions() E 7: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<tvm::runtime::TypedPackedFunc<tvm::runtime::Module (tvm::runtime::ObjectRef const&)>::AssignTypedLambda<tvm::runtime::Module ()(tvm::runtime::ObjectRef const&)>(tvm::runtime::Module (*)(tvm::runtime::ObjectRef const&), std::cxx11::basic_string<char, std::char_traits, std::allocator >)::{lambda(tvm::runtime::TVMArgs const&, tvm::runtime::TVMRetValue)#1}> >::Call(tvm::runtime::PackedFuncObj const, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue) E 6: tvm::relay::contrib::DNNLCompiler(tvm::runtime::ObjectRef const&) E 5: tvm::relay::contrib::DNNLModuleCodegen::CreateCSourceModule(tvm::runtime::ObjectRef const&) E 4: tvm::relay::backend::MemoizedExprTranslator<std::vector<tvm::relay::contrib::Output, std::allocator > >::VisitExpr(tvm::RelayExpr const&) E 3: tvm::relay::ExprFunctor<std::vector<tvm::relay::contrib::Output, std::allocator > (tvm::RelayExpr const&)>::VisitExpr(tvm::RelayExpr const&) E 2: _ZZN3tvm5relay11ExprFunctorIFSt6vectorINS0_7contrib6OutputESaIS4EERK E 1: tvm::relay::contrib::CodegenDNNL::VisitExpr(tvm::relay::CallNode const) E 0: tvm::relay::contrib::CodegenDNNL::GenerateCompositeFunctionCall(tvm::relay::FunctionNode const, tvm::relay::CallNode const) E File "/mnt/e/code/tvm/src/relay/backend/contrib/dnnl/codegen.cc", line 314 E TVMError: Unknown composite function:"dnnl.qnn.dense"

(2)test_dnnl.py:940:


test_dnnl.py:228: in run_and_verify_func run_and_verify( test_dnnl.py:196: in run_and_verify func = relay.create_executor( ../../../python/tvm/relay/backend/interpreter.py:171: in evaluate return self._make_executor() ../../../python/tvm/relay/build_module.py:519: in _make_executor mod = build(self.mod, target=self.target) ../../../python/tvm/relay/build_module.py:364: in build graph_json, runtime_mod, params = bld_mod.build( ../../../python/tvm/relay/build_module.py:161: in build self._build(


self = <tvm.runtime.packed_func.PackedFunc object at 0x7f368e77a800> args = (#[version = "0.0.5"] def @main(%x: Tensor[(1, 16), float32] / ty=Tensor[(1, 16), float32] /) -> Tensor[(1, 32), flo... ], "attrs": {"tvm_version": "0.11.dev0"} }, [llvm -keys=cpu ], None, graph{"link-params": (bool)0}, cpp, None, ...) temp_args = [], values = <tvm._ffi._ctypes.packed_func.TVMValue_Array_8 object at 0x7f368e67f5c0>, tcodes = <tvm._ffi._ctypes.packed_func.c_int_Array_8 object at 0x7f368e67f7c0>

def __call__(self, *args):
    """Call the function with positional arguments

    args : list
       The positional arguments to the function call.
    """
    temp_args = []
    values, tcodes, num_args = _make_tvm_args(args, temp_args)
    ret_val = TVMValue()
    ret_tcode = ctypes.c_int()
    if (
        _LIB.TVMFuncCall(
            self.handle,
            values,
            tcodes,
            ctypes.c_int(num_args),
            ctypes.byref(ret_val),
            ctypes.byref(ret_tcode),
        )
        != 0
    ):
      raise get_last_ffi_error()

E tvm._ffi.base.TVMError: Traceback (most recent call last): E 6: TVMFuncCall E 5: tvm::relay::backend::RelayBuildModule::GetFunction(std::cxx11::basic_string<char, std::char_traits, std::allocator > const&, tvm::runtime::ObjectPtr const&)::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue)#3}::operator()(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue) const E 4: tvm::relay::backend::RelayBuildModule::Build(tvm::IRModule, tvm::runtime::Array<tvm::Target, void> const&, tvm::Target const&, tvm::relay::Executor const&, tvm::relay::Runtime const&, tvm::WorkspaceMemoryPools const&, tvm::ConstantMemoryPools const&, tvm::runtime::String) E 3: tvm::relay::backend::RelayBuildModule::BuildRelay(tvm::IRModule, tvm::runtime::String const&) E 2: tvm::codegen::CreateMetadataModule(std::unordered_map<std::cxx11::basic_string<char, std::char_traits, std::allocator >, tvm::runtime::NDArray, std::hash<std::cxx11::basic_string<char, std::char_traits, std::allocator > >, std::equal_to<std::cxx11::basic_string<char, std::char_traits, std::allocator > >, std::allocator<std::pair<std::cxx11::basic_string<char, std::char_traits, std::allocator > const, tvm::runtime::NDArray> > > const&, tvm::runtime::Module, tvm::runtime::Array<tvm::runtime::Module, void> const&, tvm::Target, tvm::relay::Runtime, tvm::relay::Executor, tvm::relay::backend::ExecutorCodegenMetadata) E 1: _ZN3tvm7runtime23ConstLoaderModuleCreateERKSt13unordered_mapINSt7cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_7NDArrayESt4hashIS7_ESt8equal_toIS7_ESaISt4pairIKS7_S8_EEERKS1_IS7_St6vectorIS7_SaIS7EESA E 0: tvm::runtime::ConstLoaderModuleNode::ConstLoaderModuleNode(std::unordered_map<std::cxx11::basic_string<char, std::char_traits, std::allocator >, tvm::runtime::NDArray, std::hash<std::cxx11::basic_string<char, std::char_traits, std::allocator > >, std::equal_to<std::cxx11::basic_string<char, std::char_traits, std::allocator > >, std::allocator<std::pair<std::cxx11::basic_string<char, std::char_traits, std::allocator > const, tvm::runtime::NDArray> > > const&, std::unordered_map<std::cxx11::basic_string<char, std::char_traits, std::allocator >, std::vector<std::cxx11::basic_string<char, std::char_traits, std::allocator >, std::allocator<std::cxx11::basic_string<char, std::char_traits, std::allocator > > >, std::hash<std::cxx11::basic_string<char, std::char_traits, std::allocator > >, std::equal_to<std::cxx11::basic_string<char, std::char_traits, std::allocator > >, std::allocator<std::pair<std::cxx11::basic_string<char, std::char_traits, std::allocator > const, std::vector<std::cxx11::basic_string<char, std::char_traits, std::allocator >, std::allocator<std::cxx11::basic_string<char, std::char_traits, std::allocator > > > > > > const&) E File "/mnt/e/code/tvm/src/runtime/const_loader_module.cc", line 62 E TVMError: E --------------------------------------------------------------- E An error occurred during the execution of TVM. E For more information, please see: https://tvm.apache.org/docs/errors.html E --------------------------------------------------------------- E E Check failed: const_varndarray.count(var) > 0 (0 vs. 0) : ConstLoaderModuleNode is missing entry for constant 'tvmgen_default_dnnl_main_0_const_0' for function 'tvmgen_default_dnnl_main_0

Environment Ubuntu 18.04 TVM 0.11.dev0 Any environment details, such as: Operating System, TVM version, etc

2、Steps to reproduce

(1)run tvm/tests/python/contrib/test_dnnl.py

(2) If in config.cmake set(USE_DNNL ON), it is successed. But if in config.cmake set(USE_DNNL C_SRC), it is failed. And if in config.cmake set(USE_DNNL C_SRC), compilation is also problematic and DNNL.cmake also is modified. I modified the compilation problem and DNNL.cmake locally. You can try set(USE_DNNL C_SRC),and run test_dnnl.py.

compile error message: /mnt/e/code/tvm/src/relay/backend/contrib/dnnl/codegen.cc: In member function ‘tvm::relay::contrib::GenerateBodyOutput tvm::relay::contrib::CodegenDNNL::GenerateCompositeFunctionCall(const tvm::relay::FunctionNode, const tvm::relay::CallNode)’: /mnt/e/code/tvm/src/relay/backend/contrib/dnnl/codegen.cc:279:99: error: call of overloaded ‘GetRootCall(const tvm::relay::CallNode, int, )’ is ambiguous const auto conv_call = GetRootCall(callee->body.as(), 1, {"nn.conv2d", "nn.relu"}); ^ In file included from /mnt/e/code/tvm/src/relay/backend/contrib/dnnl/codegen.cc:37:0: /mnt/e/code/tvm/src/relay/backend/contrib/dnnl/../../utils.h:532:24: note: candidate: const tvm::relay::CallNode tvm::relay::backend::GetRootCall(const tvm::relay::CallNode, int, const std::vector<std::__cxx11::basic_string >&) inline const CallNode GetRootCall(const CallNode current_call, int depth, ^~~ /mnt/e/code/tvm/src/relay/backend/contrib/dnnl/../../utils.h:581:24: note: candidate: const tvm::relay::CallNode tvm::relay::backend::GetRootCall(const tvm::relay::CallNode, int, const string&) inline const CallNode GetRootCall(const CallNode current_call, int maxdepth, ^~~ /mnt/e/code/tvm/src/relay/backend/contrib/dnnl/codegen.cc: In member function ‘virtual void tvm::relay::contrib::DNNLConstantUpdater::VisitExpr(const tvm::relay::CallNode*)’: /mnt/e/code/tvm/src/relay/backend/contrib/dnnl/codegen.cc:596:29: error: ‘BindToCallNodeArgs’ was not declared in this scope auto args = root_cn ? BindToCallNodeArgs(args_loc, cn) : cn->args; ^~~~~~ /mnt/e/code/tvm/src/relay/backend/contrib/dnnl/codegen.cc:599:30: error: unable to deduce ‘auto&&’ from ‘args’ for (const auto& arg : args) { ^~~~ CMakeFiles/tvm_objs.dir/build.make:8307: recipe for target 'CMakeFiles/tvm_objs.dir/src/relay/backend/contrib/dnnl/codegen.cc.o' failed make[2]: [CMakeFiles/tvm_objs.dir/src/relay/backend/contrib/dnnl/codegen.cc.o] Error 1 CMakeFiles/Makefile2:850: recipe for target 'CMakeFiles/tvm_objs.dir/all' failed make[1]: [CMakeFiles/tvm_objs.dir/all] Error 2 Makefile:145: recipe for target 'all' failed make: *** [all] Error 2

yangulei commented 2 years ago

The DNNL C codegen is just a POC, set(USE_DNNL JSON) or set(USE_DNNL ON) to use the JSON runtime instead, for more details please refer to https://github.com/apache/tvm-rfcs/blob/main/rfcs/0069-byoc-onednn-integration.md.