一种面向微控制器的深度学习内存优化方法
未命名
08-03
阅读:94
评论:0
1.本发明属于深度学习技术领域,具体是涉及一种面向微控制器的深度学习内存优化方法。
背景技术:
2.深度学习模型为了达到更好的性能,参数量和计算量不断增加,对设备的存储和计算资源提出了更高的要求。出于数据隐私或者网络资源等原因,将微控制器设备上获取的数据传输到服务器进行推理存在困难,因此在微控制器上部署运行深度学习模型成为了一种新的发展趋势。
3.微控制器内存资源有限,通常从几kb到1mb不等,在微控制器上部署运行轻量级深度学习首先要面临内存资源有限的问题。目前面向微控制器的轻量级深度学习推理框架如tflm、tinyengine和nnom对深度学习推理过程中虽然也存在了内存优化的研究,但还是存在不足之处。
4.如专利申请cn115357381a公开了用于嵌入式设备深度学习推理的内存优化方法及系统,其采用监测是否为该激活值输入最后一个节点的方式,及时销毁激活值的策略对深度学习推理的内存使用进行优化,并将符合条件的量化节点输出激活值数据保存为int8数据类型;但该专利申请仅对深度学习推理中激活值使用的内存进行优化,未对深度学习推理中其它算子进行内存优化,内存优化效果有限;对激活值数据从int32类型量化为int8类型会造成精度损失,影响模型准确率。
5.专利申请cn112990421a公开了一种优化深度学习网络的运行过程的方法、装置及存储介质,其通过确定深度学习网络中包括的多个计算层对应的多种运行顺序,然后确定每种运行顺序所需的内存开销,进而根据每种运行顺序所需的内存开销,确定多个计算层的最优运行顺序;该专利申请通过优化多个层的计算顺序减少深度学习的内存开销,但未对多个层之间的计算方式进行优化,内存优化不够彻底;在内存优化时未考虑到多段内存的情况,不能有效利用微控制器等嵌入式设备的多段内存。
6.专利申请cn114742211a公开了一种面向微控制器的卷积神经网络部署和优化方法,主要针对深度学习中单个卷积算子计算进行内存优化,其仅对深度学习层内优化,未对多个算子在内存中的布局进行优化,也未对微控制器多段内存的特性进行优化,不能有效利用微控制器等嵌入式设备的多段内存。
7.综上所述,现有技术中的面向微控制器的轻量级深度学习推理框架,缺乏对算子计算进行更为有效的内存优化,无法同时使用微控制器上的多段内存,造成内存利用率低,对部署在微控制器上的深度学习模型限制较多。
技术实现要素:
8.为解决上述技术问题,本发明提供了一种面向微控制器的深度学习内存优化方法,针对深度学习模型中特定结构提出多算子融合计算优化方法;针对微控制器多段内存
特性,提出微控制器内存布局优化方法,解决深度学习推理过程中内存使用量大的问题,满足在微控制器上部署深度学习模型的内存约束。
9.本发明所述的一种面向微控制器的深度学习内存优化方法,包括以下步骤:步骤1、在微控制器上,采用多算子融合优化方法,对深度学习模型的多个算子融合,优化其使用内存;步骤2、采用面向多段内存的深度学习算子内存布局优化方法,确定深度学习模型中多个算子在微控制器多段内存中的最优布局,对多个算子存入内存的位置进行优化。
10.进一步的,对深度学习模型的多个算子计算进行优化的具体步骤为:步骤1-1、采用残差结构融合计算优化方法,将残差结构中conv、logistic、mul算子的计算融合在一起,并将最终残差结构对应元素结构写入内存;步骤1-2、采用激活函数融合计算优化方法,将当前算子的计算与激活函数的计算融合,并将融合计算后的结果写入当前算子的输出内存中;步骤1-3、提前分配连接算子所需内存空间,采用连接算子融合计算方法,将两个输入算子计算后的特征图存放在连接算子输出对应的内存地址。
11.进一步的,对深度学习模型中残差结构进行融合计算优化,具体为:首先计算conv算子输出中的每个元素,每计算得到一个元素并不直接将该元素写入conv的输出内存中,而是对该元素进行logistic和mul计算,得到最终该残差结构对应元素的结果,再将其写入内存中,此时该内存中存放的就是残差结构的输出,但整个过程只使用一块内存,有效降低残差结构的内存使用。
12.进一步的,对深度学习模型中卷积-激活结构进行融合计算优化,具体为:当卷积算子后带有激活函数,将当前算子的计算和激活函数的计算融合起来,在当前算子每个输出元素计算结束后,先计算激活后的值,然后再将激活后的值写入当前算子的输出内存中,完成一次融合计算,从而使得激活函数不再需要单独的内存空间,降低内存使用。
13.进一步的,深度学习模型中连接结构进行融合计算优化,具体为:提前分配连接算子(concat)所需的内存空间,并将该内存空间分成两部分,分别作为concat两个输入算子的输出内存空间,因此这两个输入算子计算后的特征图直接存放在concat输出对应的内存地址,不需要再单独分配特征图的内存空间,从而减少内存使用。
14.进一步的,采用面向微控制器多段内存的深度学习算子内存进行布局优化,具体步骤为:步骤2-1、计算深度学习模型中各算子所需要内存的大小和其生命周期,内存大小根据算子输出的长、宽、高直接计算得到,而生命周期的计算则需要对模型中的算子进行遍历,找到该算子第一次计算的时间和最后一次被使用的时间;步骤2-2、按照内存使用大小对所有算子进行降序排序,内存使用大的将被放在前面,先计算在内存中的位置;内存使用小的被放在后面,后计算在内存中的位置;步骤2-3、计算排序后的算子在内存中的位置,首先需要维护n个链表,n为多段内存的数量,分别表示每段内存的使用情况;这些链表按照内存访存速度降序排列,即第一个链表代表访存速度最快的内存段,第n个链表代表访存速度最慢的内存段;接着对排序后的算子进行遍历,对每个算子依次在n个链表中查找合适位置,若当前链表内存空间无法满足算子的要求,则跳到下一个链表查找,若找到合适的位置则将该算子项插入链表对应位置。
15.本发明所述的有益效果为:本发明提出的多算子融合计算优化方法,对在微控制器上的深度学习模型中的残差结构、卷积-激活结构和连接结构分别进行优化,减少深度学习模型推理过程中的内存使用,使深度学习模型可以运行在内存更小的微控制器上;针对微控制器多段内存的特性提出一种面向多段内存的深度学习算子内存布局优化方法,根据深度学习模型有向无环图的性质确定各算子的计算顺序,优化算子内存布局,能够使深度学习算子使用多段内存进行推理,确定深度学习模型中多个算子在微控制器多段内存中的最优布局,解决现有技术只使用单段内存的缺点,有效提高内存使用效率。
附图说明
16.图1是残差结构示意图;图2是残差结构内存使用示意图;图3是残差结构融合前后内存流动示意图;图4是激活函数融合前后内存使用示意图;图5是激活函数融合前后内存流动示意图;图6是连接算子融合前后示意图;图7是连接算子融合前后内存使用示意图;图8是本发明所述方法的流程图。
具体实施方式
17.为了使本发明的内容更容易被清楚地理解,下面根据具体实施例并结合附图,对本发明作进一步详细的说明。
18.如图8所示,本发明所述的一种面向微控制器的深度学习内存优化方法,包括以下步骤:步骤1、在微控制器上,采用多算子融合优化方法,对深度学习模型的多个算子融合,优化其使用内存;步骤2、采用面向多段内存的深度学习算子内存布局优化方法,确定深度学习模型中多个算子在微控制器多段内存中的最优布局,对多个算子存入内存的位置进行优化。
19.对深度学习模型的多个算子计算进行优化的具体步骤为:步骤1-1、采用残差结构融合计算优化方法,将残差结构中conv、logistic、mul算子的计算融合在一起,并将最终残差结构对应元素结构写入内存;具体如下:图1为残差结构示意图,conv算子的输出经过logistic算子计算后得到,再通过mul算子和捷径连接使得与做hadamard乘积,即对应元素相乘,这样残差结构相当于,使得网络深度增加的同时,提高网络的准确率;残差结构中conv算子计算结果需要被logistic和mul算子所使用,因此conv内存的生命周期需要持续到mul算子计算后才结束,共持续三个单位时间。logistic内存的生命周期同样需要持续到mul算子计算后,持续两个单位时间。由于mul算子依赖于conv和logistic算子,同时logistic算子又依赖于conv算子,它们之间的内存在空间上不能重叠,因此该残差结构使用的内存情况如图2左侧所示;
本发明提出残差结构融合计算优化方法,将conv、logistic、mul算子的计算融合在一起。首先计算conv算子输出中的每个元素,每计算得到一个元素并不直接将该元素写入conv的输出内存中,而是对该元素进行logistic和mul计算,得到最终该残差结构对应元素的结果,再将其写入内存中,此时该内存中存放的就是残差结构的输出,但整个过程只使用一块内存,有效降低残差结构的内存使用。融合后的残差结构内存使用情况如图2右侧所示,内存使用量为原来的三分之一。
20.残差结构融合计算前后内存数据流动如图3所示,融合前每个算子在计算前都从内存中读取输入数据,数据从内存经过高速缓存被读取到cpu内部寄存器,算子计算结束后计算结果从cpu内部寄存器写到高速缓存再到内存中。融合后的残差结构每个元素依次经过各算子的计算,计算结果缓存在cpu内部寄存器,作为下一个算子计算的输入数据,直到计算完该残差结构的所有算子后,对应元素才被写入到内存中。
21.步骤1-2、采用激活函数融合计算优化方法,将当前算子的计算与激活函数的计算融合,并将融合计算后的结果写入当前算子的输出内存中;具体如下:激活函数计算每个元素通常只依赖于该元素的输入值,而对于其它相邻元素没有依赖关系。因此若当前算子后带有激活函数,可以将当前算子的计算和激活函数的计算融合起来,在当前算子每个输出元素计算结束后,先计算激活后的值,然后再将激活后的值写入当前算子的输出内存中,完成一次融合计算,从而使得激活函数不再需要单独的内存空间,降低内存使用,如图4所示;在图4中以conv算子和relu激活函数为例,左侧为未融合的卷积算子和激活函数计算过程中内存使用示意图,conv算子计算结果存放在conv内存空间中,激活函数计算结果存放在relu内存空间中,大小与conv相同,共计需要2倍conv内存空间;右侧为本发明提出的激活函数融合后的内存使用示意图,卷积算子在每个元素计算后先计算激活值,再写入内存空间conv_relu中,只需要一个conv大小的内存空间。
22.激活函数融合计算前后内存数据流动如图5所示,与残差结构融合类似,融合后的激活函数在conv算子每个元素计算后直接计算relu,计算结果最后写入内存中。
23.步骤1-3、提前分配连接算子所需内存空间,采用连接算子融合计算方法,将两个输入算子计算后的特征图存放在连接算子输出对应的内存地址;具体如下:图6的左侧为连接算子(concat)融合前的示意图,图6的右侧为连接算子(concat)融合的后示意图,从图6中可以看出,concat将conv_2和conv_3输出的特征图合并成一个特征图输出。连接算子融合前,先计算conv_1的输出特征图,然后conv_2和conv_3将conv_1的输出作为输入特征图依次计算conv_2和conv_3的输出特征图,最后concat再将conv_2和conv_3的特征图合并在一起。本发明提出连接算子融合计算方法,先前提前分配concat所需的内存空间,并将该内存空间分成两部分,分别作为conv_2和conv_3输出内存空间,因此conv_2和conv_3计算后的特征图直接存放在concat输出对应的内存地址,不需要再单独分配conv_2和conv_3特征图的内存空间,从而减少内存使用;图7的左侧为连接算子融合前的内存使用情况,图7的右侧为连接算子融合后的内存使用情况,可以看到连接算子融合前conv_2和conv_3分别需要分配一块内存空间存放各自输出特征图,而连接算子融合后conv_2和conv_3直接将输出特征图存放在concat输出内存空间的对应位置,有效降低融合算子的内存使用情况。
24.采用面向多段内存的深度学习算子内存布局优化方法对多个算子存入内存的位置进行优化的具体步骤为:步骤2-1、计算深度学习模型中各算子所需要内存的大小和其生命周期,内存大小可以根据算子输出的长、宽、高等参数直接计算得到,而生命周期的计算则需要对模型中的算子进行遍历,找到该算子第一次计算的时间和最后一次被使用的时间。
25.步骤2-2、按照内存使用大小对所有算子进行降序排序,内存使用大的将被放在前面,先计算在内存中的位置,而内存使用小的被放在后面,后计算在内存中的位置,这是因为先计算小块内存更容易造成内存碎片化,而先计算大块内存可以降低内存碎片,即便产生内存碎片,后计算的小块内存也更容易填充这些碎片,从而提高内存的使用效率。
26.步骤2-3、计算排序后的算子在内存中的位置,首先需要维护n个链表,n为多段内存的数量,分别表示每段内存的使用情况。这些链表按照内存访存速度降序排列,即第一个链表代表访存速度最快的内存段,第n个链表代表访存速度最慢的内存段;接着对排序后的算子进行遍历,对每个算子依次在n个链表中查找合适位置,若当前链表内存空间无法满足算子的要求,则跳到下一个链表查找,若找到合适的位置则将该算子项插入链表对应位置;该方法优先将算子放入访存速度快的内存段中,在提高内存使用效率的同时,加快该算子的计算速度。
27.通过以下实例对本发明所述方法进行说明:stm32h730vbt6微控制器包含两段内存,其中包括128kb的dtcm内存和436kb的sram内存,共计564kb。现有方法只使用单段内存如dtcm或sram,无法完全利用564kb大小的内存,造成内存利用率低。本发明提出多算子融合优化方法和面向多段内存的深度学习算子内存布局优化方法,在降低深度学习模型内存使用的同时,有效利用了微控制器多段内存的特性,提高内存利用率;步骤如下:1、使用tensorflow训练squeezenet深度学习模型,输入尺寸为128
×
128
×
3,采用adam作为优化器,学习率设置为0.00005,采用交叉熵损失函数和relu6激活函数;2、在stm32h730vbt6微控制器上使用多算子融合优化方法对卷积-激活结构和连接结构进行融合计算,减少squeezenet深度学习模型内存使用量;3、在stm32h730vbt6微控制器上使用面向多段内存的深度学习算子内存布局优化方法确定深度学习模型中多个算子在微控制器多段内存中的最优布局,对多个算子存入内存的位置进行优化;4、使用stm32h730vbt6微控制器采集ov7725摄像头图像数据,并对图像数据进行预处理,分辨率缩放到与训练数据集相同大小;然后进行模型推理计算,并对推理结果得到的输出进行后处理,得到最终预测结果。
28.表1
,表1为本发明与tflm(tensorflow lite micro)、x-cube-ai方案在微控制器上优化效果的对比测试,本发明首先使用多算子融合优化方法降低了深度学习模型内存使用总量,然后在使用面向多段内存的深度学习算子内存布局优化方法同时利用微控制器上dtcm和sram两段内存(由于dtcm内存速度较快,因此优先使用dtcm内存)。相较于对比方案,其内存使用总量虽然都小于stm32h730vbt6微控制器内存总量,但由于不支持多段内存布局,因此只能使用其中的一段内存,无法部署。本发明内存使用总量更小且支持多段内存布局,可以在微控制器上部署更多模型。
29.以上所述仅为本发明的优选方案,并非作为对本发明的进一步限定,凡是利用本发明说明书及附图内容所作的各种等效变化均在本发明的保护范围之内。
技术特征:
1.一种面向微控制器的深度学习内存优化方法,其特征在于,包括以下步骤:步骤1、在微控制器上,采用多算子融合优化方法,对深度学习模型的多个算子融合,优化其使用内存;步骤2、采用面向多段内存的深度学习算子内存布局优化方法,确定深度学习模型中多个算子在微控制器多段内存中的最优布局,对多个算子存入内存的位置进行优化。2.根据权利要求1所述的一种面向微控制器的深度学习内存优化方法,其特征在于,对深度学习模型的多个算子计算进行优化的具体步骤为:步骤1-1、采用残差结构融合计算优化方法,将残差结构中conv、logistic、mul算子的计算融合在一起,并将最终残差结构对应元素结构写入内存;步骤1-2、采用激活函数融合计算优化方法,将当前算子的计算与激活函数的计算融合,并将融合计算后的结果写入当前算子的输出内存中;步骤1-3、提前分配连接算子所需内存空间,采用连接算子融合计算方法,将两个输入算子计算后的特征图存放在连接算子输出对应的内存地址。3.根据权利要求2所述的一种面向微控制器的深度学习内存优化方法,其特征在于,对深度学习模型中残差结构进行融合计算优化,具体为:首先计算conv算子输出中的每个元素,对该元素进行logistic和mul计算,得到最终该残差结构对应元素的结果,再将其写入内存中,此时该内存中存放的为残差结构的输出。4.根据权利要求2所述的一种面向微控制器的深度学习内存优化方法,其特征在于,对深度学习模型中卷积-激活结构进行融合计算优化,具体为:当卷积算子后带有激活函数,将当前算子的计算和激活函数的计算融合起来;在当前算子每个输出元素计算结束后,先计算激活后的值,然后再将激活后的值写入当前算子的输出内存中,完成一次融合计算。5.根据权利要求2所述的一种面向微控制器的深度学习内存优化方法,其特征在于,深度学习模型中连接结构进行融合计算优化,具体为:提前分配连接算子concat所需的内存空间,并将该内存空间分成两部分,分别作为concat两个输入算子的输出内存空间,这两个输入算子计算后的特征图直接存放在concat输出对应的内存地址。6.根据权利要求1所述的一种面向微控制器的深度学习内存优化方法,其特征在于,采用面向多段内存的深度学习算子内存进行布局优化,具体步骤为:步骤2-1、计算深度学习模型中各算子所需要内存的大小和其生命周期,内存大小根据算子输出的长、宽、高直接计算得到,而生命周期的计算则需要对模型中的算子进行遍历,找到该算子第一次计算的时间和最后一次被使用的时间;步骤2-2、按照内存使用大小对所有算子进行降序排序,内存使用大的将被放在前面,先计算在内存中的位置;内存使用小的被放在后面,后计算在内存中的位置;步骤2-3、计算排序后的算子在内存中的位置,首先需要维护n个链表,n为多段内存的数量,分别表示每段内存的使用情况;这些链表按照内存访存速度降序排列,即第一个链表代表访存速度最快的内存段,第n个链表代表访存速度最慢的内存段;接着对排序后的算子进行遍历,对每个算子依次在n个链表中查找合适位置,若当前链表内存空间无法满足算子的要求,则跳到下一个链表查找,若找到合适的位置则将该算子项插入链表对应位置。
技术总结
本发明属于深度学习技术领域,公开了一种面向微控制器的深度学习内存优化方法,包括:提出一种多算子融合计算优化方法,对深度学习模型中常用到的残差结构、卷积-激活结构和连接结构分别进行优化,减少深度学习模型推理过程中的内存使用,使深度学习模型可以运行在内存更小的微控制器上;针对微控制器多段内存的特性提出一种面向多段内存的深度学习算子内存布局优化方法,能够使深度学习算子使用多段内存进行推理,解决现有技术只使用单段内存的缺点,有效提高内存使用效率。有效提高内存使用效率。有效提高内存使用效率。
技术研发人员:孙雁飞 王子牛 亓晋 董振江 孙莹 胡筱旋
受保护的技术使用者:南京邮电大学
技术研发日:2023.06.29
技术公布日:2023/8/1
版权声明
本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
飞行汽车 https://www.autovtol.com/
