当前位置: 首页 > 网络应用技术

ONNX浅分析:如何加速工程算法?

时间:2023-03-09 00:55:33 网络应用技术

  自从阿尔法戈(Alphago)击败GO世界冠军李·施西(Li Shishi)以来,对人工智能和深度学习的研究表现出井喷。

  各种新的算法和网络模型无止境,令人眼花azz乱。与之相关,深度学习的培训和推理框架一直在创新。更著名的是:Microsoft的CNTK,Google的Tensorflow,Facebook的Pytorch,Apple的Coreml,Intel的OpenVino,Nvida的Cudnn和Tensorrt,Tencent's Tnnn,Ncnn,Ali's Mnn等。

  这些框架有相似之处。它们的输入是一组或一组多维数据,数据在多层计算单元之后输出计算结果。培训框架支持培训方法,例如Backpropopogation,可以自动调整算法设计的模型参数。推理框架仅用于模型推理操作,并且不能针对算法部署调整模型本身。

  在这些框架中,Google的张力流的名称特别漂亮。二维数据是一个张量,并且多层计算单元中数据的计算和传输是流程。当您看到这个词时,您似乎会看到一个数据和计算图。工作效果很好。这些框架需要构造,并且这些运算符以一定顺序连接,可以称为网络模型。

  每个深度学习框架都有自己的独特格式来解释和存储网络模型,这些框架的重点是不同的。有些用于培训和学习,有些用于部署推理。在开发深度学习算法时,将在不同阶段选择不同的框架。因此,不同的模型描述格式将客观地在深度学习算法的开发和着陆中造成困难。

  作者以前已经开发了深层的神经网络算法。当时的培训框架是Caffe,需要部署到Linux,iOS,Android和其他平台。Linux选择Nvidia的Cudnn;iOS选择Coreml;Android选择NNAPI,CAFFE模型描述格式是caffemodel。

  它使用自定义Protobuf(github.com/bvlc/caffe/tree/master/src/src/cafffe/proto),但显而易见的是Definition(Apple.github.io/coremltools/mlmltools/mlmodel/index.html)推理引擎,要求用户组装此模型。

  对于Coreml,我们需要将caffemodel转换为CoremlModel格式。对于Cudnn和Nnapi,我们需要自己解析和组装完整的网络模型。这个过程很乏味,易于犯错。当时,有强烈的冲动。我希望定义统一的模型描述格式。通过这种格式描述了所有培训框架培训获得的网络模型。引擎支持对这种统一描述格式的分析,完成部署着陆并不漂亮。

  当然,此事并不容易。有必要定义统一的模型描述格式。它不仅需要对机器学习技术有深入的了解,而且还需要将其推广为事实上的行业标准。不像作者那样著名。这是开放的神经网络交换(ONNX)。

  用ONNX本身的话来说,ONNX是计算图的通用描述。它希望被设计为开放网络描述格式,降低开发人员在培训和推理框架之间切换的成本,并允许开发人员专注于算法和优化。。

  ONNX有两个类别:基本ONNX主要用于描述神经网络,ONNX-ML是基本ONNX的扩展,为除神经网络以外的其他机器学习算法增加了支持。这文章将不涉及ONNX-ML。下一个文本以简单的ONNX模型为示例,以介绍ONNX如何描述计算网络。该模型可以在ONNX的GitHub中下载。

  ONNX的模型描述了Google的协议缓冲语言。最外面的结构是ModelProto,ModelProto的定义如下:

  更重要的字段是:LR_Version:当前ONNX模型文件的版本。当前发布的最新版本是ir_version_2019_3_18 =6。在2019年发布。版本7仍在制定。OPSET_IMPORT:运算符以当前模型文件域名版本为主导。图:该模型执行的计算图,这是最重要的字段。

  GraphProto的定义如下:

  较重要的字段是:初始化器:模型每个网络层的参数,在模型训练完成后固定参数。模型的输入格式。输出:模型的输出格式,根据推理顺序行。

  Nodeproto的定义如下:

  更重要的字段是:输入:输入参数的名称。输出:输出参数的名称。需要注意的是,每个网络层之间的连接使用输入名称的名称。OP_TYPE:操作员的类型。属性:操作员的属性取决于操作员的类型。

  ONNX最复杂的部分是对各种操作员的描述。这也可以理解,神经网络的主体是这些操作员。属性是操作员的一组属性。在本文中,我们介绍了Mobilenetv22222-7。最常用的操作员:Conv。

  卷积神经网络在语音,图像,视频等方面取得了巨大成功。ONNX的卷积网络层的属性定义主要是:扩张:扩展卷积,默认为1,即普通卷积。

  普通的卷积扩展Conv Roup:数据包卷积,文献的定义14. Defyment 1,即没有群体。kernel_shape:定义卷积核的大小。垫子:定义填充,向下,左和右的像素。大步:定义卷积操作的步骤。

  每个家庭的培训和推理框架仍在发展。显然,ONX想要成为行业标准还为时过早,但是没有其他更好的通用模型描述格式。