def test_graph_executor(hexagon_session: Session): """Test graph executor""" dtype = "float32" data = relay.var("data", relay.TensorType((1, 64, 64, 3), dtype)) weight = relay.var("weight", relay.TensorType((5, 5, 3, 8), dtype)) conv2d_op = relay.nn.conv2d( data, weight, padding=(2, 2), kernel_size=(5, 5), data_layout="NHWC", kernel_layout="HWIO", out_dtype="float32", ) f = relay.Function([data, weight], conv2d_op) relay_mod = tvm.IRModule.from_expr(f) relay_mod = relay.transform.InferType()(relay_mod) target_hexagon = tvm.target.hexagon("v68") runtime = Runtime("cpp") executor = Executor("graph") weight_in = np.random.rand(5, 5, 3, 8).astype(dtype=dtype) data_in = np.random.rand(1, 64, 64, 3).astype(dtype=dtype) params = {"weight": weight_in} inputs = {"data": data_in} with tvm.transform.PassContext(opt_level=3): lowered = tvm.relay.build( relay_mod, tvm.target.Target(target_hexagon, host=target_hexagon), runtime=runtime, executor=executor, ) graph_mod = hexagon_session.get_executor_from_factory(lowered) graph_mod.set_input(**params) graph_mod.run(**inputs) hexagon_output = graph_mod.get_output(0).numpy() target_llvm = tvm.target.Target("llvm") with tvm.transform.PassContext(opt_level=3): llvm_lowered = tvm.relay.build( relay_mod, tvm.target.Target(target_llvm, host=target_llvm), runtime=runtime, executor=executor, ) llvm_graph_mod = tvm.contrib.graph_executor.GraphModule( llvm_lowered["default"](tvm.cpu(0))) llvm_graph_mod.set_input(**params) llvm_graph_mod.run(**inputs) expected_output = llvm_graph_mod.get_output(0).numpy() tvm.testing.assert_allclose(hexagon_output, expected_output, rtol=1e-4, atol=1e-5)
def test_mobilenet_aot(hexagon_session: Session, aot_host_target, aot_target, enable_usmp): if hexagon_session._launcher._serial_number == "simulator": pytest.skip(msg="Skip on simulator due to long runtime.") dtype = "float32" onnx_model = get_mobilenet() data_in = np.random.rand(1, 3, 224, 224).astype(dtype=dtype) input_name = "input" shape_dict = {input_name: data_in.shape} relay_mod, params = relay.frontend.from_onnx(onnx_model, shape_dict, freeze_params=True) inputs = {input_name: data_in} target_llvm = tvm.target.Target("llvm") config = {"tir.usmp.enable": enable_usmp} with tvm.transform.PassContext(opt_level=3, config=config): hexagon_lowered = tvm.relay.build( relay_mod, tvm.target.Target(aot_target, host=aot_host_target), runtime=Runtime("cpp"), executor=Executor("aot", { "unpacked-api": False, "interface-api": "packed" }), params=params, ) aot_mod = hexagon_session.get_executor_from_factory(hexagon_lowered) aot_mod.set_input(**inputs) aot_mod.run() hexagon_output = aot_mod.get_output(0).numpy() with tvm.transform.PassContext(opt_level=3): llvm_lowered = tvm.relay.build( relay_mod, tvm.target.Target(target_llvm, host=target_llvm), runtime=Runtime("cpp"), executor=Executor("graph", {"link-params": True}), params=params, ) llvm_graph_mod = tvm.contrib.graph_executor.GraphModule( llvm_lowered["default"](tvm.cpu(0))) llvm_graph_mod.set_input(**inputs) llvm_graph_mod.run() expected_output = llvm_graph_mod.get_output(0).numpy() tvm.testing.assert_allclose(hexagon_output, expected_output, rtol=1e-4, atol=1e-5)
def test_mobilenet(hexagon_session: Session): dtype = "float32" onnx_model = get_mobilenet() target_hexagon = tvm.target.hexagon("v68") target_llvm = tvm.target.Target("llvm") runtime = Runtime("cpp") executor = Executor("graph", {"link-params": True}) data_in = np.random.rand(1, 3, 224, 224).astype(dtype=dtype) input_name = "input" shape_dict = {input_name: data_in.shape} relay_mod, params = relay.frontend.from_onnx(onnx_model, shape_dict, freeze_params=True) inputs = {input_name: data_in} with tvm.transform.PassContext(opt_level=3): hexagon_lowered = tvm.relay.build( relay_mod, tvm.target.Target(target_hexagon, host=target_hexagon), runtime=runtime, executor=executor, params=params, ) llvm_lowered = tvm.relay.build( relay_mod, tvm.target.Target(target_llvm, host=target_llvm), runtime=runtime, executor=executor, params=params, ) graph_mod = hexagon_session.get_executor_from_factory(hexagon_lowered) graph_mod.set_input(**inputs) graph_mod.run() hexagon_output = graph_mod.get_output(0).numpy() llvm_graph_mod = tvm.contrib.graph_executor.GraphModule( llvm_lowered["default"](tvm.cpu(0))) llvm_graph_mod.set_input(**inputs) llvm_graph_mod.run() expected_output = llvm_graph_mod.get_output(0).numpy() tvm.testing.assert_allclose(hexagon_output, expected_output, rtol=1e-4, atol=1e-5)
def test_conv2d(hexagon_session: Session, aot_host_target, aot_target, usmp_enabled): """Try conv2d on AOT target with usmp_enabled and check for TVMBackendAllocWorkspace calls""" dtype = "float32" input_shape = (1, 8, 8, 3) w1_shape = (5, 5, 3, 1) w2_shape = (5, 5, 1, 3) data = relay.var("data", relay.TensorType(input_shape, dtype)) weight1 = relay.var("weight1", relay.TensorType(w1_shape, dtype)) weight2 = relay.var("weight2", relay.TensorType(w2_shape, dtype)) outpu1 = relay.nn.conv2d( data, weight1, padding=(2, 2), kernel_size=(5, 5), data_layout="NHWC", kernel_layout="HWIO", out_dtype="float32", ) output2 = relay.nn.conv2d( outpu1, weight2, padding=(2, 2), kernel_size=(5, 5), data_layout="NHWC", kernel_layout="HWIO", out_dtype="float32", ) f = relay.Function([data, weight1, weight2], output2) relay_mod = tvm.IRModule.from_expr(f) relay_mod = relay.transform.InferType()(relay_mod) weight1_data = np.random.rand(w1_shape[0], w1_shape[1], w1_shape[2], w1_shape[3]).astype(dtype=dtype) weight2_data = np.random.rand(w2_shape[0], w2_shape[1], w2_shape[2], w2_shape[3]).astype(dtype=dtype) input_data = np.random.rand(input_shape[0], input_shape[1], input_shape[2], input_shape[3]).astype(dtype=dtype) params = {"weight1": weight1_data, "weight2": weight2_data} inputs = {"data": input_data} with tvm.transform.PassContext(opt_level=3, config={"tir.usmp.enable": usmp_enabled}): lowered = tvm.relay.build( relay_mod, params=params, target=tvm.target.Target(aot_target, host=aot_host_target), runtime=Runtime("cpp"), executor=Executor("aot", { "unpacked-api": False, "interface-api": "packed" }), ) assert is_tvm_backendallocworkspace_calls(lowered.lib) != usmp_enabled aot_mod = hexagon_session.get_executor_from_factory(lowered) aot_mod.set_input(**inputs) aot_mod.run() hexagon_output = aot_mod.get_output(0).numpy() target_llvm = tvm.target.Target("llvm") with tvm.transform.PassContext(opt_level=3): llvm_lowered = tvm.relay.build( relay_mod, tvm.target.Target(target_llvm, host=target_llvm), runtime=Runtime("cpp"), executor=Executor("graph"), ) llvm_graph_mod = tvm.contrib.graph_executor.GraphModule( llvm_lowered["default"](tvm.cpu(0))) llvm_graph_mod.set_input(**params) llvm_graph_mod.run(**inputs) expected_output = llvm_graph_mod.get_output(0).numpy() tvm.testing.assert_allclose(hexagon_output, expected_output, rtol=1e-4, atol=1e-5)
def test_aot_executor(hexagon_session: Session, aot_host_target, aot_target): dtype = "float32" input_shape = (1, 128, 128, 3) w_shape = (5, 5, 3, 8) data = relay.var("data", relay.TensorType(input_shape, dtype)) weight = relay.var("weight", relay.TensorType(w_shape, dtype)) y = relay.nn.conv2d( data, weight, padding=(2, 2), kernel_size=(5, 5), data_layout="NHWC", kernel_layout="HWIO", out_dtype="float32", ) f = relay.Function([data, weight], y) relay_mod = tvm.IRModule.from_expr(f) relay_mod = relay.transform.InferType()(relay_mod) weight_data = np.random.rand(w_shape[0], w_shape[1], w_shape[2], w_shape[3]).astype(dtype=dtype) input_data = np.random.rand(input_shape[0], input_shape[1], input_shape[2], input_shape[3]).astype(dtype=dtype) params = {"weight": weight_data} inputs = {"data": input_data} with tvm.transform.PassContext(opt_level=3): lowered = tvm.relay.build( relay_mod, params=params, target=tvm.target.Target(aot_target, host=aot_host_target), runtime=Runtime("cpp"), executor=Executor("aot", { "unpacked-api": False, "interface-api": "packed" }), ) aot_mod = hexagon_session.get_executor_from_factory(lowered) aot_mod.set_input(**inputs) aot_mod.run() hexagon_output = aot_mod.get_output(0).numpy() target_llvm = tvm.target.Target("llvm") with tvm.transform.PassContext(opt_level=3): llvm_lowered = tvm.relay.build( relay_mod, tvm.target.Target(target_llvm, host=target_llvm), runtime=Runtime("cpp"), executor=Executor("graph"), ) llvm_graph_mod = tvm.contrib.graph_executor.GraphModule( llvm_lowered["default"](tvm.cpu(0))) llvm_graph_mod.set_input(**params) llvm_graph_mod.run(**inputs) expected_output = llvm_graph_mod.get_output(0).numpy() tvm.testing.assert_allclose(hexagon_output, expected_output, rtol=1e-4, atol=1e-5)
def test_graph_executor_multiple_conv2d(hexagon_session: Session): dtype = "float32" input_shape = (1, 8, 8, 3) w1_shape = (5, 5, 3, 1) w2_shape = (5, 5, 1, 3) data = relay.var("data", relay.TensorType(input_shape, dtype)) weight1 = relay.var("weight1", relay.TensorType(w1_shape, dtype)) weight2 = relay.var("weight2", relay.TensorType(w2_shape, dtype)) y1 = relay.nn.conv2d( data, weight1, padding=(2, 2), kernel_size=(5, 5), data_layout="NHWC", kernel_layout="HWIO", out_dtype="float32", ) y2 = relay.nn.conv2d( y1, weight2, padding=(2, 2), kernel_size=(5, 5), data_layout="NHWC", kernel_layout="HWIO", out_dtype="float32", ) f = relay.Function([data, weight1, weight2], y2) relay_mod = tvm.IRModule.from_expr(f) relay_mod = relay.transform.InferType()(relay_mod) target_hexagon = tvm.target.hexagon("v68") runtime = Runtime("cpp") executor = Executor("graph") with tvm.transform.PassContext(opt_level=3): lowered = tvm.relay.build( relay_mod, tvm.target.Target(target_hexagon, host=target_hexagon), runtime=runtime, executor=executor, ) weight1_data = np.random.rand(w1_shape[0], w1_shape[1], w1_shape[2], w1_shape[3]).astype(dtype=dtype) weight2_data = np.random.rand(w2_shape[0], w2_shape[1], w2_shape[2], w2_shape[3]).astype(dtype=dtype) input_data = np.random.rand(input_shape[0], input_shape[1], input_shape[2], input_shape[3]).astype(dtype=dtype) params = {"weight1": weight1_data, "weight2": weight2_data} inputs = {"data": input_data} graph_mod = hexagon_session.get_executor_from_factory(lowered) graph_mod.set_input(**params) graph_mod.run(**inputs) hexagon_output = graph_mod.get_output(0).numpy() target_llvm = tvm.target.Target("llvm") with tvm.transform.PassContext(opt_level=3): llvm_lowered = tvm.relay.build( relay_mod, tvm.target.Target(target_llvm, host=target_llvm), runtime=runtime, executor=executor, ) llvm_graph_mod = tvm.contrib.graph_executor.GraphModule( llvm_lowered["default"](tvm.cpu(0))) llvm_graph_mod.set_input(**params) llvm_graph_mod.run(**inputs) expected_output = llvm_graph_mod.get_output(0).numpy() tvm.testing.assert_allclose(hexagon_output, expected_output, rtol=1e-4, atol=1e-5)