Step1:DL模型解析
针对不同的DL框架及模型格式,TVM提供了不同的前端解析脚本,存放位置为:vmpythonvmelayfrontend,如下图所示:
TVM通过调用不同DL框架的API对已训练好的模型进行解析,以Tensorflow模型解析为例(from_tensorflow.py)
如上述代码所示,调用TF API完成对NN Graph的解析及模型参数的提取。
Step2:遍历DL模型Node Tree,转化为TVM Node Tree
首先检测对模型OP的支持能力,missing_operators = self._parse_import_prerequisites(graph),检查是否支持所有的OP,返回TVM暂不支持的OP集合。实现如下:
如上所示,除了占位符及常量类型的参数外,分别从4个list中做检索,其中_identity_list中存储的是DL框架中OP名称与TVM中OP名称一致,不需要做转换,Tensorflow为空; _convert_map_rnn 循环神经网络OP的映射;代码如下:
_control_flow_nodes 控制节点,仅tensorflow需要,代码如下:
重点需要关注的是_convert_map,其中存储的是DL框架通用方法与TVM方法的映射:
如上所示,左侧为DL模型OP Node的名称,右侧为TVM中相对应的TVM Node OP,处理代码如下:
op = self._convert_operator(node.op, inputs, attr, graph)
以“'Conv2D' : _conv('conv'),”为例,其执行结果(以Index Expression形式展现)示例如下:
注意OP的输入是此OP之前的子树,所以输出会包含此OP之前所有的TVM Node OP信息。
const类型的NODE通常存储的是模型参数,解析出来之后格式如下图所示:
如上所示分别是dtype,shape及具体数据。