code: def test_per_channel_kernel_scale():
      data_shape = (2, 1, 2, 4)
      data_dtype = "uint8"
      kernel_shape = (1, 3, 2, 2)
      kernel_dtype = "uint8"
      data = relay.var("data", shape=data_shape, dtype=data_dtype)
      kernel = relay.var(
          "kernel", shape=kernel_shape, dtype=kernel_dtype
      )
      kernel_scales = [2, 2, 2]
      kernel_scales = relay.const(
          np.array(kernel_scales).astype("float32")
      )
      func = relay.qnn.conv2d_transpose(
          data,
          kernel,
          input_zero_point=relay.const(0, "int32"),
          kernel_zero_point=relay.const(0, "int32"),
          input_scale=relay.const(2.0, "float32"),
          kernel_scale=kernel_scales,
          kernel_size=(2, 2),
          channels=kernel_shape[0],
          padding=(0, 0),
          strides=(1, 1),
          dilation=(1, 1),
          data_layout="NCHW",
          kernel_layout="IOHW",
          out_dtype="int32",
      )
  
      mod = relay.Function(relay.analysis.free_vars(func), func)
      mod = tvm.IRModule.from_expr(mod)
  
imports: import numpy
  import tvm
  from tvm import relay, te
  from tvm.contrib import graph_executor
  from tvm.relay import transform
  from tvm.relay.testing import run_infer_type
  from tvm.relay.testing.temp_op_attr import TempOpAttr
label_desc: Use image node_id 15 for calling a global function with example usage: test_per_channel_kernel_scale() without return types