Closed
Description
Problem description
tvm.contrib.sparse.placeholder
is intended to be an input type for topi.sparse.csrmv
(#1289, #1291 by @liangfu). However, passing sparse.placeholder
to tvm.build
leads to ValueError: don't know how to convert type <class 'tvm.contrib.sparse.CSRPlaceholderOp'> to object
.
This is because tvm.contrib.sparse.CSRPlaceholderOp
cannot pass the check inside tvm.runtime.object_generic.convert_to_object
:
tvm/python/tvm/runtime/object_generic.py
Line 57 in 2628179
where ObjectTypes
is defined as :
tvm/python/tvm/runtime/object_generic.py
Line 38 in 2628179
Steps to reproduce
Build TVM 0.8.dev
from the latest master branch, and then run:
# Adapted from https://github.com/apache/tvm/blob/main/tests/python/topi/python/test_topi_sparse.py
import tvm
from tvm import te
from tvm import topi
import tvm.contrib.sparse as tvmsp
def build_csrmv(use_sparse=False, dtype='float32', target='llvm'):
nr, nc, nnz = te.var("nr"), te.var("nc"), te.var("nnz")
A = tvmsp.placeholder(shape=(nr, nc), nonzeros=nnz, dtype=dtype, name="A")
B = te.placeholder((nc, 1), dtype=dtype, name="B")
OUT = topi.sparse.csrmv(A, B)
s = te.create_schedule(OUT.op)
if use_sparse:
f = tvm.build(
s, [nr, A, B, OUT],
target=target, name="csrmv"
)
else:
f = tvm.build(
s, [nr, A.data, A.indices, A.indptr, B, OUT],
target=target, name="csrmv"
)
return f
csrmv = build_csrmv() # works, when passing separate components inside CSR matrix
csrmv_sp = build_csrmv(use_sparse=True) # fails, when passing the CSR matrix as a whole
Metadata
Metadata
Assignees
Labels
No labels