Inference_Framework

PNNX
PNNX项目 PyTorch Neural Network eXchange(PNNX)是PyTorch模型互操作性的开放标准。PNNX为PyTorch提供了一种开源的模型格式,它定义了与Pytorch相匹配的数据流图和运算图,我们的框架在PNNX之上封装了一层更加易用和简单的计算图格式。pytorch训练好一个模型之后,然后模型需要转换到pnnx格式,然后pnnx格式我们再去读取,形成计算图.

pytorch到我们计算图?

PNNX帮我做了很多的图优化、算子融合的工作,所以底层的用它PNNX的话,我们可以吸收图优化的结果,后面推理更快.

但是不直接在项目中用PNNX,因为别人的工作和自己推理框架开发思路总是有不同的。所以在这上面封装,又快速又好用方便,符合自己的使用习惯。

我们只是去读取PNNX产物,然后构建自己一种易用的计算图结构。

产物:resnet18.pnnx.param PNNX graph definition 结构定义

resnet18.pnnx.bin PNNX model weight 权重

PNNX的格式定义:

PNNX由操作数operand(运算数)和operator(运算符号),PNNX::Graph用来管理和操作这两者。

操作数(operand),也可以通过操作数来方向访问到这个数字的产生者和使用者Customer

Operand有以下几个部分组成:

Producer: 类型是operator, 表示产生了这个操作数的运算符(operator). 也就是说这个操作数(operand)是Producer的输出. Producer这个操作符号产生了当前的Operand
Customer:类型是operator, 表示需要这个操作数下一个操作的的运算符(operator),也就是说这个操作数(operand)作为Customer的输入存在.

Name: 类型是std::string, 表示这个操作数的名称.Values
Shape: 类型是std::vector , 用来表示操作数的大小,

this:指针,指向当前对象的地址。在类的成员函数中,this关键字指向当前对象。

->:成员访问运算符,用来访问类的成员变量或成员函数。

在 C++11 中,使用 new 创建动态分配的对象并不安全,因为需要手动管理资源的释放,容易出现内存泄漏或者忘记释放资源导致的内存泄漏。为了更加安全和方便地管理动态分配的对象,C++11 引入了智能指针,其中 std::unique_ptr 是一种独占所有权的智能指针,它负责在对象不再需要时释放所占用的内存。

图(graph) 节点(vertex) 边(edge)