最近一直在做优化

大家好啊,我是董董灿。

好久没写文章了,最近收到了一些朋友的微信,问还写不写文章。

当然会继续写,只不过最近工作和生活忙的焦头烂额,一直没抽出时间来好好整理下自己,重整旗鼓继续写文。

总的来说,被两件事牵住了——

第一是房子在搞装修,从年前到现在几乎每个周末都要去逛建材城家具城,看家具家电,周末基本连轴转。

第二是项目到了紧要关头,几乎每人都在加班,项目中接到的神经网络一个接一个,功能调试和性能优化看不到头。

两件事,一边是工作,一边是生活。

这一篇主要想说一个最近项目的事——

神经网络性能优化之——算子融合(operator fusion)。

最近接了很多奇奇怪怪的神经网络需要实现和优化。

里面有不少常见、好实现并且好优化的算子,如 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光训练一次,就要花费几千万美元的成本。如果将网络优化的足够好,可以大幅度降低训练成本,而这,都是白花花的银子啊。



v v v v v v

**本文为作者原创,请勿转载,转载请联系作者。**
**点击下方卡片,关注我的公众号,有最新的文章和项目动态。**

v v v v v v

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/55553.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023五一出游数据报告.pdf(附下载链接)

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年3月份热门报告合集 万字干货:ChatGPT的工作原理 2023年创业(有创业想法)必读手册 ChatGPT等让你效率倍增的22个AI工具 ChatGPT调研…

巴比特 | 元宇宙每日必读:万人大裁员,硅谷急速进入“降本增效”时代,元宇宙要凉了?...

摘要:据霞光社报道,自去年底开始,大洋彼岸的硅谷急速进入“降本增效”时代。在一场场动辄过万人的大规模裁员衬托下,以Meta为代表规划的元宇宙宏伟蓝图,开始显得脱离实际。去年10月,调查及研究机构Canalys首…

文旅元宇宙:人工智能与实体经济的战略融合发展机遇

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年4月份热门报告合集 万字干货:ChatGPT的工作原理 无需翻墙,ChatGPT直接使用 2023年创业(有创业想法)必读手册 ChatGPT调…

sklearn回归 预测下一期双色球

sklearn回归 预测下一期双色球 最近接到预测双色球的任务,因为随机性过大,尝试搭建DNN RNN LSTM 都有较大的LOSS(随机性太强)。故用SK里自带的回归来预测。 首先我们爬取数据 import requests from bs4 import BeautifulSoup fro…

PC与IOS outlook客户端配置大全——(163邮箱、QQ邮箱、谷歌gmail邮箱)

PC与IOS outlook客户端配置大全——(163邮箱、QQ邮箱、谷歌gmail邮箱) 问题描述版本 IOS outlook配置方法163邮箱QQ邮箱谷歌gmail邮箱 PC端登陆163邮箱QQ邮箱配置谷歌gmail邮箱配置学校邮箱 其他问题解决关于无法下载图片问题描述问题解决 163邮箱同步问…

PHPMailer使用封装教程:为自己的PHP项目配置邮件功能

PHPMailer使用封装教程:为自己的PHP项目配置邮件功能 若为获取最佳阅读体验,请移步至本文永久链接:https://xenns.com/posts/1df67ba2/ 开源的PHPMailer简洁易用,相对于PHP官方文档提供的mail()需要一个已安装且正在运行的邮件系…

现在最好用的或者你喜欢邮件客户端是什么?

经小众读者提名的我最喜爱的《邮件客户端》终于有结果了,看图: “终于”,很多同学来询问《邮件客户端》结果哪里去了,其实一直都在硬盘里,而且差点沉底了。 但是说好了的客户端,那么多人填 Gmail&#xff0…

邮件发送客户端

一、Java Mail API简介 JavaMail API是读取、撰写、发送电子信息的可选包。我们可用它来建立如Eudora、Foxmail、MS Outlook Express一般的邮件用户代理程序(Mail User Agent,简称MUA)。而不是像sendmail或者其它的邮件传输代理(Mail Transf…

uniapp 微信小程序表单input输入框,点击下面的输入框时输入法弹出会把输入框内容顶上去

项目场景: 原因分析: 当前页面设置了高度,以及滚动轴,输入法弹出时并没有把页面内容往上定,只顶了输入框内容 解决方案: 不要设置死高度,内容自适应,输入法弹出时让他自己往上顶整…

chatgpt赋能python:Python小数点进位教程:学会进阶计算

Python小数点进位教程:学会进阶计算 什么是小数点进位? 小数点进位是指计算机在处理小数时发生的一种情况,即当小数位数过多时,计算机会自动四舍五入或向上进位,以保证计算的准确性。 Python中的小数点进位 在Pyth…

鸿蒙OS应用开发工具下载安装教程

前言 提示:面向全场景多设备,提供一站式的分布式应用开发平台,支持分布式多端开发、分布式多端调测、多端模拟仿真,全方位的质量与安全保障。 提示:以下是本篇文章正文内容,下面案例仅供参考,皆…

ubuntu20.04安装微信客户端,亲测有效!

腾讯微信官网没有出Ubuntu版本的客户端,但是可以根据我提供的微信客户端软件,在Ubuntu20.04版本上进行安装,亲测有效!文章末尾提供下载链接。 Ubuntu版微信客户端,支持托盘菜单;支持搜索联系人;…

Ubuntu22.10 安装微信方法

Ubuntu22.10 安装微信方法 Ubuntu操作系统中,我尝试过用wine方式安装数次都没有能够启动成功。。。 方法如下 在Ubuntu上安装微信需要使用Wine,Wine是一款可以在Linux系统上运行Windows应用程序的兼容层。以下是安装微信的步骤:安装Wine 打…

Ubuntu系统下安装微信客户端

此项目为开源项目,电脑需要安装git和node.js github地址: https://github.com/geeeeeeeeek/electronic-wechat # 下载项目 git clone https://github.com/geeeeeeeeek/electronic-wechat.git # 进入项目目录 cd electronic-wechat # 安装依赖包,成功后…

如何更换安装鸿蒙系统,华为鸿蒙系统2.0如何进行安装?鸿蒙系统2.0安装方法详细介绍...

华为鸿蒙系统2.0如何进行安装?现在已经可以安装鸿蒙系统2.0,但是你不清楚安装,下面就让浏览器小编为大家带来,鸿蒙系统2.0安装方法详细介绍。 部分更新了华为鸿蒙OS用户表示,安卓和鸿蒙的应用软件都可以玩,UI暂时没变、用户体验感…

Ubuntu系统下安装微信

安装微信实现截图发送图片功能 1.打开终端输入命令,更新软件源 sudo apt-get update 2.输入以下命令(一定注意 -O- 中间是大写字母O,不是0也不是小写o!!!) wget -O- https://deepin-wine.…

华为鸿蒙os下载安装,华为鸿蒙系统安装包

华为鸿蒙系统安装包下载是华为打造的最新安卓手机系统,华为鸿蒙系统可以让手机、穿戴设备、PC等终端之间连接更稳定,下载之后手机使用更流畅,可以说是2020年最好的安卓系统,功能强大很稳定,感兴趣的用户快来下载安装吧…

鸿蒙系统如何下载使用谷歌商店

下载 实际上,鸿蒙系统本身是有谷歌相关的文件,只是不能用而已 你打开设置,最下面就是google相关组件 网上有大量的繁杂的教程,不外乎是引流到qq,用电脑软件连接手机完成一堆复杂的操作 所以在我的极简理念之下&…

华为鸿蒙系统开发环境安装与初识

今天了解了一下华为鸿蒙系统开发,作为国产系统还是要去了解一下的,毕竟这个系统很多设备都会用到、例如PC、手机、电视等穿戴设备都会用到。 既然要开发那么肯定要成为开发者了,那么就都下面的网站注册成为开发者,https://develop…

Ubuntu20.04系统WineHQ7.0安装微信

提供3种Ubuntu系统安装微信的方法,在Ubuntu20.04上验证都ok。 1.WineHQ7.0安装微信:ubuntu20.04安装最新版微信 --可以支持微信最新版,但是适配的不是特别好;比如WeChartOCR.exe 报错。 2. 原生微信安装:linux系统下的…