def __topi_nn_conv2d_NCHWc(*args, **kwargs): assert not kwargs, "Do not support kwargs in template function call" data, kernel, strides, padding, dilation, layout, dtype = deserialize_args(args) raw_data_shape = get_const_tuple(data.shape) raw_kernel_shape = get_const_tuple(kernel.shape) # get config here cfg = get_config() _create_schedule_template(cfg, data, kernel, strides, padding, dilation, layout) cfg.add_flop(1) # change shape with the value in config ic_bn = cfg["tile_ic"].val if hasattr(cfg["tile_ic"], "val") else cfg["tile_ic"].size[-1] oc_bn = cfg["tile_oc"].val if hasattr(cfg["tile_oc"], "val") else cfg["tile_oc"].size[-1] new_data_shape = (raw_data_shape[0], raw_data_shape[1] // ic_bn, raw_data_shape[2], raw_data_shape[3], ic_bn) new_kernel_shape = (raw_kernel_shape[0] // oc_bn, raw_kernel_shape[1] // ic_bn, raw_kernel_shape[2], raw_kernel_shape[3], ic_bn, oc_bn) new_data = tvm.placeholder(new_data_shape, data.dtype) new_kernel = tvm.placeholder(new_kernel_shape, kernel.dtype) C = _decl_cl_spatialpack_NCHWc(cfg, new_data, new_kernel, strides, padding, dilation, dtype) s = _schedule_conv2d_NCHWc(cfg, [C]) return s, [new_data, new_kernel, C]
def _topi_nn_conv2d_NCHWc(*args, **kwargs): assert not kwargs, "Do not support kwargs in template function call" args = deserialize_args(args) if len(args) == 7: data, kernel, strides, padding, dilation, origin_layout, dtype = args else: assert len(args) == 8 data, kernel, strides, padding, dilation, origin_layout, out_layout, dtype = args raw_data_shape = get_const_tuple(data.shape) raw_kernel_shape = get_const_tuple(kernel.shape) # get config here cfg = get_config() _create_tuning_space(cfg, data, kernel, strides, padding, dilation, origin_layout) # change shape with the value in config ic_bn, oc_bn, ow_bn = (cfg["tile_ic"].size[-1], cfg["tile_oc"].size[-1], cfg["tile_ow"].size[-1]) new_data_shape = (raw_data_shape[0], raw_data_shape[1] // ic_bn, raw_data_shape[2], raw_data_shape[3], ic_bn) data_layout = "NCHW%dc" % ic_bn out_layout = "NCHW%dc" % oc_bn new_kernel_shape = (raw_kernel_shape[0] // oc_bn, raw_kernel_shape[1] // ic_bn, raw_kernel_shape[2], raw_kernel_shape[3], ic_bn, oc_bn) new_data = tvm.placeholder(new_data_shape, data.dtype) new_kernel = tvm.placeholder(new_kernel_shape, kernel.dtype) C = _declaration_conv_NCHWc(cfg, new_data, new_kernel, strides, padding, dilation, data_layout, out_layout, dtype) s = _schedule_conv2d_NCHWc(cfg, [C]) return s, [new_data, new_kernel, C]
def _topi_nn_depthwise_conv2d_NCHWc(*args, **kwargs): assert not kwargs, "Do not support kwargs in template function call" data, kernel, strides, padding, dilation, dtype = deserialize_args(args) batch, in_channel, height, width = get_const_tuple(data.shape) filter_channel, channel_multiplier, kh, kw = get_const_tuple(kernel.shape) ph, pw = padding if isinstance(padding, (tuple, list)) else (padding, padding) sh, sw = strides if isinstance(strides, (tuple, list)) else (strides, strides) out_height = (height - kh + 2 * ph) // sh + 1 out_width = (width - kw + 2 * pw) // sw + 1 out_channel = filter_channel * channel_multiplier # get config here cfg = get_config() cfg.define_split("tile_ic", in_channel, num_outputs=2) cfg.define_split("tile_oc", out_channel, num_outputs=2) cfg.define_split("tile_ow", out_width, num_outputs=2, filter=lambda y: y.size[-1] <= 64) # change shape with the value in config ic_bn, oc_bn = cfg["tile_ic"].size[-1], cfg["tile_oc"].size[-1] new_data_shape = (batch, in_channel // ic_bn, height, width, ic_bn) new_kernel_shape = (out_channel // oc_bn, kh, kw, oc_bn) new_data = tvm.placeholder(new_data_shape, data.dtype) new_kernel = tvm.placeholder(new_kernel_shape, kernel.dtype) data_layout = "NCHW%dc" % ic_bn out_layout = "NCHW%dc" % oc_bn C = _depthwise_conv2d_NCHWc_cpu(cfg, new_data, new_kernel, strides, padding, dilation, data_layout, out_layout, dtype) s = schedule_depthwise_conv2d_NCHWc(cfg, [C]) return s, [new_data, new_kernel, C]
def layout_transform(*args): """Autotvm layout transform template.""" args = deserialize_args(args) cfg = get_config() cfg.add_flop(-1) data = args[0] out = topi.layout_transform(*args) sch = topi.generic.schedule_injective([out]) return sch, [data, out]
def _topi_nn_conv2d(*args, **kwargs): assert not kwargs, "Do not support kwargs in template function call" args = deserialize_args(args) A, W = args[:2] with tvm.target.vta(): res = topi.nn.conv2d(*args, **kwargs) res = topi.right_shift(res, 8) res = my_clip(res, 0, 127) res = topi.cast(res, "int8") if tvm.target.current_target().device_name == 'vta': s = topi.generic.schedule_conv2d_nchw([res]) else: s = tvm.create_schedule([res.op]) return s, [A, W, res]
def _topi_nn_depthwise_conv2d_NCHWc(*args, **kwargs): assert not kwargs, "Do not support kwargs in template function call" data, kernel, strides, padding, dilation, dtype = deserialize_args(args) batch, in_channel, height, width = get_const_tuple(data.shape) filter_channel, channel_multiplier, kh, kw = get_const_tuple(kernel.shape) ph, pw = padding if isinstance(padding, (tuple, list)) else (padding, padding) sh, sw = strides if isinstance(strides, (tuple, list)) else (strides, strides) out_height = (height - kh + 2 * ph) // sh + 1 out_width = (width - kw + 2 * pw) // sw + 1 out_channel = filter_channel * channel_multiplier # get config here cfg = get_config() cfg.define_split("tile_ic", in_channel, num_outputs=2) cfg.define_split("tile_oc", out_channel, num_outputs=2) cfg.define_split("tile_ow", out_width, num_outputs=2, filter=lambda y: y.size[-1] <= 64) # change shape with the value in config ic_bn, oc_bn = cfg["tile_ic"].size[-1], cfg["tile_oc"].size[-1] new_data_shape = (batch, in_channel // ic_bn, height, width, ic_bn) new_kernel_shape = (out_channel // oc_bn, 1, kh, kw, 1, oc_bn) new_data = tvm.placeholder(new_data_shape, data.dtype) new_kernel = tvm.placeholder(new_kernel_shape, kernel.dtype) data_layout = "NCHW%dc" % ic_bn out_layout = "NCHW%dc" % oc_bn C = _depthwise_conv2d_NCHWc_cpu(cfg, new_data, new_kernel, strides, padding, dilation, data_layout, out_layout, dtype) s = schedule_depthwise_conv2d_NCHWc(cfg, [C]) return s, [new_data, new_kernel, C]