onnx opset13中的Loop算子该如何自定义实现?
【聚搜云】是上海聚搜信息技术有限公司旗下品牌,坐落于魔都上海,服务于全球、2019年成为阿里云代理商生态合作伙伴。与阿里云代理商、腾讯云、华为云、西部数码、美橙互联、AWS亚马逊云国际站渠道商、聚搜云,长期战略合作的计划!华为云国际站代理商专业的云服务商!
【本文由华为云渠道商[聚搜云] [ www.4526.cn]撰写。】
在深度学习领域的模型转换与优化过程中,ONNX已经被广泛应用,并且其已开放的opset13版本提供了一系列核心算子,可以实现大部分常见的深度学习运算。其中,基于循环的神经网络(recurrent neural network,RNN)是深度学习的重要分支之一。而在ONNX opset13中,即使已经支持基于循环神经网络的计算图生成,但是,若用户需要自行定制Loop算子时,如何实现呢?
首先,要了解Loop算子的具体作用和基本原理。Loop算子主要用于将循环网络中的RNN轮廓替换为在计算图中展开的静态流程。关于Loop算子,最终会将循环展开成独立的子图,并且通过“Scan”节点来执行每个循环体。在自定义Loop算子时,用户需要实现两个函数:scan_loop_state和loop_body。前者是根据循环的状态信息来计算所有元素的初始状态;后者则指定了单独的句柄函数,并且可以实现循环体内的操作。
然后,根据循环展开成独立子图的特性,自定义Loop算子也需要在展开的子图中设置对应的计算流程。可以参考ONNX opset13提供的Loop算子,在子图中通过“If”节点、广播广告机、Gather或者Scatter等节点进行流程控制和数据操作。
最后,需要注意的是,ONNX opset13 中提供的 Loop 算子仅支持常规 RNN 类型的循环网络,因此,在自定义 Loop 算子时存在多种情况下需要对原 Loop 算子进行扩展。同时,由于神经网络模型的复杂性,自定义 Loop 算子是一项高难度的工作,需要开发者有较为深厚的扫描抽象表达、高性能计算和实际应用场景等多方面知识技能。