diff --git a/examples/tensorflow/oob_models/quantization/ptq/model_detail.py b/examples/tensorflow/oob_models/quantization/ptq/model_detail.py index 07ce37cf892..8c5f2d1770d 100644 --- a/examples/tensorflow/oob_models/quantization/ptq/model_detail.py +++ b/examples/tensorflow/oob_models/quantization/ptq/model_detail.py @@ -385,5 +385,11 @@ 'low': -1.0, 'high': 1.0 }, + # centernet_hg104 + { + 'model_name': 'centernet_hg104', + 'input': {'input_tensor': generate_data([224, 224, 3]),}, + 'output': ['Identity'], + }, ] diff --git a/examples/tensorflow/oob_models/quantization/ptq/run_benchmark.sh b/examples/tensorflow/oob_models/quantization/ptq/run_benchmark.sh index 87d16a45c1e..efd68dde04d 100755 --- a/examples/tensorflow/oob_models/quantization/ptq/run_benchmark.sh +++ b/examples/tensorflow/oob_models/quantization/ptq/run_benchmark.sh @@ -101,6 +101,9 @@ function set_args { NeuMF PRNet DIEN_Deep-Interest-Evolution-Network + EfficientDet-D2-768x768 + EfficientDet-D4-1024x1024 + centernet_hg104 -------- ) diff --git a/examples/tensorflow/oob_models/quantization/ptq/run_tuning.sh b/examples/tensorflow/oob_models/quantization/ptq/run_tuning.sh index 2971bedf7c3..a183dbb52e6 100755 --- a/examples/tensorflow/oob_models/quantization/ptq/run_tuning.sh +++ b/examples/tensorflow/oob_models/quantization/ptq/run_tuning.sh @@ -83,6 +83,7 @@ function set_args { DIEN_Deep-Interest-Evolution-Network EfficientDet-D2-768x768 EfficientDet-D4-1024x1024 + centernet_hg104 -------- ) diff --git a/neural_compressor/adaptor/tf_utils/graph_rewriter/generic/fuse_pad_with_conv.py b/neural_compressor/adaptor/tf_utils/graph_rewriter/generic/fuse_pad_with_conv.py index 042c89769d9..e5f1da798ca 100644 --- a/neural_compressor/adaptor/tf_utils/graph_rewriter/generic/fuse_pad_with_conv.py +++ b/neural_compressor/adaptor/tf_utils/graph_rewriter/generic/fuse_pad_with_conv.py @@ -45,6 +45,7 @@ def do_transformation(self): target_nodes = cur_graph.query_fusion_pattern_nodes( [["Pad"], ["Conv2D", "Conv3D", "DepthwiseConv2dNative"], ('BiasAdd', 'Add', 'AddV2')]) + padding_tensor_dict = {} for node_combination in target_nodes: conv_name = node_combination[1] @@ -70,21 +71,26 @@ def do_transformation(self): continue padding_tensor = None - pad_node = graph_info[node_combination[0]].node - if graph_info[pad_node.input[1]].node.op != 'Const': - input_node = graph_info[pad_node.input[1]].node - if input_node.op == 'DataFormatVecPermute': - parent_input_node = graph_info[input_node.input[0]].node - if parent_input_node.op == 'Const': - padding_tensor = tensor_util.MakeNdarray( \ - parent_input_node.attr["value"].tensor).flatten() + pad_node = None + if node_combination[0] not in padding_tensor_dict: + pad_node = graph_info[node_combination[0]].node + if graph_info[pad_node.input[1]].node.op != 'Const': + input_node = graph_info[pad_node.input[1]].node + if input_node.op == 'DataFormatVecPermute': + parent_input_node = graph_info[input_node.input[0]].node + if parent_input_node.op == 'Const': + padding_tensor = tensor_util.MakeNdarray( \ + parent_input_node.attr["value"].tensor).flatten() + else: + continue else: continue else: - continue + padding_tensor = tensor_util.MakeNdarray( + graph_info[pad_node.input[1]].node.attr["value"].tensor).flatten() + padding_tensor_dict[node_combination[0]] = padding_tensor else: - padding_tensor = tensor_util.MakeNdarray( - graph_info[pad_node.input[1]].node.attr["value"].tensor).flatten() + padding_tensor = padding_tensor_dict[node_combination[0]] if self.itex_qdq_mode: enabled_pad_conv2d = bool(tf.version.VERSION == '1.15.0-up3' or \ @@ -95,12 +101,13 @@ def do_transformation(self): if any(padding_tensor) and not enabled_pad_conv2d: # pragma: no cover continue - if graph_info[pad_node.input[1]].node.op != 'Const': - cur_graph.node_name_details[pad_node.name].node.input.remove(pad_node.input[1]) - cur_graph.remove_node_with_single_input_output(pad_node.name) - else: - cur_graph.remove_node_with_single_input_output(pad_node.name) - cur_graph.remove_node(pad_node.input[1]) + if pad_node: + if graph_info[pad_node.input[1]].node.op != 'Const': + cur_graph.node_name_details[pad_node.name].node.input.remove(pad_node.input[1]) + cur_graph.remove_node_with_single_input_output(pad_node.name) + else: + cur_graph.remove_node_with_single_input_output(pad_node.name) + cur_graph.remove_node(pad_node.input[1]) conv_node = graph_info[node_combination[1]].node if self.itex_qdq_mode: if any(padding_tensor) and enabled_pad_conv2d: # pragma: no cover diff --git a/neural_compressor/adaptor/tf_utils/graph_rewriter/generic/fuse_pad_with_fp32_conv.py b/neural_compressor/adaptor/tf_utils/graph_rewriter/generic/fuse_pad_with_fp32_conv.py index 8b63b17ff31..2866a40ec04 100644 --- a/neural_compressor/adaptor/tf_utils/graph_rewriter/generic/fuse_pad_with_fp32_conv.py +++ b/neural_compressor/adaptor/tf_utils/graph_rewriter/generic/fuse_pad_with_fp32_conv.py @@ -46,6 +46,7 @@ def do_transformation(self): target_nodes = cur_graph.query_fusion_pattern_nodes( [["Pad"], ["Conv2D", "DepthwiseConv2dNative"], ('BiasAdd', 'Add', 'AddV2')]) + padding_tensor_dict = {} for node_combination in target_nodes: conv_name = node_combination[1] @@ -71,21 +72,26 @@ def do_transformation(self): continue padding_tensor = None - pad_node = graph_info[node_combination[0]].node - if graph_info[pad_node.input[1]].node.op != 'Const': - input_node = graph_info[pad_node.input[1]].node - if input_node.op == 'DataFormatVecPermute': - parent_input_node = graph_info[input_node.input[0]].node - if parent_input_node.op == 'Const': - padding_tensor = tensor_util.MakeNdarray( \ - parent_input_node.attr["value"].tensor).flatten() + pad_node = None + if node_combination[0] not in padding_tensor_dict: + pad_node = graph_info[node_combination[0]].node + if graph_info[pad_node.input[1]].node.op != 'Const': + input_node = graph_info[pad_node.input[1]].node + if input_node.op == 'DataFormatVecPermute': + parent_input_node = graph_info[input_node.input[0]].node + if parent_input_node.op == 'Const': + padding_tensor = tensor_util.MakeNdarray( \ + parent_input_node.attr["value"].tensor).flatten() + else: + continue else: continue else: - continue + padding_tensor = tensor_util.MakeNdarray( + graph_info[pad_node.input[1]].node.attr["value"].tensor).flatten() + padding_tensor_dict[node_combination[0]] = padding_tensor else: - padding_tensor = tensor_util.MakeNdarray( - graph_info[pad_node.input[1]].node.attr["value"].tensor).flatten() + padding_tensor = padding_tensor_dict[node_combination[0]] if self.itex_qdq_mode: enabled_pad_conv2d = bool(tf.version.VERSION == '1.15.0-up3' or \ @@ -95,12 +101,14 @@ def do_transformation(self): if any(padding_tensor) and not enabled_pad_conv2d: # pragma: no cover continue - if graph_info[pad_node.input[1]].node.op != 'Const': - cur_graph.node_name_details[pad_node.name].node.input.remove(pad_node.input[1]) - cur_graph.remove_node_with_single_input_output(pad_node.name) - else: - cur_graph.remove_node_with_single_input_output(pad_node.name) - cur_graph.remove_node(pad_node.input[1]) + + if pad_node: + if graph_info[pad_node.input[1]].node.op != 'Const': + cur_graph.node_name_details[pad_node.name].node.input.remove(pad_node.input[1]) + cur_graph.remove_node_with_single_input_output(pad_node.name) + else: + cur_graph.remove_node_with_single_input_output(pad_node.name) + cur_graph.remove_node(pad_node.input[1]) conv_node = graph_info[node_combination[1]].node # Helper.set_attr_int_list(conv_node, "padding_list", padding_tensor) # only when padding attr is explicit, the explicit_paddings is not empty diff --git a/neural_compressor/adaptor/tf_utils/graph_rewriter/qdq/insert_qdq_pattern.py b/neural_compressor/adaptor/tf_utils/graph_rewriter/qdq/insert_qdq_pattern.py index 62269322bc5..091d02add98 100644 --- a/neural_compressor/adaptor/tf_utils/graph_rewriter/qdq/insert_qdq_pattern.py +++ b/neural_compressor/adaptor/tf_utils/graph_rewriter/qdq/insert_qdq_pattern.py @@ -182,7 +182,7 @@ def _check_op_list(self, node_type): "MaxPool", "MaxPool3D", "FusedBatchNormV3", "Requantize", "RequantizePerChannel", "AvgPool", "Pad", "CropAndResize", "Dequantize", "Mean", "MatMul", "BatchMatMul", "BatchMatMulV2", "FakeQuantWithMinMaxVars", "_MklFusedInstanceNorm", - "Conv2DBackpropInput", "Conv3DBackpropInputV2") + "Conv2DBackpropInput", "Conv3DBackpropInputV2", "Sigmoid", "BiasAdd") return any([node_type.find(i) != -1 for i in op_list]) def _find_relu_node(self, node): @@ -198,7 +198,7 @@ def _find_relu_node(self, node): or len(self.node_name_mapping \ [Helper.node_name_from_input(node.input[0])].output) > 1): return True - elif 'T' in node.attr and node.attr['T'].type in (dtypes.quint8, dtypes.uint8): + elif 'T' in node.attr and dtypes.DType(node.attr['T'].type) in (dtypes.quint8, dtypes.uint8): return True elif (node.op.find("QuantizedConv") != -1 or node.op.find("QuantizedDepthwiseConv") != -1 or diff --git a/neural_compressor/adaptor/tf_utils/graph_util.py b/neural_compressor/adaptor/tf_utils/graph_util.py index 77903d4b62c..d810f1d87a1 100644 --- a/neural_compressor/adaptor/tf_utils/graph_util.py +++ b/neural_compressor/adaptor/tf_utils/graph_util.py @@ -918,11 +918,13 @@ def gen_per_iter(data): if i.startswith(first_line): iterations += 1 - step = len(valid_data) / iterations + step = int(len(valid_data) / iterations) final_res = [] for i in range(iterations): final_res.extend(gen_per_iter(valid_data[int(i*step): int(step*( i+ 1))])) + if i + 1 == iterations and int(step*( i+ 1)) < len(valid_data): + final_res.extend(gen_per_iter(valid_data[int(step*( i+ 1)): len(valid_data)])) return final_res