OpenPPL 是商汤科技高性能计算 (HPC) 团队开源的 AI 推理引擎。 不同于 Caffe 使用 ProtoBuffer 定义 IR、MNN 使用 FlatBuffers 定义 IR,OpenPPL 则是使用 C++ 代码定义 IR。

IR 模块地址:https://github.com/openppl-public/ppl.nn/tree/master/src/ppl/nn/ir

lR 模块中各个类的关系图

图片

IR 模块中各个类包含的字段 

图片

IR 中对外核心类是 Graph,其中包含 GraphTopo 和 GraphData 两个字段。

GraphData 类主要用来记录模型中的数据信息,包含模型的输入、输出、常量、OP的 weight 等。GraphTopo 类主要用来记录模型内各个 OP 的拓扑关系,包含模型的输入输出的节点信息、Node 节点信息(对应 ONNX 中的 Node)、Edge 边信息(对应 ONNX 中 Initializer、模型推理过程中 feature map 等)、以及 Node 和 Edge 的拓扑关系。

如果单独看 IR 模块代码,不太容易在脑海里形成一个计算图构建的动态过程,因此可以借助 ONNX 模型解析模块代码,脑补出从 ONNX 模型转化一个 OpenPPL 计算图Graph 的过程。ONNX 模型解析代码地址:

链接

https://github.com/openppl-public/ppl.nn/blob/master/src/ppl/nn/models/onnx/graph_parser.cc

解析过程,分为如下几个步骤:

1、解析 ONNX 模型中 Initializer 信息,将 Initializer 构造成一个 IR 中的 Constant,加入到 GraphData,并且作为一个 Edge 加入到 GraphTopo 中,标记为常量;

2、解析 ONNX 模型中的输入信息,将 ONNX 中的 input 构造成一个 IR 中的 Edge,加入到 GraphTopo 中,标记为输入;同时在 GraphData 中加入 edge 的 shape 等信息;

3、解析 ONNX 模型的中 Node 信息,将 ONNX 中的 Node 构造成 IR 中的 Node,加入到 GraphTopo 中,并且根据 Node 的输入输出信息,设置相应的 Edge 信息;设置相应的属性信息

4、解析 ONNX 模型的输出信息,其逻辑和输入类似

5、解析 GraphExtraInput

内容中包含的图片若涉及版权问题,请及时与我们联系删除