神经网络算子优化之——算子融合

简介: 算子融合,作为神经网络性能优化的一个必要手段,其性能收益是很高的。

大家好啊,我是董董灿。

最近接了很多奇奇怪怪的神经网络需要实现和优化。里面有不少常见、好实现并且好优化的算子,如 element-wise 类的 add 算子、cast 算子等。一般遇到这类算子,我都是直接将他们从神经网络中忽略掉的。

因为它们属于维度无关的算子,不论你在内存上的摆布(layout)是 NHWC,还是 NCHW,还是其他奇奇怪怪的摆布。

又或者是将数据在单核运算,还是拆开放在多核上运算,都无所谓。只要对位相加得到正确结果就行了。

稍微难一点的算子比如 reduce_max、reduce_sum 类的算子,它们维度相关,尤其是在进行多核拆分时,需
要考虑拆的维度最好不要是 reduce 维度,因为一旦在核间拆了 reduce 维度,那么势必还要做核间的 reduce。

不过这类算子也不是很难,毕竟如果做多核运算,不拆 reduce 维度就好很多。

再稍微难一点的算子像是多维转置(transpose,也有叫 permute ) 算子,维度更加相关。如果做多核运算,一旦在核间拆到转置的那一维,就会出现核间的数据搬运操作。

除非你找个地方将数据暂存起来,或者直接放到DDR上。总之,多核的transpose比较难。

更难的,像是 scatter 类的算子,它需要根据其中一个 tensor(indice) 中的数据作为坐标索引来完成数据(data)的更新(update),多核拆分场景下需要确保更新的数据维度不要被拆散。

scatter类的算子难点在于,取 indice 中的坐标几乎无法向量化,只能标量的取用,然后向量化的完成数据更新。

这类算子,一直是性能优化的重灾区。

这次遇到的网络,很不幸,上面的几类算子都有。

算子融合分析

做AI推理优化的同学都知道,如果神经网络层与层之间的数据是放在外存(ddr)上的话,一个好处是可以连续访存。但同时带来一个坏处就是带宽可能会成为性能瓶颈。

毕竟ddr上的数据需要不断的与片上存储进行 IO 交换,带宽不够的话,很影响推理性能。

因此,大部分做AI推理加速的同学,都会考虑将层与层之间的数据放在离计算核心更近的位置,比如片内的SRAM上,前提是SRAM足够大,能放的下这些数据。

那么问题就来了,如果将数据都放在SRAM上,为了更好的推理性能,更小的推理延时,网络优化或算子优化的同学几乎都要做多核间的数据拆分(AI加速芯片几乎都是多核或众核架构),一旦做了拆分,就引出了问题,不同算子对于拆分有不同的友好度。

像是上面说的, element-wise 类的算子属于维度无关,怎么拆都行。我们暂时不考虑此类算子。

但如果一个网络片段中存在如 reduce_sum -> transpose 的层。

reduce_sum 一个友好的拆分方法是在core间拆非累加维。

如 NHWC 在 channel 维度做累加的话,我们可以在core间拆非channel维,比如可以拆 W 维(对于NHWC而言,W维属于第2维)。

但如果下一层 transpose 做的是 NHWC 转置变成 NCHW,一旦拆了W维,每个核内只有一部分的W,转置之后的W又处于最低维(对于NCHW而言,W维属于第3维)。

不同算子的拆分规则不同,这就乱了。

为了让最终数据不乱,同时遵守一个拆分规则,需要做多余的数据搬运操作。

最终,在我们花了大量的时间将这个奇怪的网络所有算子调试完后,一个自然而然的想法一下子在脑海中涌现出来:这个网络这么不好优化,为什么不在一开始将所有算子融合成一个大算子来做呢?

融合是有好处的

  • 没有数据对ddr的访存,杜绝了带宽瓶颈的存在
  • 层与层之间不用遵守固定的layout定义,想怎么存就怎么存,只要确保把数据算对就行
  • 指令条数明显会少,通过融合算子内部的流水排布,更容易做图优化

于是,融合就这么开始了。其实,融合的想法,在最开始适配网络的时候也想过,但限于开发周期和交付压力,还是选择了用小算子来拼网络的思路。融合作为一个神经网络的优化大杀器,是很值得做的。

最后说一下,AI推理和训练优化是一个很难啃的骨头,大火的chatGPT光训练一次,就要花费几千万美元的成本。如果将网络优化的足够好,可以大幅度降低训练成本,而这,都是白花花的银子啊。

本文作者原创,请勿转载,转载请联系作者

相关文章
|
4天前
|
负载均衡 网络协议 网络性能优化
动态IP代理技术详解及网络性能优化
动态IP代理技术通过灵活更换IP地址,广泛应用于数据采集、网络安全测试等领域。本文详细解析其工作原理,涵盖HTTP、SOCKS代理及代理池的实现方法,并提供代码示例。同时探讨配置动态代理IP后如何通过智能调度、负载均衡、优化协议选择等方式提升网络性能,确保高效稳定的网络访问。
34 2
|
10天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
143 80
|
18天前
|
机器学习/深度学习 算法 PyTorch
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
本文探讨了图神经网络(GNN)与大型语言模型(LLM)结合在知识图谱问答中的应用。研究首先基于G-Retriever构建了探索性模型,然后深入分析了GNN-RAG架构,通过敏感性研究和架构改进,显著提升了模型的推理能力和答案质量。实验结果表明,改进后的模型在多个评估指标上取得了显著提升,特别是在精确率和召回率方面。最后,文章提出了反思机制和教师网络的概念,进一步增强了模型的推理能力。
46 4
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
|
3天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
6天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
16天前
|
域名解析 缓存 网络协议
优化Lua-cURL:减少网络请求延迟的实用方法
优化Lua-cURL:减少网络请求延迟的实用方法
|
15天前
|
数据采集 监控 安全
公司网络监控软件:Zig 语言底层优化保障系统高性能运行
在数字化时代,Zig 语言凭借出色的底层控制能力和高性能特性,为公司网络监控软件的优化提供了有力支持。从数据采集、连接管理到数据分析,Zig 语言确保系统高效稳定运行,精准处理海量网络数据,保障企业信息安全与业务连续性。
37 4
|
21天前
|
Go 数据安全/隐私保护 UED
优化Go语言中的网络连接:设置代理超时参数
优化Go语言中的网络连接:设置代理超时参数
|
28天前
|
存储 安全 网络安全
云计算与网络安全:技术融合下的挑战与机遇
随着云计算技术的飞速发展,网络安全问题也日益凸显。本文将探讨云计算环境下的网络安全挑战,以及如何通过技术创新来应对这些挑战。我们将分析云服务的安全特性,讨论信息安全的最佳实践,并展望未来云计算与网络安全的发展趋势。
|
7月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】28.卷积神经网络之NiN模型介绍及其Pytorch实现【含完整代码】
【从零开始学习深度学习】28.卷积神经网络之NiN模型介绍及其Pytorch实现【含完整代码】