def callback(self, pre: tvm.relay.Expr, post: tvm.relay.Expr, node_map: tvm.ir.container.Map): id_input = post.args[0] quantize_args = post.op.body.args output_scale = float(quantize_args[1].data.asnumpy()) output_zp = int(quantize_args[2].data.asnumpy()) dequantize_args = quantize_args[0].args[0].args input_scale = float(dequantize_args[1].data.asnumpy()) input_zp = int(dequantize_args[2].data.asnumpy()) lut_values = get_lut_from_func(input_scale, input_zp, output_scale, output_zp, self.calc_func) lut = relay.const(lut_values, dtype="uint8") # We baked the requantization into the LUT, so we don't requantize the identity operator identity = ethosu_ops.ethosu_identity( ifm=id_input, lut=lut, ifm_scale=input_scale, ifm_zero_point=input_zp, ofm_scale=input_scale, ofm_zero_point=input_zp, activation=self.activation_type, ) return identity
def callback(self, pre: tvm.relay.Expr, post: tvm.relay.Expr, node_map: tvm.ir.container.Map): params = self.params_class(post.op.body) params.ifm.tensor = post.args[0] calc_func_params = self.get_calc_func_params(post.op) input_scale = float(params.ifm.q_params.scale_f32) input_zp = int(params.ifm.q_params.zero_point) output_scale = float(params.ofm.q_params.scale_f32) output_zp = int(params.ofm.q_params.zero_point) lut_values = get_lut_from_func( input_scale, input_zp, output_scale, output_zp, self.calc_func, calc_func_params, ) lut = relay.const(lut_values, dtype=params.ifm.dtype) # We baked the requantization into the LUT, so we don't requantize the identity operator identity = ethosu_ops.ethosu_identity( ifm=params.ifm.tensor, lut=lut, ifm_scale=input_scale, ifm_zero_point=input_zp, ofm_scale=input_scale, ofm_zero_point=input_zp, activation=self.activation_type, ) return identity
def callback(self, pre, post, node_map): id_input = post.args[0] quantize_args = post.op.body.args output_scale = float(quantize_args[1].data.asnumpy()) output_zp = int(quantize_args[2].data.asnumpy()) dequantize_args = quantize_args[0].args[0].args input_scale = float(dequantize_args[1].data.asnumpy()) input_zp = int(dequantize_args[2].data.asnumpy()) lut_values = find_tanh_values(input_scale, input_zp, output_scale, output_zp) lut = relay.const(lut_values, dtype="uint8") # We baked the requantization into the LUT, so we don't requantize the identity operator identity = ethosu_ops.ethosu_identity( ifm=id_input, lut=lut, ifm_scale=input_scale, ifm_zero_point=input_zp, ofm_scale=input_scale, ofm_zero_point=input_zp, activation="TANH", ) return identity
def callback(self, pre: tvm.relay.Expr, post: tvm.relay.Expr, node_map: tvm.ir.container.Map) -> tvm.relay.Expr: params = ethosu_patterns.Resize2dParams(post.op.body) params.ifm.tensor = post.args[0] lut = relay.const([], "int8") ifm_shape = params.ifm.shape in_channels = ifm_shape[-1] reduced_op = params.ifm.tensor current_size = np.array(ifm_shape[1:3]) output_size = np.array(params.size) if (current_size == output_size).all(): return ethosu_ops.ethosu_identity( reduced_op, lut, ifm_scale=float(params.ifm.q_params.scale_f32), ifm_zero_point=int(params.ifm.q_params.zero_point), ofm_scale=float(params.ofm.q_params.scale_f32), ofm_zero_point=int(params.ofm.q_params.zero_point), ) padding = [0, 0, 0, 0] rounding_mode = "TFL" pool_shape = [1, 1] if params.method == "linear": pool_shape = [2, 2] rounding_mode = "NATURAL" if params.coordinate_transformation_mode == "asymmetric": # Use SAME padding. ypad = Resize2dRewriter.get_required_padding(ifm_shape[1]) xpad = Resize2dRewriter.get_required_padding(ifm_shape[2]) padding = [ ypad // 2, xpad // 2, (ypad + 1) // 2, (xpad + 1) // 2 ] return ethosu_ops.ethosu_pooling( ifm=reduced_op, lut=lut, pooling_type="AVG", ifm_scale=float(params.ifm.q_params.scale_f32), ifm_zero_point=int(params.ifm.q_params.zero_point), ofm_scale=float(params.ofm.q_params.scale_f32), ofm_zero_point=int(params.ofm.q_params.zero_point), pool_shape=pool_shape, ofm_channels=in_channels, strides=[1, 1], padding=padding, upscale="NEAREST", rounding_mode=rounding_mode, )
def callback(self, pre: tvm.relay.Expr, post: tvm.relay.Expr, node_map: tvm.ir.container.Map) -> tvm.relay.Expr: params = ethosu_patterns.RequantizeParams(post.op.body) params.ifm.tensor = post.args[0] lut = relay.const([], "int8") return ethosu_ops.ethosu_identity( ifm=params.ifm.tensor, lut=lut, ifm_scale=float(params.ifm.q_params.scale_f32), ifm_zero_point=int(params.ifm.q_params.zero_point), ofm_scale=float(params.ofm.q_params.scale_f32), ofm_zero_point=int(params.ofm.q_params.zero_point), )
def make_ethosu_identity( ifm, lut=relay.const([], dtype="int8"), ifm_scale=1, ifm_zero_point=0, ofm_scale=1, ofm_zero_point=0, activation="NONE", ): identity = ethosu_ops.ethosu_identity( ifm, lut=lut, ifm_scale=ifm_scale, ifm_zero_point=ifm_zero_point, ofm_scale=ofm_scale, ofm_zero_point=ofm_zero_point, activation=activation, ) return identity
def callback(self, pre: tvm.relay.Expr, post: tvm.relay.Expr, node_map: tvm.ir.container.Map) -> tvm.relay.Expr: if pre.checked_type.dtype == "int32": return post return ethosu_ops.ethosu_identity(ifm=post, lut=relay.const([], dtype="int8"))