Skip to content

[Bug] [Unity] Fail to print out call trace under relax::Normalizer #15880

@jinhongyii

Description

@jinhongyii

Expected behavior

printing out call trace when encountering ICHECK failure

Actual behavior

python/tvm/relax/block_builder.py:645: in normalize
    return _ffi_api.BlockBuilderNormalize(self, expr)  # type: ignore
python/tvm/_ffi/_ctypes/packed_func.py:239: in __call__
    raise_last_ffi_error()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    def raise_last_ffi_error():
        """Raise the previous error from FFI
    
        This should be used instead of `raise get_last_ffi_error()`, as it
        handle propagation of errors across an FFI boundary.  For example,
        if Python passes a callback to a C++ function, and the callback
        raises an exception, the re-thrown exception should contain the
        full stack trace, not just the stack frames that are above the
        outermost FFI call.
        """
    
        _LIB.TVMGetLastPythonError.restype = ctypes.c_void_p
        _LIB.TVMGetLastBacktrace.restype = ctypes.c_char_p
        py_err = _LIB.TVMGetLastPythonError()
        if py_err is None:
            c_err_msg = py_str(_LIB.TVMGetLastError())
            py_err_msg, err_type = c2pyerror(c_err_msg)
            if err_type is not None and err_type.startswith("tvm.error."):
                err_type = err_type[10:]
            py_err = ERROR_TYPE.get(err_type, TVMError)(py_err_msg)
    
        else:
            # TVMGetLastPythonError returns a PyObject*, with NULL when
            # there is no such value.  If we annotated the restype as
            # ctypes.py_object, we would need to return Py_None from the
            # C++ implementation.  This would require introducing a
            # dependency on libpython that we want to avoid when not in a
            # Python environment.  Therefore, casting the resulting void*
            # pointer to PyObject* using ctypes.
            py_err = ctypes.cast(ctypes.c_void_p(py_err), ctypes.py_object).value
    
        tb = py_err.__traceback__
    
        # The py_err.__traceback__ only goes from the location thrown
        # up to the next FFI handoff.  To have the stacktrace also
        # include the C++ side, we need to adjust the __traceback__
        # before re-throwing.
        backtrace = _LIB.TVMGetLastBacktrace()
        if backtrace:
            frames = re.split(r"\n\W+\d+:\W+", py_str(backtrace))
            frames = frames[1:]  # Skip "Stack trace: "
    
            for frame in frames:
                if " at " in frame:
                    print(frame)
                    func_name, frame = frame.split(" at ", 1)
>                   filename, lineno = frame.rsplit(":", 1)
E                   ValueError: not enough values to unpack (expected 2, got 1)

Environment

TVM Unity TOT

Steps to reproduce

Comment out this line:
https://github.com/apache/tvm/blob/unity/src/relax/op/tensor/linear_algebra.cc#L150
and run tests/python/relax/test_op_linear_algebra.py

if you print out frame here, you will see

tvm::relax::BlockBuilderImpl::ReportFatal(tvm::Diagnostic const&)
        at /home/hongyi/tvm/src/relax/ir/block_builder.cc:138
tvm::relax::GetTensorStructInfoFromTuple(tvm::relax::Call const&, tvm::relax::BlockBuilder const&, tvm::RelayExpr const&)
        at /home/hongyi/tvm/src/relax/op/op_common.cc:64
tvm::relax::InferStructInfoEinsum(tvm::relax::Call const&, tvm::relax::BlockBuilder const&)
        at /home/hongyi/tvm/src/relax/op/tensor/linear_algebra.cc:173
tvm::relax::Normalizer::InferStructInfo(tvm::relax::Call const&)
        at /home/hongyi/tvm/src/relax/ir/block_builder.cc:757
tvm::relax::Normalizer::VisitExpr_(tvm::relax::CallNode const*)
        at /home/hongyi/tvm/src/relax/ir/block_builder.cc:599
non-virtual thunk to tvm::relax::Normalizer::VisitExpr_(tvm::relax::CallNode const*)
        at /home/hongyi/tvm/src/relax/ir/block_builder.cc

cc @quic-sanirudh

Metadata

Metadata

Assignees

No one assigned

    Labels

    branch: unityneeds-triagePRs or issues that need to be investigated by maintainers to find the right assignees to address ittype: bug

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions