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)