def test_build_quantizer_propagation_state_graph_from_ip_graph(self): ip_graph = InsertionPointGraph(get_two_branch_mock_model_graph()) quant_prop_graph = QPSG(ip_graph) assert len(ip_graph.nodes) == len(quant_prop_graph.nodes) assert len(ip_graph.edges) == len(quant_prop_graph.edges) for ip_graph_node_key, ip_graph_node in ip_graph.nodes.items(): qpg_node = quant_prop_graph.nodes[ip_graph_node_key] assert qpg_node[QPSG.NODE_TYPE_NODE_ATTR] == QPSG.ipg_node_type_to_qpsg_node_type(ip_graph_node[ InsertionPointGraph.NODE_TYPE_NODE_ATTR]) qpg_node_type = qpg_node[QPSG.NODE_TYPE_NODE_ATTR] if qpg_node_type == QuantizerPropagationStateGraphNodeType.INSERTION_POINT: assert qpg_node[QPSG.PROPAGATING_QUANTIZER_NODE_ATTR] is None assert not qpg_node[QPSG.AFFECTING_PROPAGATING_QUANTIZERS_ATTR] assert qpg_node[QPSG.INSERTION_POINT_DATA_NODE_ATTR] == ip_graph_node[ InsertionPointGraph.INSERTION_POINT_DATA_NODE_ATTR] elif qpg_node_type == QuantizerPropagationStateGraphNodeType.OPERATOR: assert not qpg_node[QPSG.ALLOWED_INPUT_QUANTIZATION_TYPES_NODE_ATTR] assert qpg_node[QPSG.QUANTIZATION_TRAIT_NODE_ATTR] == QuantizationTrait.NON_QUANTIZABLE assert not qpg_node[QPSG.AFFECTING_PROPAGATING_QUANTIZERS_ATTR] for from_node, to_node, edge_data in ip_graph.edges(data=True): qpg_edge_data = quant_prop_graph.edges[from_node, to_node] assert not qpg_edge_data[QPSG.AFFECTING_PROPAGATING_QUANTIZERS_ATTR] for key, value in edge_data.items(): assert qpg_edge_data[key] == value quant_prop_graph.run_consistency_check()
def __init__(self, ip_graph: InsertionPointGraph): super().__init__() ip_graph = deepcopy(ip_graph) self._created_prop_quantizer_counter = 0 for node_key, node in ip_graph.nodes.items(): qpg_node = { self.NODE_TYPE_NODE_ATTR: node[InsertionPointGraph.NODE_TYPE_NODE_ATTR] } if node[InsertionPointGraph. NODE_TYPE_NODE_ATTR] == InsertionPointGraphNodeType.INSERTION_POINT: qpg_node[self.PROPAGATING_QUANTIZER_NODE_ATTR] = None qpg_node[self.AFFECTING_PROPAGATING_QUANTIZERS_ATTR] = [] qpg_node[self.INSERTION_POINT_DATA_NODE_ATTR] = node[ InsertionPointGraph.INSERTION_POINT_DATA_NODE_ATTR] elif node[ InsertionPointGraph. NODE_TYPE_NODE_ATTR] == InsertionPointGraphNodeType.OPERATOR: qpg_node[ self.ALLOWED_INPUT_QUANTIZATION_TYPES_NODE_ATTR] = set() qpg_node[ self. QUANTIZATION_TRAIT_NODE_ATTR] = QuantizationTrait.NON_QUANTIZABLE qpg_node[self.AFFECTING_PROPAGATING_QUANTIZERS_ATTR] = [] qpg_node[self.OPERATOR_METATYPE_NODE_ATTR] = node[ InsertionPointGraph.OPERATOR_METATYPE_NODE_ATTR] self.add_node(node_key, **qpg_node) for from_node, to_node, edge_data in ip_graph.edges(data=True): edge_data[self.AFFECTING_PROPAGATING_QUANTIZERS_ATTR] = [] self.add_edge(from_node, to_node, **edge_data)
def __init__(self, ip_graph: InsertionPointGraph, ignored_scopes=None): super().__init__() ip_graph = deepcopy(ip_graph) self._created_prop_quantizer_counter = 0 self._ignored_scopes = deepcopy(ignored_scopes) self.ignored_node_keys = [] barrier_node_extra_edges = [] for node_key, node in ip_graph.nodes.items(): qpg_node = { self.NODE_TYPE_NODE_ATTR: \ self.ipg_node_type_to_qpsg_node_type(node[InsertionPointGraph.NODE_TYPE_NODE_ATTR])} if node[InsertionPointGraph. NODE_TYPE_NODE_ATTR] == InsertionPointGraphNodeType.INSERTION_POINT: qpg_node[self.PROPAGATING_QUANTIZER_NODE_ATTR] = None qpg_node[self.AFFECTING_PROPAGATING_QUANTIZERS_ATTR] = [] qpg_node[self.INSERTION_POINT_DATA_NODE_ATTR] = node[ InsertionPointGraph.INSERTION_POINT_DATA_NODE_ATTR] elif node[ InsertionPointGraph. NODE_TYPE_NODE_ATTR] == InsertionPointGraphNodeType.OPERATOR: qpg_node[ self.ALLOWED_INPUT_QUANTIZATION_TYPES_NODE_ATTR] = set() qpg_node[ self. QUANTIZATION_TRAIT_NODE_ATTR] = QuantizationTrait.NON_QUANTIZABLE qpg_node[self.AFFECTING_PROPAGATING_QUANTIZERS_ATTR] = [] qpg_node[self.OPERATOR_METATYPE_NODE_ATTR] = node[ InsertionPointGraph.OPERATOR_METATYPE_NODE_ATTR] scope_node = str( node[InsertionPointGraph.REGULAR_NODE_REF_NODE_ATTR][ NNCFGraph.OP_EXEC_CONTEXT_NODE_ATTR].input_agnostic) if in_scope_list(scope_node, self._ignored_scopes): self.ignored_node_keys.append(node_key) qpg_node_barrier = { self.NODE_TYPE_NODE_ATTR: QuantizerPropagationStateGraphNodeType. AUXILIARY_BARRIER, 'label': QuantizerPropagationStateGraph.BARRIER_NODE_KEY_POSTFIX } barrier_node_key = self.get_barrier_node_key(node_key) self.add_node(barrier_node_key, **qpg_node_barrier) barrier_node_extra_edges.append( (barrier_node_key, node_key)) self.add_node(node_key, **qpg_node) for from_node, to_node, edge_data in ip_graph.edges(data=True): edge_data[self.AFFECTING_PROPAGATING_QUANTIZERS_ATTR] = [] self.add_edge(from_node, to_node, **edge_data) for u_node_key, v_node_key in barrier_node_extra_edges: edge_attr = { QuantizerPropagationStateGraph.AFFECTING_PROPAGATING_QUANTIZERS_ATTR: [] } next_v_node_key = list( self.succ[v_node_key].keys())[0] # POST HOOK v self.add_edge(v_node_key, u_node_key, **edge_attr) self.add_edge(u_node_key, next_v_node_key, **edge_attr) self.remove_edge(v_node_key, next_v_node_key)