mapper

‘mapper’为 Maptools 核心代码,包含’graph_shaper’ ‘operator_parser’ ‘onnx_converter’ ‘tile_mapper’ ‘noc_mapper’五个子文件

计划修改:

  1. onnx_conveter:

# // TODO need to provide the size info (W x H) of the intermidiate data (size info is restored after onnx-sim)

# // TODO need to support multi-style paddings in inception (there is no Pads any more in onnx-simplified model)

TODO need to support reduce mean in mnasnet

TODO need to support sigmoid in efficientnet

TODO need to support global average pool and gemm layer

graph_shaper

operator_parser

onnx_converter

模型转换的全部流程都被集成到 OnnxConverter 这个 class 中, 用户只需要创建 OnnxConverter 对象并调用其 OnnxConverter.run_conversion 方法便可实现整个模型转换流程。

run_conversion 内依次调用了:py:data:construct_origin_graphconstruct_host_graphconstruct_device_graph 三个方法,其中:

construct_origin_graph

首先调用了 _construct_raw_graph 方法,在该方法中,遍历了输入ONNX模型的index(i)和node(n)。在每个node上,如果该node没有名字,那么将用index的值作为它的名字。接下来,用 _assert_node 验证该node的操作类型是否支持。然后,如果node的操作类型属于Merge类型(多个输入),那么将遍历它的所有前继节点,将它们和它们对应的edge加入graph中。否则(单个输入),仅将该节点的前继节点和对应的edge加入graph中。接下来,检查节点的第一个输出( succ_node ),将和对应的edge其加入到graph中。最后,使用parser对graph再次整理。

接下来调用了 raw_graph.connect_concats 方法,对concat类型的node进行配置。首先,将遍历所有graph中的所有节点,寻找concat类型的node。找到concat类型的node后,将搜索这些node所对应的目标节点,并调用 _config_concat 方法进行配置。配置过程中,将遍历所有Conv烈性节点,配置其 concat_slotblock_boxes 。完成所有目标节点的配置后,将去搜索下一个节点。最后,调用了 _format_block_boxes ,遍历查找所有Conv类型节点,为其添加 block_boxes

然后,调用了 raw_graph.reduce ,对graph进行简化。首先,原graph被导入,然后对每个node进行遍历,获取其前继(输入)和后继(输出)节点。如果一个node同时有输入和输出节点,并且只有一个输入节点,那么将断言错误。最后,简化后的graph、原graph以及 ‘quantize’ 声明将被返回,

construct_host_graph

这一步仅调用了origin_graph.dispatch_graph方法。该方法将原graph导入,然后进行深度优先搜索(DFS)算法

construct_device_graph

tile_mapper

‘tile_mapper’将’device_graph’转换为’CTG’,将算子规则化映射到’tile’中,并根据需要将’tile’配置中的’operator quant config (OQC)’对象转换到’tile quant config (TQC)’对象。

map_list = List[np.ndarray]

包含每一层的映射信息,列表中的每一个元素为一个’numpy array’代表一层的映射信息,’numpy array’中的每一个元素又代表当前层映射’tile’组成的’block’,’numpy array’中的元素的数值就是这个’block’中的’tile’数量

match_dict = Dict[str, int]

匹配算子图’operator graph’中的每一个计算节点和’map_list’中的每一层

map_dict = Dict[Tuple[int, int, int, int], Dict[str, Any]]

可以获取每个映射得到的’tile’相关配置信息的查找表。四元元组’Tuple’组成的’key’含义为’(layer_idx, cluster_idx, block_idx, idx_in_block)’,这个’key’可以唯一确定一个’tile’