def test_tuple_value(): tv = container.tuple_object( [relay.const(1), relay.const(2), relay.const(3)]) np.testing.assert_allclose(tv[0].data.asnumpy(), 1) np.testing.assert_allclose(tv[1].data.asnumpy(), 2) np.testing.assert_allclose(tv[2].data.asnumpy(), 3)
def test_tuple_passing(): x = relay.var('x', type_annotation=relay.ty.TupleType([ relay.ty.TensorType((), 'int64'), relay.ty.TensorType((), 'int64') ])) fn = relay.Function([x], relay.expr.TupleGetItem(x, 0)) mod = relay.Module({}) gv = relay.GlobalVar('main') mod[gv] = fn mod = relay.transform.InferType()(mod) ctx = tvm.cpu() target = tvm.target.create('llvm') exec = relay.create_executor(mod=mod, ctx=ctx, target=target) f = exec.evaluate(gv) # First use a Python tuple. out = f((10, 8)) tvm.testing.assert_allclose(out.asnumpy(), np.array(10)) # Second use a tuple value. value_tuple = container.tuple_object( [nd.array(np.array(11)), nd.array(np.array(12))]) out = f(value_tuple) tvm.testing.assert_allclose(out.asnumpy(), np.array(11))
def test_tuple_passing(): x = relay.var( "x", type_annotation=relay.ty.TupleType( [relay.ty.TensorType((), "int64"), relay.ty.TensorType((), "int64")] ), ) fn = relay.Function([x], relay.expr.TupleGetItem(x, 0)) mod = tvm.IRModule({}) gv = relay.GlobalVar("main") mod[gv] = fn mod = relay.transform.InferType()(mod) dev = tvm.cpu() target = tvm.target.Target("llvm") exec = relay.create_executor(mod=mod, device=dev, target=target) f = exec.evaluate(gv) # First use a Python tuple. out = f((10, 8)) tvm.testing.assert_allclose(out.numpy(), np.array(10)) # Second use a tuple value. value_tuple = container.tuple_object([nd.array(np.array(11)), nd.array(np.array(12))]) out = f(value_tuple) tvm.testing.assert_allclose(out.numpy(), np.array(11))
def convert_list_to_vmobj(py_lst): def wrap_nd_array(arr): return tvm.nd.array(arr, ctx=tvm.cpu(0)) mod = tvm.IRModule() prelude = Prelude(mod) adt_lst = ADT(prelude.nil.tag, []) for elem in reversed(py_lst): if isinstance(elem, np.ndarray): vmobj = wrap_nd_array(elem) elif isinstance(elem, tuple): vmobj = tuple_object([wrap_nd_array(e) for e in elem]) elif isinstance(elem, list): vmobj = convert_list_to_vmobj(elem) adt_lst = ADT(prelude.cons.tag, [vmobj, adt_lst]) return adt_lst
def test_tuple_object(): x = relay.var('x', type_annotation=relay.ty.TupleType([ relay.ty.TensorType((), 'int32'), relay.ty.TensorType((), 'int32') ])) fn = relay.Function([x], relay.expr.TupleGetItem(x, 0)) mod = tvm.IRModule.from_expr(fn) exe = relay.create_executor(kind="vm", mod=mod, ctx=nd.cpu(), target="llvm") f = exe.evaluate() value_tuple = _container.tuple_object( [nd.array(np.array(11)), nd.array(np.array(12))]) # pass an ADT object to evaluate out = f(value_tuple) tvm.testing.assert_allclose(out.asnumpy(), np.array(11))
def test_function_taking_adt_ref_tuple(): mod = tvm.IRModule() prelude = relay.prelude.Prelude(mod) intrp = create_executor("debug", mod) _, cons, nil = prelude.mod.get_type("List") nil_value = ConstructorValue(nil.tag, [], nil) cons_value = ConstructorValue( cons.tag, [nd.array(np.random.rand(1, 10).astype("float32")), nil_value], cons, ) ref_value = RefValue(nd.array(np.random.rand(1, 10).astype("float32"))) tuple_value = container.tuple_object( [nd.array(np.random.rand(1, 10).astype("float32")) for _ in range(10)]) id_func = intrp.evaluate(prelude.id) res_nil = id_func(nil_value) assert res_nil.tag == nil_value.tag assert len(res_nil.fields) == 0 res_cons = id_func(cons_value) assert res_cons.tag == cons_value.tag assert len(res_cons.fields) == len(cons_value.fields) tvm.testing.assert_allclose(res_cons.fields[0].asnumpy(), cons_value.fields[0].asnumpy()) assert isinstance(res_cons.fields[1], ConstructorValue) assert res_cons.fields[1].tag == nil.tag assert len(res_cons.fields[1].fields) == 0 res_ref = id_func(ref_value) tvm.testing.assert_allclose(res_ref.value.asnumpy(), ref_value.value.asnumpy()) res_tuple = id_func(tuple_value) for i in range(10): tvm.testing.assert_allclose(res_tuple[i].asnumpy(), tuple_value[i].asnumpy())