def build(mod, params, npu=True, expected_host_ops=0, npu_partitions=1):
    relay.backend.compile_engine.get().clear()
    with tvm.transform.PassContext(
            opt_level=3, config={"relay.ext.ethos-n.options": {
                "variant": 0
            }}):
        with tvm.target.Target("llvm"):
            if npu:
                f = relay.build_module.bind_params_by_name(mod["main"], params)
                mod = tvm.IRModule()
                mod["main"] = f
                pattern = get_pattern_table("ethos-n")
                mod = relay.transform.MergeComposite(pattern)(mod)
                mod = relay.transform.AnnotateTarget("ethos-n")(mod)
                mod = relay.transform.MergeCompilerRegions()(mod)
                mod = relay.transform.PartitionGraph()(mod)
                host_op_count = get_host_op_count(mod)
                assert (host_op_count == expected_host_ops
                        ), "Got {} host operators, expected {}".format(
                            host_op_count, expected_host_ops)
                partition_count = 0
                for global_var in mod.get_global_vars():
                    if "ethos-n" in global_var.name_hint:
                        partition_count += 1

                assert (npu_partitions == partition_count
                        ), "Got {} ethos-n partitions, expected {}".format(
                            partition_count, npu_partitions)

            return relay.build(mod, params=params)
Example #2
0
def test_reshape_failure(input_shape, output_shape, dtype, err_msg):
    np.random.seed(0)
    model, params = _get_model(input_shape, output_shape, dtype)
    mod = tei.make_module(model, params)
    pattern = get_pattern_table("ethos-n")
    mod = tei.make_module(model, params)
    mod = relay.transform.MergeComposite(pattern)(mod)
    mod = tei.make_ethosn_partition(mod["main"].body)
    tei.test_error(mod, {}, err_msg)
Example #3
0
def build(mod, params, npu=True, expected_host_ops=0, npu_partitions=1):
    """Build a network with or without Ethos-N offloading.

    Parameters
    ----------
    mod : IRModule
        The Relay module to build.
    params : dict of str to NDArray
        The weights to build with.
    npu : bool, optional
        Whether to build with Ethos-N offloading.
    expected_host_ops : int, optional
        The number of ops expected to remain on the host.
    npu_partitions : int, optional
        The number of Ethos-N partitions expected.
    """
    relay.backend.te_compiler.get().clear()
    with tvm.transform.PassContext(
        opt_level=3, config={"relay.ext.ethos-n.options": {"variant": get_ethosn_variant()}}
    ):
        with tvm.target.Target("llvm"):
            if npu:
                f = relay.build_module.bind_params_by_name(mod["main"], params)
                mod = tvm.IRModule()
                mod["main"] = f
                pattern = get_pattern_table("ethos-n")
                mod = relay.transform.InferType()(mod)
                mod = relay.transform.MergeComposite(pattern)(mod)
                mod = relay.transform.AnnotateTarget("ethos-n")(mod)
                mod = relay.transform.InferType()(mod)
                mod = relay.transform.MergeCompilerRegions()(mod)
                mod = relay.transform.InferType()(mod)
                mod = relay.transform.PartitionGraph()(mod)
                host_op_count = get_host_op_count(mod)
                assert (
                    host_op_count == expected_host_ops
                ), "Got {} host operators, expected {}".format(host_op_count, expected_host_ops)

                attrs = [
                    mod[var.name_hint].attrs
                    for var in mod.get_global_vars()
                    if mod[var.name_hint].attrs
                ]
                partition_count = sum(
                    [
                        key == "Compiler" and value == "ethos-n"
                        for attr in attrs
                        for key, value in attr.items()
                    ]
                )
                assert (
                    npu_partitions == partition_count
                ), "Got {} ethos-n partitions, expected {}".format(partition_count, npu_partitions)

            return relay.build(mod, params=params)
Example #4
0
def test_reshape_failure():
    trials = [
        (
            (1, 15, 4, 1),
            (1, 15, -2),
            "uint8",
            "reshape dimension=-2, reshape dimension must be >= -1",
        ),
    ]

    np.random.seed(0)
    for input_shape, output_shape, dtype, err_msg in trials:
        model, params = _get_model(input_shape, output_shape, dtype)
        mod = tei.make_module(model, params)
        pattern = get_pattern_table("ethos-n")
        mod = tei.make_module(model, params)
        mod = relay.transform.MergeComposite(pattern)(mod)
        mod = tei.make_ethosn_partition(mod["main"].body)
        tei.test_error(mod, {}, err_msg)