最近一直在做优化

news2025/7/13 4:01:50

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

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

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

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

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

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

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

神经网络性能优化之——算子融合(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光训练一次,就要花费几千万美元的成本。如果将网络优化的足够好,可以大幅度降低训练成本,而这,都是白花花的银子啊。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言的学习小结——数组

一、一维数组的创建与初始化 1、格式: type_t arr_name[const_n];//type_t 是指数组的元素类型 //const_n 是一个常量表达式,用来指定数组的大小 注: 数组是使用下标来访问的,下标从0开始。 数组的大小可以通过计算得到&…

问卷调查设计-SurveyJS的使用(定制)

前言 距离上一次记录SurveyJS的文章已经过去大半个月了,也该完结一下子了,正好项目结束,抽出时间记录一下使用SurveyJS过程中的做的一些自定义配置需要哪些方法及属性(这里根据个人项目需要做的一些方法总结,不包含全…

【2023】华为OD机试真题Java-题目0221-AI处理器组合

AI处理器组合 题目描述 某公司研发了一款高性能AI处理器。每台物理设备具备8颗AI处理器,编号分别为0、1、2、3、4、5、6、7。编号0-3的处理器处于同一个链路中,编号4-7的处理器处于另外一个链路中,不通链路中的处理器不能通信,如下图所示。现给定服务器可用的处理器编号数…

这才叫装机必备,这3款高质量电脑软件,内存满了也绝不卸载

闲话少说,直上狠货。 1、quicker quicker是一款指尖电脑工具,使用它实现常用操作,就在手边,点击鼠标中键,即可弹出,位置跟随鼠标,面板窗口的下半部分,它会随当前操作的软件自动加载设…

【Yolov5】保姆级别源码讲解之-推理部分detect.py文件

推理部分之detect.py文件讲解1.下载Yolov5的源码2. 主函数讲解3.文件标头的注释4. main函数的5. run函数5.1 第一块参数部分5.2第二块,传入数据预处理5.3 第三块创建文件夹5.4 第四块 加载模型的权重5.5 第五块 Dataloader 加载模块5.6 第六块 推理部分 Run inferen…

python 魔法方法之 __ slots __

python 魔法方法之 __ slots __ __ slots __ __slots__是python class的一个特殊attribute,能够节省内存空间。正常情况下,一个类的属性是以字典的形式来管理, 每个类都会有__ dict__ 方法。但是我们可以通过 设置 __ slots__ 来将类的属性构造成一个静…

input 子系统

简介 先来了解什么是输入设备? 常见的输入设备有键盘、 鼠标、 遥控杆、 书写板、 触摸屏等等,用户通过这些输入设备与 Linux 系统进行数据交换。 什么是输入系统? 输入设备种类繁多, 能否统一它们的接口? 既在驱动层面统一&…

springboot+vue邯郸地标美食导游平台

设计者应有软件程序开发方面的专业理论基础知识,有一定的分析和解决问题的能力,有一定的收集、整理、信息检索等方面的能力,善于综合、勤于思考,具有一丝不苟,精益求精,刻苦钻研的工作精神,勇于…

基于遗传算法的柔性生产调度研究(Matlab代码实现)

👨‍🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…

S-Paper电子纸在生产车间中的应用

S-Paper电子纸在生产车间中的应用应用背景在传统的制造企业的生产流程中,生产线上的工件信息,加工信息等等在生产前都需要生产车间打印出来,然后再分发至生产线上对应的工件工位,纸张都是使用完后都是作废销毁,这样下来…

SQL零基础入门学习(九)

SQL零基础入门学习(八) SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序…

Xmake v2.7.7 发布,支持 Haiku 平台,改进 API 检测和 C++ Modules 支持

layout: post.cn title: “Xmake v2.7.7 发布,支持 Haiku 平台,改进 API 检测和 C Modules 支持” tags: xmake lua C/C package modules haiku cmodules categories: xmake Xmake 是一个基于 Lua 的轻量级跨平台构建工具。 它非常的轻量,没…

Android仿京东金融的数值滚动尺功能

自定义数值滚动尺,这个用的还是挺多的,例如京东金融的通过滚动尺选择金额等,而这次就是高仿京东金融的数值滚动尺。首先看看下效果图,如下:首先先给你们各个变量的含义,以免在后面的讲解中不知变量的意思,代码如下://最…

高/低压供配电系统设计——安科瑞变电站电力监控系统的应用

摘 要:在电力系统的运行过程中,变电站作为整个电力系统的核心,在保证电力系统可靠的运行方面起着至关重要的作用,基于此需对变电站监控系统的特点进行分析,结合变电站监控系统的功能需求,对变电站电力监控系…

载誉而归!昂视荣膺CAIMRS 2023「自动化创新奖」

2月24日,由中国工控网举办的第二十一届自动化及数字化年会在苏州希尔顿酒店隆重举行,昂视受邀参加本次活动。会上,中国工控网发布了第二十一届自动化及数字化年度自动化创新奖,昂视凭借LP8000系列超高精度3D激光轮廓仪斩获“自动化…

浅谈`AI`的那些事-环境搭建

人工智能(AI)-环境搭建 目录导航人工智能(AI)-环境搭建1. 为什么人工智能(AI)首选Python?2. python在AI上的优势2.1 python在AI上的优势2.1.1 语法简单,编码少。2.1.2 内置了几乎所有的AI项目库2.1.3 开源和可用于广泛编程2.2 python的特点3. PyTorch环境…

JVM详解——垃圾回收

如果有兴趣了解更多相关内容的话,可以看看我的个人网站:耶瞳空间 GC:垃圾收集(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存。不当的回收可能会导致程序或系统的不稳定甚至崩溃&…

PHP面向对象05:MVC和smarty

PHP面向对象05:MVC 和 smarty一、MVC思想二、MVC代码设计三、项目单一入口四、Smarty模板技术1. 模板技术原理2. Smarty简单使用3. Smarty配置五、Smarty模板变量六、Smarty内置函数七、Smarty外部函数一、MVC思想 MVC思想,是一种基于面向对象思想形成的…

如何将本地文件自动备份到百度网盘?

如何将本地文件自动备份到百度网盘?说到网盘的使用,大家第一个想到的肯定是百度网盘,百度网盘第一个提出网盘这个概念,相信很多小伙伴都是百度网盘的忠实用户,大家也非常喜欢使用百度网盘来存储文件。为什么百度网盘深…

Apache Hadoop生态部署-kafka单机安装

目录 Apache Hadoop生态-目录汇总-持续更新 一:安装包准备 二:安装与常用配置 2.1:下载解压安装包 2.2:配置环境变量 2.3:配置修改server.properties 三:维护kafka 3.1 编写维护脚本 3.2 启动kafk…