Here is the script that reproduces the issue:
```
import sys
import os

import tvm
from tvm import relay
from tvm import autotvm
from tvm.autotvm.tuner import XGBTuner, GATuner, RandomTuner, GridSearchTuner
from tvm.autotvm.graph_tuner import DPTuner, PBQPTuner

import tflite.Model


#
# This function loads the model
#
def get_model(input_type):
    #
    # Models come from https://www.tensorflow.org/lite/guide/hosted_models
    # The path is hard coded, change to match your setup
    #
    base = "./my_models/mobilenet_v2/"
    model_name = base + "mobilenet_v2_1.0_224_quant.tflite"
    #
    # Model parameters
    #
    input_name = "input"
    dshape = (1, 224, 224, 3)
    
    with open(model_name, "rb") as f:
        tflite_model_buf = f.read()

    assert input_type == "uint8", "Quantized models use uint8 input_type"
    
    tflite_model = tflite.Model.Model.GetRootAsModel(tflite_model_buf, 0)

    mod, params =\
        relay.frontend.from_tflite(tflite_model,
                                   shape_dict={input_name: dshape},
                                   dtype_dict={input_name: input_type})
    #
    # Assume model from TFLite is NHWC, convert to NCHW
    #
    # print(mod["main"].body, file=open('relay_NHWC.txt', 'w'))
    with relay.build_config(opt_level=3):
        seq = tvm.transform.Sequential([
            relay.transform.RemoveUnusedFunctions(),
            relay.transform.ConvertLayout(layout)
        ])
        mod = seq(mod)
    # print(mod["main"].body, file=open('relay_NCHW.txt', 'w'))

    return mod, params, input_name, dshape


#
# Kernel tuning function
#
def tune_kernels(tasks,
                 n_trial,
                 measure_option,
                 tuner='random',
                 early_stopping=None,
                 log_filename='tuning.log',
                 graph_filename=None,
                 layout=None,
                 target=None,
                 context=None,
                 use_existing=None):

    for i, task in enumerate(tasks):
        prefix = "[Task %2d/%2d] " % (i+1, len(tasks))

        # create tuner
        if tuner == 'xgb' or tuner == 'xgb-rank':
            tuner_obj = XGBTuner(task, loss_type='rank')
        elif tuner == 'ga':
            tuner_obj = GATuner(task, pop_size=50)
        elif tuner == 'random':
            tuner_obj = RandomTuner(task)
        elif tuner == 'gridsearch':
            tuner_obj = GridSearchTuner(task)
        else:
            raise ValueError("Invalid tuner: " + tuner)

        # do tuning
        n_trial = min(n_trial, len(task.config_space))

        tuner_obj.tune(n_trial=n_trial,
                       early_stopping=early_stopping,
                       measure_option=measure_option,
                       callbacks=[
                           autotvm.callback.progress_bar(n_trial,
                                                         prefix=prefix),
                           autotvm.callback.log_to_file(log_filename)])


#
# Use graph tuner to achieve graph level optimal schedules
# Set use_DP=False if it takes too long to finish.
#
def tune_graph(graph, input_name, dshape, records, opt_sch_file, use_DP=True):
    target_op = [relay.op.get("nn.conv2d"),
                  relay.op.get("nn.contrib_depthwise_conv2d_NCHWc"),
                  relay.op.get("nn.contrib_conv2d_NCHWc"), ]
    Tuner = DPTuner if use_DP else PBQPTuner

    executor = Tuner(graph,
                     {input_name: dshape},
                     records,
                     target_op,
                     target)
    executor.benchmark_layout_transform(min_exec_num=2000)
    executor.run()
    executor.write_opt_sch2record_file(opt_sch_file)


#
# Tune the graph
#
def tune(tuning_opt, input_type):
    #
    # Read the model and get the relevant parameters, then extract workload
    #
    mod, params, input_name, data_shape = get_model(input_type)
    #
    # Tune the tasks
    #
    target_op = [relay.op.get("nn.conv2d"),
                 relay.op.get("nn.contrib_depthwise_conv2d_NCHWc"),
                 relay.op.get("nn.contrib_conv2d_NCHWc"), ]
    tasks = autotvm.task.extract_from_program(mod["main"], target=target,
                                              params=params,
                                              ops=target_op)
    
    tune_kernels(tasks, **tuning_opt)
    
    tune_graph(mod["main"],
               input_name,
               data_shape,
               sch_log,
               graph_log,
               True)

    with autotvm.apply_graph_best(graph_log):
        logging.info("Compiling the schedule")
        with relay.build_config(opt_level=3):
            graph, lib, params = relay.build_module.build(
                mod, target=target, params=params)
        #
        # Export the model
        #
        base = "./out/"
        lib.export_library(base + "binary.so")
        with open(base + "graph.json", "w") as fo:
            fo.write(graph)
            with open(base + "params.params", "wb") as fo:
                fo.write(relay.save_param_dict(params))


if __name__ == "__main__":
    #
    # Global variables that define the model
    #
    target = "llvm -mcpu=skylake"
    ctx = tvm.cpu()
    model_name = "mobilenetv2"
    dtype_input = "uint8"
    layout = "NCHW"
    batch_size = 1
    
    num_threads = 4
    os.environ["TVM_NUM_THREADS"] = str(num_threads)
    #
    # Set the log filenames
    #
    graph_log = "%s_%s_graph_opt.log" % (model_name, dtype_input)
    sch_log = "%s_%s.log" % (model_name, dtype_input)
    #
    # Tuning parameters
    #
    tuning_option = {
        "log_filename": sch_log,
        "graph_filename": graph_log,
        "layout": layout,
        "target": target,
        "context": ctx,
        "tuner": "random",
        "n_trial": 20,
        "early_stopping": None,
        "measure_option": autotvm.measure_option(
            builder=autotvm.LocalBuilder(timeout=100),
            runner=autotvm.LocalRunner(number=10, repeat=1,
                                       min_repeat_ms=1000),
            ),
        }

    tune(tuning_option, dtype_input)

```
The problem should look like (just showing the first few lines):
```
  %0 = layout_transform(%input, src_layout="NHWC", dst_layout="NCHW");
  %1 = layout_transform(%v_param_1, src_layout="HWIO", dst_layout="OIHW");
  %2 = qnn.conv2d(%0, %1, 128, 122, 0.0078125f, 0.0339689f, strides=[2, 2], 
padding=[0, 0, 1, 1], channels=32, kernel_size=[3, 3], out_dtype="int32") an 
internal invariant was violated while typechecking your program [13:38:14] 
/Users/alopez/Documents/Code/LatentAI/tvm/src/relay/qnn/op/convolution.cc:50: 
Check failed: data->dtype == DataType::Int(8) || data->dtype == 
DataType::UInt(8): Expected qnn conv2d type(int8, uint8) for input but was 
float32
; ;
  %3 = expand_dims(%v_param_2, axis=0, num_newaxis=3);
  %4 = layout_transform(%3, src_layout="NHWC", dst_layout="NCHW");
  %5 = add(%2, %4);
  %6 = qnn.requantize(%5, 0.000265382f, 0, 0.0235285f, 0, axis=1, 
out_dtype="uint8") an internal invariant was violated while typechecking your 
program [13:38:14] 
/Users/alopez/Documents/Code/LatentAI/tvm/src/relay/qnn/op/requantize.cc:250: 
Check failed: data != nullptr: 
....
```
Let me know if you need more information, and thanks for looking into this!





---
[Visit 
Topic](https://discuss.tvm.ai/t/autotvm-task-extract-from-program-in-tflite/6578/17)
 to respond.

You are receiving this because you enabled mailing list mode.

To unsubscribe from these emails, [click 
here](https://discuss.tvm.ai/email/unsubscribe/c68ac2ad7b4199bd0035874dcf5516e204d7d7a686be36274d2bd7fd2b848b12).

Reply via email to