一种ONNX神经网络面向后端部署转换方法与装置与流程
未命名
07-13
阅读:78
评论:0
一种onnx神经网络面向后端部署转换方法与装置
技术领域
1.本发明涉及神经网络领域,特别是涉及一种onnx神经网络面向后端部署转换方法与装置。
背景技术:
2.onnx(open neural network exchange,开放式神经网络交换)神经网络在面向后端部署时,由于后端硬件特性和相应的硬件软件包支持程度有限,onnx神经网络中往往存在后端不支持的算子,导致推理运算无法正常运行;而这些不支持的算子中matmul算子和upsample算子为近段时间来新流行的onnx神经网络中的算子,并且使用频率逐渐上升。而matmul算子和upsample算子相对于后端的不支持,导致onnx神经网络难以向后端进行快速部署。
3.鉴于此,克服该现有技术所存在的缺陷是本技术领域亟待解决的问题。
技术实现要素:
4.本发明要解决的技术问题是如何将onnx模型中的matmul算子和upsample算子转换为后端所支持的算子。
5.本发明实施例采用如下技术方案:
6.第一方面,提供一种onnx神经网络面向后端部署转换方法,包括:
7.遍历onnx模型中的所有算子,所述算子包括:matmul算子、upsample算子和常规算子;
8.当算子为所述matmul算子时,将该算子由matmul算子转换为relayir模型中所对应的dense算子、第一组合算子或第二组合算子,其中,所述第一组合算子为dense和reshape组合算子,所述第二组合算子为reshape和batch_matmul组合算子;
9.当算子为所述upsample算子时,将该算子由upsample算子转换为relayir模型中所对应的resize算子;
10.当算子为所述常规算子时,将该算子转换成relayir模型中所对应的relayir算子;
11.在所述onnx模型中的所有算子均转换为relayir模型中所对应的算子后,将所述onnx模型转换为relayir模型。
12.优选的,所述当算子为所述matmul算子时,将该算子由matmul算子转换为relayir模型中所对应的dense算子、第一组合算子或第二组合算子,具体包括:
13.获取所述matmul算子的第一输入张量和第二输入张量,并获取所述第一输入张量的矩阵维度和所述第二输入张量的矩阵维度;
14.根据所述第一输入张量的矩阵维度和所述第二输入张量的矩阵维度,对应向所述matmul算子添加dense算子、reshape算子和batch_matmul算子中的一个或者多个;
15.从dense算子、reshape算子和batch_matmul算子中选取的一个或者多个算子,进
行算子转换。
16.优选的,所述根据所述第一输入张量的矩阵维度和所述第二输入张量的矩阵维度,对应向所述matmul算子添加dense算子、reshape算子和batch_matmul算子中的一个或者多个,具体包括:
17.当所述第一输入张量和第二输入张量均为二维矩阵时,将所述第二输入张量进行转置;添加所述dense算子,将第一输入张量和转置后的第二输入张量输入至dense算子得到第二输出张量;
18.将所述第二输出张量同所述matmul算子的第一输出张量相对比,当所述第二输出张量同所述第一输出张量一致时,代表所述matmul算子转换为dense算子,当第二输出张量同所述第一输出张量不一致时,则中断进程。
19.优选的,所述根据所述第一输入张量的矩阵维度和所述第二输入张量的矩阵维度,对应向所述matmul算子添加dense算子、reshape算子和batch_matmul算子中的一个或者多个,还包括:
20.当所述第一输入张量为高维矩阵并且所述第二输入张量为二维矩阵时,于所述第一输入张量后添加所述reshape算子,改变所述第一输入张量的形状;
21.将所述第二输入张量进行转置;添加所述dense算子,将改变形状后的第一输入张量以及转置后的第二输入张量输入至所述dense算子得到第三输出张量;
22.改变所述第三输出张量的形状,并同所述matmul算子的第一输出张量的形状相对比,当第三输出张量改变后的形状同所述第一输出张量的形状一致时,代表所述matmul算子转换为第一组合算子,当第三输出张量改变后的形状同所述第一输出张量的形状不一致时,则中断进程。
23.优选的,所述根据所述第一输入张量的矩阵维度和所述第二输入张量的矩阵维度,对应向所述matmul算子添加dense算子、reshape算子和batch_matmul算子中的一个或者多个,还包括:
24.当所述第一输入张量和第二输入张量均为高维矩阵时,于所述第一输入张量后和所述第二输入张量后均添加所述reshape算子,将所述第一输入张量和所述第二输入张量均进行形状改变;添加所述batch_matmul算子,将改变形状后的第一输入张量和改变形状后的第二输入张量输入至所述batch_matmul算子得到第四输出张量;
25.改变所述第四输出张量的形状,并同所述matmul算子的第一输出张量形状相对比,当第四输出张量改变后的形状同所述第一输出张量形状一致时,代表所述matmul算子转换为第二组合算子,当第四输出张量改变后的形状同所述第一输出张量形状不一致时,则中断进程。
26.优选的,所述当算子为所述upsample算子时,将该算子由upsample算子转换为relayir模型中所对应的resize算子,具体包括:
27.获取所述upsample算子的第三输入张量和第四输入张量,并获取所述第三输入张量的矩阵维度和第四输入张量的缩放因子;
28.根据所述第三输入张量的矩阵维度进行中断或者向所述upsample算子添加resize算子。
29.优选的,所述根据所述第三输入张量的矩阵维度进行中断或者向所述upsample算
子添加resize算子,具体包括:
30.当所述第三输入张量为五维矩阵时,则中断执行;
31.当所述第三输入张量不为五维矩阵时,添加所述resize算子,将第三输入张量和第四输入张量的缩放因子输入至所述resize算子得到第六输出张量;
32.当所述第六输出张量同所述upsample算子的第五输出张量一致时,代表所述upsample算子转换为resize算子,当所述第六输出张量同所述第一输出张量不一致时,则中断进程。
33.优选的,所述当算子为所述常规算子时,将该算子转换成对应的relayir算子,具体包括:
34.获取所述常规算子的输入张量的矩阵维度、输入张量形状和参数信息,通过所述输入张量的矩阵维度、输入张量形状和参数信息将常规算子同relayir中的算子相对应,并将常规算子转换为对应的relayir算子。
35.优选的,通过gpu编译器或apu编译器对得到的relayir模型的算子逐层进行编译,转换成可执行的二进制语言。
36.第二方面,提供一种onnx神经网络面向后端部署转换装置,包括至少一个处理器,以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,用于执行第一方面所述的onnx神经网络面向后端部署转换方法。
37.本发明实施例提供一种onnx神经网络面向后端部署转换方法与装置,通过遍历onnx模型中的所有算子,找到其中的matmul算子和upsample算子,将matmul算子转化为relayir模型中所对应的dense算子或第一组合算子或第二组合算子,将upsample算子转换为relayir模型中所对应的resize算子,将其余的算子全部直接转换为relayir算子,从而让onnx模型转换为relayir模型,保证所有算子能被后端支持,避免运算无法正常运行的情况,达到快速部署的目的。
附图说明
38.为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
39.图1是本发明实施例提供的一种onnx神经网络面向后端部署转换方法的方法流程图;
40.图2是本发明实施例提供的一种onnx神经网络面向后端部署转换方法中当算子为matmul算子时的转换流程图;
41.图3是本发明实施例提供的一种onnx神经网络面向后端部署转换方法中添加dense算子时的转换流程图;
42.图4是本发明实施例提供的一种onnx神经网络面向后端部署转换方法中添加reshape算子和dense算子时的转换流程图;
43.图5是本发明实施例提供的一种onnx神经网络面向后端部署转换方法中添加
reshape算子和batch_matmul算子时的转换流程图;
44.图6是本发明实施例提供的一种onnx神经网络面向后端部署转换方法中upsample算子的转换流程图;
45.图7是本发明实施例提供的一种onnx神经网络面向后端部署转换方法的方法流程图;
46.图8是本发明实施例提供的一种onnx神经网络面向后端部署转换装置的结构示意图。
具体实施方式
47.为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
48.在本发明的描述中,术语“内”、“外”、“纵向”、“横向”、“上”、“下”、“顶”、“底”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明而不是要求本发明必须以特定的方位构造和操作,因此不应当理解为对本发明的限制。
49.此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
50.本发明实施例提供了一种onnx神经网络面向后端部署转换方法,如图1所示,方法流程为:
51.步骤101中,遍历onnx模型中的所有算子,所述算子包括:matmul算子、upsample算子和常规算子。
52.其中,所述常规算子即为onnx模型中除开matmul算子和upsample算子以外的所有算子。
53.在可选的实施例中,在遍历onnx模型中的所有算子以前,需要先获取onnx模型的各操作层的参数信息和前向传播信息,并通过参数信息和前向传播信息将onnx模型的各个算子同需要转化的relayir算子相对应,从而明确不同的算子的转换对象。
54.步骤102中,当算子为所述matmul算子时,将该算子由matmul算子转换为relayir模型中所对应的dense算子、第一组合算子或第二组合算子。
55.其中,所述第一组合算子为dense和reshape组合算子,所述第二组合算子为reshape和batch_matmul组合算子;其中,dense算子为全连接运算算子,reshape算子为形变算子,batch_matmul为分批矩阵乘法算子算子。
56.步骤103中,当算子为所述upsample算子时,将该算子由upsample算子转换为relayir模型中所对应的resize算子。
57.步骤104中,当算子为所述常规算子时,将该算子转换成relayir模型中所对应的relayir算子。
58.其中,所述dense算子、第一组合算子、第二组合算子、resize算子和relayir算子均为relayir模型中的算子,relayir模型中的算子均可被后端所支持。
59.本实施例中,所述后端指代各类ai芯片,所述后端部署即为将对象部署至各类ai芯片运算并且面向底层芯片侧的过程。
60.步骤105中,在所述onnx模型中的所有算子均转换为relayir模型中所对应的算子后,将所述onnx模型转换为relayir模型。
61.现有的onnx神经网络在面向后端部署时,由于后端硬件特性和相应的硬件软件包支持程度有限,onnx神经网络中往往存在后端不支持的算子,导致推理运算无法正常运行,其中,onnx模型中的matmul算子和upsample算子即为后端不支持的算子。由于relayir模型中的算子能被后端支持,因此,将matmul算子和upsample算子转换为relayir模型中的算子,并将onnx模型转换为relayir模型,即可保证所有算子能被后端支持。
62.本实施例通过遍历onnx模型中的所有算子,找到其中的matmul算子和upsample算子,其中,在以往神经网络面向后端部署的时候主要涉及到传统的卷积(conv)、全连接(dense)、resize等运算算子的运算和加速,在遇到matmul和upsampling等算子时,会出现无法部署到芯片运算的情况,但是本质上matmul运算过程是重复先进行乘法运算再进行加法运算,其运算过程和dense算子运算具有相似性,所以在一定条件下能够将matmul算子转换成dense算子,但是matmul算子又存在多种情况,即不同的输入维度问题,和原始的dense算子在形式上还是存在某些差异。因此将matmul算子转化为relayir模型中所对应的dense算子或第一组合算子或第二组合算子,将upsample算子转换为relayir模型中所对应的resize算子,将其余的算子全部直接转换为relayir算子,从而让onnx模型转换为relayir模型,保证所有算子能被后端支持,避免运算无法正常运行的情况,达到快速部署的目的。
63.由于matmul算子中的两个输入张量的矩阵维度可能不同,因此matmul算子在进行转换时,应转换为不同的relayir模型中的操作算子,故在可选的实施例中还涉及以下设计:
64.如图2所示,为当算子为matmul算子时的转换流程图,流程如下:
65.步骤201中,当算子为所述matmul算子时,获取所述matmul算子的第一输入张量、第二输入张量和第一输出张量,并获取所述第一输入张量的矩阵维度和第二输入张量的矩阵维度。
66.根据所述第一输入张量的矩阵维度和第二输入张量的矩阵维度,对应向所述matmul算子添加dense算子、reshape算子和batch_matmul算子中的一个或者多个。
67.步骤202中,当第一输入张量和第二输入张量均为二维矩阵时,向所述matmul算子添加dense算子,将matmul算子转换为dense算子。
68.步骤203中,当第一输入张量为高维矩阵并且所述第二输入张量为二维矩阵时,向所述matmul算子添加reshape算子和dense算子,将matmul算子转换为第一组合算子。
69.步骤204中,当第一输入张量和第二输入张量均为高维矩阵时,向所述matmul算子添加reshape算子和batch_matmul算子,将matmul算子转换为第二组合算子。
70.由于当matmul算子的输出张量不同时,其运算方式也存在一定差异,因此输出的形状也不同,故需要选择对应的算子进行转换。
71.其中,当所述matmul算子的输入张量数量不为2时,代表onnx模型存在问题,此时需要中断流程,对onnx模型进行检查。
72.需要注意的是,所述matmul算子的第一输入张量、第二输入张量和第一输出张量为:原本onnx模型中matmul算子的输入张量和输出张量,在本实施例的转换流程开始前所述第一输入张量、第二输入张量和第一输出张量就已经确定。
73.在获取matmul算子的第一输入张量和第二输入张量的同时,还会获取第一输入张量和第二输入张量各自对应的形状,本实施例中第一输入张量设定为input_a,第二输入张量设定为input_b,第一输入张量的形状设定为a_shape,第二输入张量的形状设定为b_shape,第一输入张量的矩阵维度设定为a_rank,第二输入张量的矩阵维度设定为b_rank,便于后续带入运算。
74.当所述第一输入张量和第二输入张量均为二维矩阵时(即a_rank=2且b_rank=2),如图3所示,流程如下:
75.步骤301中,将所述第二输入张量进行转置。
76.在可选实施例中,将所述第二输入张量进行转置即为:对input_b的第0维和第1维进行转置得到转置后的第二输入张量input_b_transpose。
77.步骤302中,添加所述dense算子,将第一输入张量和转置后的第二输入张量输入至dense算子得到第二输出张量。
78.将第一输入张量input_a和转置后的第二输入张量input_b_transpose输入至所述dense算子得到第二输出张量。
79.步骤303中,判断所述第二输出张量同所述第一输出张量(即matmul算子原本的输出张量)是否一致,当所述第二输出张量同所述第一输出张量一致时,跳转至步骤304,当第二输出张量同所述第一输出张量不一致时,跳转至步骤305。
80.步骤304中,当所述第二输出张量同所述第一输出张量一致时,代表所述matmul算子转换为dense算子。
81.步骤305中,当第二输出张量同所述第一输出张量不一致时,则中断进程。
82.当第二输出张量同所述第一输出张量一致时,代表matmul算子转换为dense算子,当第二输出张量同所述第一输出张量不一致时,代表onnx模型存在问题,需要中断进程进行检查。
83.当所述第一输入张量为高维矩阵并且所述第二输入张量为二维矩阵时(即a_rank>2且b_rank=2),如图4所示,流程如下:
84.步骤401中,于所述第一输入张量后添加所述reshape算子,改变所述第一输入张量形状,将所述第二输入张量进行转置。
85.由于第一输入张量为高维矩阵,并且dense算子对输入形状有一定要求,与原本的matmul算子不同,因此在进行算子转换时需要将高维矩阵的形状进行对应改变。
86.在可选实施例中,所述于所述第一输入张量后添加所述reshape算子,改变所述第一输入张量形状即为:
87.先计算第一输入张量input_a的新形状:
88.new_shape_a=[-1]+a_shape[a_rank
–
1:a_rank]。
[0089]
在input_a后添加reshape算子,按照所述新形状new_shape_a进行形状改变,输出得到input_a_reshape(改变形状后的第一输入张量)。
[0090]
在可选实施例中,将所述第二输入张量input_b的两个维度调换,进行转置得到input_b_transpose。
[0091]
步骤402中,添加所述dense算子,将改变形状后的第一输入张量以及转置后的第二输入张量输入至所述dense算子得到第三输出张量。
[0092]
将改变形状后的第一输入张量input_a_reshape和转置后的第二输入张量input_b_transpose输入至所述dense算子得到第三输出张量。
[0093]
步骤403中,改变所述第三输出张量形状。
[0094]
改变所述第三输出张量形状方法为:
[0095]
首先通过输入至dense算子的两个输入量input_a_reshape和input_b_transpose的形状计算得到第三输出张量的形状,如下:
[0096]
a_reshape=a_shape;
[0097]
out_batch_a=a_shape[0,a_rank-2],out_batch_b=b_shape[0,b_rank-2];
[0098]
由于a_rank》b_rank,因此out_batch=out_batch_a。
[0099]
计算得到第三输出张量的形状final_shape,final_shape=out_batch+a_shape[a_rank
–
2,a_rank-1]+b_shape[b_rank
–
1,b_rank]。
[0100]
在所述final_shape后添加reshape算子,从而改变第三输出张量形状并与第一输出张量(即matmul算子原本的输出张量)的形状一致。
[0101]
步骤404中,判断所述第三输出张量改变形状后同所述第一输出张量(即matmul算子原本的输出张量)形状是否一致,若一致,跳转至步骤405,若不一致跳转至步骤406。
[0102]
步骤405中,当第三输出张量改变后的形状同所述第一输出张量形状一致时,代表所述matmul算子转换为第一组合算子。
[0103]
步骤406中,当第三输出张量改变后的形状同所述第一输出张量形状不一致时,代表onnx模型存在问题,则中断进程。
[0104]
当所述第一输入张量和第二输入张量均为高维矩阵时(即a_rank>2且b_rank>2),如图5所示,流程如下:
[0105]
步骤501中,于所述第一输入张量后和所述第二输入张量后均添加所述reshape算子,将所述第一输入张量和所述第二输入张量均进行形状改变。
[0106]
在可选实施例中,所述于所述第一输入张量后和所述第二输入张量后均添加所述reshape算子,将所述第一输入张量和所述第二输入张量均进行形状改变即为:
[0107]
先计算第一输入张量input_a和第二输入张量input_b的新形状:
[0108]
new_shape_a=[-1]+a_shape[a_rank-2,a_rank];
[0109]
new_shape_b=[-1]+b_shape[b_rank
–
2,b_rank];
[0110]
在input_a后添加reshape算子,按照所述新形状new_shape_a进行形状改变,输出得到input_a_reshape。
[0111]
在input_b后添加reshape算子,按照所述新形状new_shape_b进行形状改变,输出得到input_b_reshape。
[0112]
步骤502中,添加所述batch_matmul算子,将改变形状后的第一输入张量和改变形状后的第二输入张量输入至所述batch_matmul算子得到第四输出张量。
[0113]
将改变形状后的第一输入张量input_a_reshape和改变形状后的第二输入张量input_b_reshape输入至所述batch_matmul算子得到第四输出张量。
[0114]
步骤503中,将所述第四输出张量改变形状。
[0115]
改变所述第四输出张量形状方法为:
[0116]
首先通过输入至batch_matmul算子的两个输入量input_a_reshape和input_b_
reshape的形状计算得到第四输出张量的形状,如下:
[0117]
a_reshape=a_shape;
[0118]
b_reshape=b_shape;
[0119]
out_batch_a=a_shape[0,a_rank-2],out_batch_b=b_shape[0,b_rank-2];
[0120]
a_rank=b_rank,则遍历out_batch_a及out_batch_b中的元素,out_batch中的第i个元素out_batch[i]取out_batch_a[i]和out_batch_b[i]中较大值。
[0121]
计算得到第四输出张量的形状final_shape,final_shape=out_batch+a_shape[a_rank
–
2,a_rank-1]+b_shape[b_rank
–
1,b_rank]。
[0122]
在所述final_shape后添加reshape算子,从而将第四输出张量改变形状并与第一输出张量的形状一致。
[0123]
步骤504中,判断改变形状后的第四输出张量同所述第一输出张量(即matmul算子原本的输出张量)形状是否一致,若一致,跳转至步骤505,若不一致,跳转至步骤506。
[0124]
步骤505中,当第四输出张量改变后的形状同所述第一输出张量形状一致时,代表所述matmul算子转换为第二组合算子。
[0125]
步骤506中,当第四输出张量改变后的形状同所述第一输出张量形状不一致时,代表onnx模型存在问题,则中断进程。
[0126]
本实施例中,当算子为所述upsample算子时,将该算子由upsample算子转换为relayir所对应的resize算子,如图6所示,流程如下:
[0127]
步骤601中,获取所述upsample算子的第三输入张量、第四输入张量和第五输出张量,并获取所述第三输入张量的矩阵维度和第四输入张量的缩放因子。
[0128]
根据所述第三输入张量的矩阵维度进行中断或者向所述upsample算子添加resize算子。
[0129]
本实施例中,所述第三输入张量设定为input_1,第三输入张量的形状设定为input_1_shape,第三输入张量的矩阵维度设定为1_rank,所述第四输入张量设定为input_2。
[0130]
步骤602中,根据所述第三输入张量的矩阵维度1_rank,判断第三输入张量是否为五维矩阵,若是,跳转至步骤603,若不在跳转至步骤604。
[0131]
步骤603中,当所述第三输入张量为五维矩阵时,则代表onnx模型存在问题,此时需要中断流程,对onnx模型进行检查。
[0132]
步骤604中,当所述第三输入张量不为五维矩阵时,添加所述resize算子,将第三输入张量和第四输入张量的缩放因子输入至所述resize算子得到第六输出张量。
[0133]
需要注意的是,所述第三输入张量和第四输入张量的缩放因子输入至所述resize算子即为:第三输入张量根据第四输入张量的缩放因子进行缩放。
[0134]
其中,第四输入张量的缩放因子通过解析第四输入张量input_2得到,其中缩放因子为:scale_h=input_2[2],scale_w=input_2[3],scale_h为四维数据h(高)的缩放因子,scale_w为四位数据w(宽)的缩放因子。
[0135]
添加所述resize算子,将所述第三输入张量input_1和第四输入张量的缩放因子scale_w和scale_h输入至resize算子,从而将第三输入张量按照第四输入张量的缩放因子进行缩放,其中layout(数据布局)为nchw,method属性为根据所述unsample算子的运算模
式mode而定,如果mode为“nearest”,则对应于relayir的resize运算方法method为“nearest_neighbor”;如果mode为“linear”,则对应于relayir的resize运算方法method为“bilinear”;align_corners设置为false;得到第六输出张量,其中所述第六输出张量即为缩放后的第三输入张量,并将第六输出张量同第五输出张量相比较。
[0136]
步骤605中,判断第六输出张量同所述第五输出张量是否一致,若一致,跳转至步骤606,若不一致,跳转至步骤607。
[0137]
步骤606中,当所述第六输出张量同所述第五输出张量一致时,代表所述upsample算子转换为resize算子。
[0138]
步骤607中,当所述第六输出张量同所述upsample算子的第五输出张量一致时,则中断进程。
[0139]
所述onnx模型除了matmul算子和upsample算子以外,其他的常规算子也需要转换为对应的relayir算子,因此本实施例还涉及以下设计:
[0140]
获取所述常规算子的输入张量的矩阵维度、输入张量形状和参数信息,通过所述输入张量的矩阵维度、输入张量形状和参数信息将常规算子同relayir中的算子相对应,并将常规算子转换为对应的relayir算子。
[0141]
由于在遍历onnx模型中的所有算子以前,已将onnx模型中的算子同relayir模型的算子的对应转换关系确定,因此当获取到该常规算子的参数信息后,即可根据所述参数信息找到该常规算子需要转换的relayir模型的算子,由于所述常规算子本身被后端所支持,因此常规算子可以直接转换为relayir模型的算子。
[0142]
待onnx模型完全转换为relayir模型后,通过gpu编译器或者apu编译器对得到的relayir模型的算子逐层进行编译,转换成可执行的二进制语言,即可被后端支持,即可达到onnx神经网络向后端快速部署的目的。
[0143]
结合图如图7,本实施例提供了一种onnx神经网络面向后端部署转换方法的流程,具体为:
[0144]
1、定义onnx模型不同操作算子的relayir所对应的操作算子。
[0145]
2、onnx模型转换成relayir,具体转换步骤如下:
[0146]
@1、获取onnx神经网络模型的各操作层的参数信息和前向传播信息。
[0147]
@2、遍历onnx神经网络模型中的所有节点(nodes),逐一转换:
[0148]
@a、判断该算子是否是为matmul算子,如果为matmul算子,则执行步骤@b,如果不是matmul算子则执行@j。
[0149]
@b、获取matmul算子的输入张量,判断输入的张量数量是否为2,如果不等于则中断;如果等于2,设该matmul算子的两个输入张量分别为input_a和input_b,执行步骤@c。
[0150]
@c、分别获取input_a和input_b的形状a_shape和b_shape,以及input_a和input_b的维度数量a_rank、b_rank。
[0151]
@d、判断两个输入张量的矩阵维度是否均为二维矩阵,如果是则执行步骤@d1,如果不是,则执行步骤@e:
[0152]
@d1、对input_b的第0维和1维进行transpose(转置)得到input_b_transpose。
[0153]
@d2、添加dense算子,其中dense算子的两个输入分别为input_a和input_b_transpose,并输出output,将output同原本matmul算子的输出张量对比,一致则代表
matmul算子转换为了dense算子,并返回至步骤@2,不一致则中断进程。
[0154]
@e、判断两个输入张量的矩阵维度是否其中一个为高维矩阵,另一个为二维矩阵,如果是则执行步骤@e1,如果不是,则执行@f:
[0155]
@e1、计算input_a的新形状new_shape=[-1]+a_shape[a_rank
–
1:a_rank],在input_a之后添加reshape算子,将input_a的reshape成形状为new_shape,设该算子的输出为input_a_reshape。
[0156]
@e2、对input_b进行transpose(转置),将input_b的两个维度调换,得到input_b_transpose。
[0157]
@e3、添加dense(全连接运算算子)算子,其中dense算子的输入为input_a_reshape和input_b_transpose,输入为output,执行步骤@g。
[0158]
@f、两个输入张量均为高维矩阵,转换步骤如下:
[0159]
@f1、计算input_a的新形状为new_shape_a=[-1]+a_shape[a_rank-2,a_rank];计算input_b的新形状为new_shape_b=[-1]+b_shape[b_rank
–
2,b_rank]。
[0160]
@f2、在input_a后添加reshape(形变算子)算子,将input_a转换成new_shape_a的input_a_reshape;在input_b后添加reshape算子,将input_b转换成new_shape_b的input_b_reshape。
[0161]
@f3、添batch_matmul(分批矩阵乘法算子)算子,其中batch_matmul算子的输入分别为input_a_reshape和input_b_reshape,输出为output;执行步骤@g。
[0162]
@g、计算out_batch_a=a_shape[0,a_rank-2],out_batch_b=b_shape[0,b_rank-2]。
[0163]
@g1、如果a_rank》b_rank,则out_batch=out_batch_a。
[0164]
@g2、如果a_rank《b_rank,则out_batch=out_batch_b。
[0165]
@g3、如果a_rank=b_rank,则遍历out_batch_a及out_batch_b中的元素,out_batch中的第i个元素out_batch[i]取out_batch_a[i]和out_batch_b[i]中较大值。
[0166]
@h、计算添加的组合算子的最终输出final_shape,final_shape=out_batch+a_shape[a_rank
–
2,a_rank-1]+b_shape[b_rank
–
1,b_rank]。
[0167]
@i、添加reshape算子,将final_shape的形状改变为同matmul算子输出张量的形状一直,代表matmul算子转换成了对应的relayir算子,返回步骤@2。
[0168]
@j、判断该算子是否属于upsample(上采样)算子,如果是,则按照如下执行,将upsample转换为relayir对应的resize算子,如果不是upsample算子,则执行步骤@k。
[0169]
@j1、判断upsample算子的输入是否有两个,如果是,则执行步骤@j2;如果否,则执行中断;其中input_1为其中一个输入张量,input_2为另一个输入张量的缩放因子。
[0170]
@j2、解析unsample算子的运算模式mode,如果mode为“nearest”,则对应于relayir的resize运算方法method为“nearest_neighbor”,如果mode为“linear”,则对应于relayir的resize运算方法method为”bilinear“。
[0171]
@j3、获取张量input_1的shape,即input_1_shape,基于input_1_shape,判断input_1是否是5维张量,如果是,则执行步骤@j4,如果不是,则执行步骤@j5及@j6。
[0172]
@j4、中断流程。
[0173]
@j6、解析input_2中的缩放值,其中scale_h=input_2[2],scale_w=input_2
[3],scale_h和scale_w分别对应于四维数据h(高)、w(宽)的缩放因子。
[0174]
@j7、添加relayir对应的resize算子,该算子的输入分别为input_1、scale_w和scale_h,layout(数据布局)为nchw,method属性为@j2中的method值,align_corners设置为false,返回步骤@2。
[0175]
@k、该节点为常规算子,获取该节点的输入张量形状、输出张量形状,及该节点所对应的参数信息。@l、基于步骤1、2中所定义的操作算子,将该节点转换成所对应的relayir算子。
[0176]
@4、基于relayir,用gpu编译器或者其他apu编译器逐层对relayir模型算子进行编译,转换成可执行的二进制语言。
[0177]
如图8所示,是本发明实施例的onnx神经网络面向后端部署转换装置示意图。本实施例的onnx神经网络面向后端部署转换装置包括一个或多个处理器81以及存储器82。其中,图8中以一个处理器81为例。
[0178]
处理器81和存储器82可以通过总线或者其他方式连接,图8中以通过总线连接为例。
[0179]
存储器82作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序和非易失性计算机可执行程序,如上述实施例中的onnx神经网络面向后端部署转换方法。处理器81通过运行存储在存储器82中的非易失性软件程序和指令,从而执行onnx神经网络面向后端部署转换同步方法。
[0180]
存储器82可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器82可选包括相对于处理器81远程设置的存储器,这些远程存储器可以通过网络连接至处理器81。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
[0181]
所述程序指令/模块存储在所述存储器82中,当被所述一个或者多个处理器81执行时,执行上述实施例中的onnx神经网络面向后端部署转换方法,例如,执行以上描述的图1至图7所示的各个步骤。
[0182]
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
技术特征:
1.一种onnx神经网络面向后端部署转换方法,其特征在于,包括:遍历onnx模型中的所有算子,所述算子包括:matmul算子、upsample算子和常规算子;当算子为所述matmul算子时,将该算子由matmul算子转换为relayir模型中所对应的dense算子、第一组合算子或第二组合算子,其中,所述第一组合算子为dense和reshape组合算子,所述第二组合算子为reshape和batch_matmul组合算子;当算子为所述upsample算子时,将该算子由upsample算子转换为relayir模型中所对应的resize算子;当算子为所述常规算子时,将该算子转换成relayir模型中所对应的relayir算子;在所述onnx模型中的所有算子均转换为relayir模型中所对应的算子后,将所述onnx模型转换为relayir模型。2.根据权利要求1所述的onnx神经网络面向后端部署转换方法,其特征在于,所述当算子为所述matmul算子时,将该算子由matmul算子转换为relayir模型中所对应的dense算子、第一组合算子或第二组合算子包括:获取所述matmul算子的第一输入张量和第二输入张量,并获取所述第一输入张量的矩阵维度和所述第二输入张量的矩阵维度;根据所述第一输入张量的矩阵维度和所述第二输入张量的矩阵维度,对应向所述matmul算子添加dense算子、reshape算子和batch_matmul算子中的一个或者多个;从dense算子、reshape算子和batch_matmul算子中选取的一个或者多个算子,进行算子转换。3.根据权利要求2所述的onnx神经网络面向后端部署转换方法,其特征在于,所述根据所述第一输入张量的矩阵维度和所述第二输入张量的矩阵维度,对应向所述matmul算子添加dense算子、reshape算子和batch_matmul算子中的一个或者多个包括:当所述第一输入张量和所述第二输入张量均为二维矩阵时,将所述第二输入张量进行转置;添加所述dense算子,将所述第一输入张量和转置后的第二输入张量输入至dense算子得到第二输出张量;将所述第二输出张量同所述matmul算子的第一输出张量相对比,当所述第二输出张量同所述第一输出张量一致时,代表所述matmul算子转换为dense算子,当第二输出张量同所述第一输出张量不一致时,则中断进程。4.根据权利要求2所述的onnx神经网络面向后端部署转换方法,其特征在于,所述根据所述第一输入张量的矩阵维度和所述第二输入张量的矩阵维度,对应向所述matmul算子添加dense算子、reshape算子和batch_matmul算子中的一个或者多个还包括:当所述第一输入张量为高维矩阵并且所述第二输入张量为二维矩阵时,于所述第一输入张量后添加所述reshape算子,改变所述第一输入张量的形状;将所述第二输入张量进行转置;添加所述dense算子,将改变形状后的第一输入张量以及转置后的第二输入张量输入至所述dense算子得到第三输出张量;改变所述第三输出张量的形状,并同所述matmul算子的第一输出张量的形状相对比,当所述第三输出张量改变后的形状同所述第一输出张量的形状一致时,代表所述matmul算子转换为第一组合算子,当所述第三输出张量改变后的形状同所述第一输出张量的形状不一致时,则中断进程。
5.根据权利要求2所述的onnx神经网络面向后端部署转换方法,其特征在于,所述根据所述第一输入张量的矩阵维度和所述第二输入张量的矩阵维度,对应向所述matmul算子添加dense算子、reshape算子和batch_matmul算子中的一个或者多个还包括:当所述第一输入张量和所述第二输入张量均为高维矩阵时,于所述第一输入张量后和所述第二输入张量后均添加所述reshape算子,将所述第一输入张量和所述第二输入张量均进行形状改变;添加所述batch_matmul算子,将改变形状后的第一输入张量和改变形状后的第二输入张量输入至所述batch_matmul算子得到第四输出张量;改变所述第四输出张量的形状,并同所述matmul算子的第一输出张量形状相对比,当所述第四输出张量改变后的形状同所述第一输出张量形状一致时,代表所述matmul算子转换为第二组合算子,当第四输出张量改变后的形状同所述第一输出张量形状不一致时,则中断进程。6.根据权利要求1所述的onnx神经网络面向后端部署转换方法,其特征在于,所述当算子为所述upsample算子时,将该算子由upsample算子转换为relayir模型中所对应的resize算子包括:获取所述upsample算子的第三输入张量和第四输入张量,并获取所述第三输入张量的矩阵维度和所述第四输入张量的缩放因子;根据所述第三输入张量的矩阵维度进行中断或者向所述upsample算子添加resize算子。7.根据权利要求6所述的onnx神经网络面向后端部署转换方法,其特征在于,所述根据所述第三输入张量的矩阵维度进行中断或者向所述upsample算子添加resize算子包括:当所述第三输入张量为五维矩阵时,则中断执行;当所述第三输入张量不为五维矩阵时,添加所述resize算子,将所述第三输入张量和所述第四输入张量的缩放因子输入至所述resize算子得到第六输出张量;当所述第六输出张量同所述upsample算子的第五输出张量一致时,代表所述upsample算子转换为resize算子,当所述第六输出张量同所述第一输出张量不一致时,则中断进程。8.根据权利要求1所述的onnx神经网络面向后端部署转换方法,其特征在于,所述当算子为所述常规算子时,将该算子转换成relayir模型中所对应的relayir算子包括:获取所述常规算子的输入张量的矩阵维度、输入张量形状和参数信息,通过所述输入张量的矩阵维度、输入张量形状和参数信息将常规算子同relayir中的算子相对应,并将常规算子转换为对应的relayir算子。9.根据权利要求1所述的onnx神经网络面向后端部署转换方法,其特征在于,通过gpu编译器或apu编译器对得到的relayir模型的算子逐层进行编译,转换成可执行的二进制语言。10.一种onnx神经网络面向后端部署转换装置,其特征在于,包括至少一个处理器,以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,用于执行权利要求1-9中任一项所述的onnx神经网络面向后端部署转换方法。
技术总结
本发明提供一种ONNX神经网络面向后端部署转换方法与装置,通过遍历ONNX模型中的所有算子,找到其中的Matmul算子和Upsample算子,将Matmul算子转化为relayir模型中所对应的dense算子或第一组合算子或第二组合算子,将Upsample算子转换为relayir模型中所对应的resize算子,将其余的算子全部直接转换为relayir算子,从而让ONNX模型转换为relayir模型,保证所有算子能被后端支持,避免运算无法正常运行的情况,达到快速部署的目的。达到快速部署的目的。达到快速部署的目的。
技术研发人员:谌竟成 冯雨 敖海
受保护的技术使用者:芯动微电子科技(武汉)有限公司
技术研发日:2023.03.31
技术公布日:2023/7/12
版权声明
本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
飞行汽车 https://www.autovtol.com/
上一篇:梯子用工具箱的制作方法 下一篇:18F防辐射灌装室的制作方法
