in tinynn/converter/operators/optimize.py [0:0]
def optimize(self):
# Input/output passes
self.output_list_unpack_pass()
self.input_transpose_pass()
self.output_transpose_pass()
# Connect unused tensors with special nodes
self.connect_unused_tensors_pass()
# Transpose, Reshape and NO-OP cleanup
self.branch_reshape_expand_pass()
self.fuse_simple_reshape_pass()
self.branch_transpose_expand_pass()
self.fuse_simple_transpose_pass()
self.fuse_simple_gather_pass()
for branch in (False, True):
self.remove_noop_pass(branch)
self.fuse_wrapped_reshape_within_transpose_pass()
# Buffer folding, which is needed by the fusion passes below
for _ in range(2):
self.fold_reshape_buffer()
self.fold_transpose_buffer()
# Move `transpose` ops for the rewrite quantizable pass
self.elementwise_op_transpose_passthrough_pass(quantizable_ops_only=True)
self.branch_transpose_expand_pass()
self.fuse_simple_transpose_pass()
# Fuse reciprocal and sqrt
self.fuse_reciprocal_sqrt()
# Map quantizable ops to quantized kernels
self.elementwise_op_quantize_passthrough_pass()
# Remove consecutive dequantize and quantize nodes
self.fuse_dequant_quant_pass(q_first=False)
# OP fusion passes before transformation
self.fuse_conv_fc_bn()
self.fuse_activation()
self.fuse_requantize()
self.fuse_bn_conv()
# Convert TinyNeuralNetwork ops to TFLite ops
self.transform_graph()
# OP fusion passes after transformation
self.fuse_bmm_add_pass()
self.fuse_activation()
# Transpose and reshape cleanup
self.branch_reshape_expand_pass()
self.branch_transpose_expand_pass()
self.fuse_simple_transpose_pass()
self.fuse_simple_reshape_pass()
# Branch transpose & reshape cleanup
for i in range(11):
t_count = self.elementwise_op_transpose_passthrough_pass()
self.branch_transpose_expand_pass()
self.fuse_simple_transpose_pass()
r_count = self.elementwise_op_reshape_passthrough_pass()
self.branch_reshape_expand_pass()
self.fuse_simple_reshape_pass()
c_count = self.elementwise_reshape_transpose_passthrough_pass()
self.branch_transpose_expand_pass()
self.fuse_simple_transpose_pass()
if t_count + r_count + c_count == 0:
log.debug(f'elem p/t pass finished in {i + 1} steps')
break
# Other cleanups
self.fuse_simple_slice_pass()
for branch in (False, True):
self.remove_noop_pass(branch)
self.fuse_wrapped_reshape_within_transpose_pass()
# Buffer folding
for _ in range(2):
self.fold_reshape_buffer()
self.fold_transpose_buffer()
# Transpose and reshape cleanup
for _ in range(2):
self.transpose_to_reshape_pass()
self.branch_reshape_expand_pass()
self.fuse_simple_reshape_pass()
self.fuse_simple_transpose_pass()
self.lower_transpose_dim_pass()
# Some advanced fusion logic
self.fuse_conv2d_gather()
# Remove consecutive dequantize and quantize nodes
self.fuse_dequant_quant_pass(q_first=True)
# Fuse reciprocal and sqrt
self.fuse_reciprocal_sqrt()
# Remove additional tile nodes before elementwise ops
self.remove_tile_before_binary_elementwise_ops()
# Fuse activation
self.fuse_activation()
# Fuse quant/dequant nodes
self.fuse_quant_dequant_nodes()
# Input output quantize type
self.quantize_input_output_type_pass()
# Fuse same padding
self.fuse_same_padding()
self.fuse_same_padding_slicing()
self.fuse_gather_conv2d()
# Group conv & deconv
self.group_conv_rewrite_pass()
self.group_deconv_rewrite_pass()
# TFLite micro specific
self.cat_split_pass()
self.split_requantize()
# Group the same tensors into one
self.group_tensors_pass()
# Final cleanup
self.cleanup_dead_nodes()