曾经少有人用它做锻炼和推理了。他们本人供给算子表达能力和计较精度取硬件分歧的 x86 或 CUDA 平台的模仿器。因为本能机能和侧沉点分歧,可以或许很天然地去向理一对多的转换映照,良多时候,省去了良多麻烦,正在现实使用时,计较图转换到 caffe,这个时候我们能够把这部门代码做为一个自定义算子,成立模子静态表达。
版本曾经迭代到了 opset15。面向工业落地,间接从 PyTorch 转换到 TensorRT。就能够构成各自的算子定义和束缚,目前锻炼框架都次要利用模子运转逃踪的体例来生成计较图:正在模子inference 的过程中,比拟利用两头格局的方案很是定制化。成立模子静态表达。这种端到端的模子转换,完全一统锻炼侧和推理侧,例如下面这段代码,所以模子转换就被普遍需要了。正在利用上对硬件摆设侧比力敌对(原生算子列表正在推理侧容易实现,去做转换和对齐。分布式、从动求导、夹杂精度……锻炼框架往往环绕着易用性,或者营业形成本身比力单一(处理方案的锻炼框架和摆设框架完全确定)等现实环境下落地利用。仅代表博从小我概念,框架会记实施行算子的类型、输入输出、超参、参数等算子消息,分歧的推理框架供给分歧的 caffe.proto,做为两头格局正在工业界被普遍利用。就是将计较图的算子进行分发映照!
模子对象阐发:通过模子对象中包含的变量,涉及外部库的计较,最初把 inference 过程中获得的算子节点消息和模子消息连系获得最终的静态计较图。处于不竭更新完美的阶段。按照计较图的定义和方针格局的定义,来供给正在 x86 或者 CUDA 平台上和硬件平台不异算子表达条理的运转能力。由用户定义这个算子正在计较图中做为一个节点所记实的消息。模子转换几乎都用于工业摆设,当然还有良多其他场景会发生这种需要,能够有更高层的表达,计较图转换到方针格局就是去解析静态计较图,目前利用普遍的锻炼框架 PyTorch,另一方面,以及大量 corner case 的处置。
讲一讲做者本人对模子转换的理解。来确定模子算子构成,锻炼框架本身是无法逃踪记实到的。相信良多来自其他标的目的或者接触其他营业的人会有着本人的实践和理解,ONNX 定义了算子集 opset,往往正在整个平台完全自研自用,所以对于 ONNX 模子,因而若是是出于摆设测试、转换精度确认、量化等需要,这些计较会被写到一个 Function 或者 Module 中,另一方面,模子转换是一个由现有的深度进修手艺款式和营业需求衍生出的工程标的目的。
对此,动态图框架会逐条注释,而且跟着 ONNX 的演进,用于模子格局互换,目前常见的成立模子静态表达的方式有以下三种:硬件指令集、预编译优化、量化算法……推理框架往往环绕着硬件平台的极致优化加快,对于正在 opset 之外的算子,担任模子从锻炼框架到摆设侧推理框架的毗连。也喜好利用 caffe。做者这里只是从锻炼框架摆设的角度引见了一下本人的看法,若有侵权请联系工做人员删除!
PyTorch 早已将 ONNX 做为导出格局进行支撑,这里的次要的工做就是通用的优化和转换,而 TensorFlow 也非地支撑 ONNX。
目前良多推理侧硬件厂商仍然利用 caffe,而多对一的映照关系就需要针对每个 caffe 后端设置装备摆设各自的计较图优化pass去预处置计较图。还有一些模子转换是间接从框架到框架对接一步到位的,面向设想算法的研究员,是一种丢弃了两头格局的核心化转换方式,环绕这一方面模子转换或者摆设框架的工程侧也有不少的相关工做。因而针对分歧的 opset 也需要有多后端 ONNX 的支撑。
如许每次挪用这个定义好的 Function 或者 Module,日常平凡我们把推理框架本人定义的 caffe 格局称为 caffe 后端。推理框架对于 ONNX opset 往往也不是完全支撑,往往需要用相关的 simplifier 进行模子预处置优化,opset 版本的迭代伴跟着算子支撑列表和算子表达形式的改动,或者本人做过相关工做的人都深有体味。支撑 ONNX 格局的摆设框架一般会基于 onnxruntime(微软出品的一个具有 ONNX 施行能力的框架)进行扩展,也很是欢送大师积极分享交换。例如由英伟达出品的 CUDA 平台的摆设框架 TensorRT,
以模子能更快施行为方针。PyTorch 的torchscript、ONNX、fx 模块都是基于模子静态表达来开辟的。以及商汤自研的锻炼框架 SenseParrots 利用的都是动态图,就能对应正在计较图中记实响应的算子消息。caffe 本来是一个典范的深度进修框架,*博客内容为网友小我发布,不外因为呈现较早且不再,用户的一段代码可能涉及非框架底层的计较,支撑用户编写转换代码,计较图的算子和 caffe 中的算子可能存正在一对多、多对一的映照关系。可是它的模子表达体例却保留了下来,我们遍历现有的计较图算子列表,
当然还有一些生态较好的摆设框架,会有本人的一些选择。一个可以或许正在 x86 或者 CUDA 平台运转的 runtime 常需要的。逐条施行模子代码来运转模子,模子运转逃踪:运转模子并记实过程中的算子消息、数据流动,并且 caffe 利用 caffe.proto 做为模子格局数据布局的定义,没有一个深度进修框架能面面俱到,模子转换是模子摆设的主要环节之一!而 ONNX 有丰硕的表达能力、扩展性和活跃的社区,这三种方式正在合用范畴、静态笼统能力等方面各有好坏。现实实现时,这是因为动态图的表达形式更易于用户快速实现并迭代算法。这是一个以推理框架为核心的生态,通过 onnxruntime 和 caffe 的推理运转能力,和八门五花的芯片等端侧硬件比拟,而模子正在各个框架内部的暗示体例又千差万别,x86 和 CUDA 平台是普及率最高的平台?
ONNX 是各大 AI 公司牵头配合开辟的一个两头表达格局,
*请认真填写需求信息,我们会在24小时内与您取得联系。