深度解读昇腾CANN内存复用技术,降低网络内存占用

news/2024/11/19 11:41:24/文章来源:https://www.cnblogs.com/huaweiyun/p/18291341

本文分享自华为云社区《深度解读昇腾CANN内存复用技术,降低网络内存占用》,作者: 昇腾CANN。

随着大模型的兴起,神经网络规模不断扩大,对内存资源的消耗也越来越高,如何降低AI算法的内存占用成为AI计算领域降成本提性能的一个重要手段。当前降低AI算法内存占用的主要技术有内存复用(Memory Reuse)、重算(Recompute)、内存交换(Memory Swap)、控制执行序(Topo优化)等,其中内存复用是应用最广泛的内存优化技术,该技术可在不影响网络执行性能的前提下降低内存占用,结合Topo优化可以进一步降低内存占用,且对执行性能影响也较小。

静态shape的神经网络在基于计算图模式执行时,由于具备计算图的全局视角,可以较完整地记录和管理全局内存及生命周期信息,GE(Graph Engine)图引擎基于业界常规的内存优化技术,借助全图视角对内存复用算法进行了更好的寻优处理,同时进行了Topo排序优化降低网络内存理论最小值,从而更有效地降低网络内存占用。

1 内存复用技术

1.1 常规内存复用技术

如下图所示有一个简单的网络,经过Topo排序后每个节点都有一个唯一的ID,每个节点的输出内存都可以用这个ID来表达生命周期。

1.png

其中“生命周期”是指内存从分配到释放的时间段,用拓扑排序序号来表示,在复用处理过程中,生命周期没有重叠的才能复用。

“内存复用”是指按照生命周期和内存大小,把不冲突的内存重复使用,来降低网络内存占用。内存复用算法主要有Binary block复用和Max block复用两种,两种复用算法原理类似,唯一差别是block的大小规划有差异。这里的“block”是指内存复用时的虚拟内存块,并不是真正的内存。

内存占用的“理论最小值”计算方式为:按照内存使用顺序,在每个节点生命周期开始加上内存大小,生命周期结束减去内存大小,不考虑内存碎片和空洞等浪费问题,理论计算得到的内存占用最小值。如下图所示,内存占用的理论最小值为4608,但是如果不做内存复用,总内存大小为8704。

原始网络内存需求示例图:

2.png

内存复用处理的主要步骤:

1、获取内存复用block的Range值

Max block算法取所有内存大小的最大值作为Range,此例为[4096],Binary block算法会按规则生成多个Range,此例为[1024,2048,4096]。

2、Reuse处理

按照拓扑排序进行内存分配和复用,Max block复用算法block大小都一样,只要生命周期满足要求就可以复用,Binary block复用算法block大小不同,要生命周期和block大小同时满足要求才可以复用。

3、Resize处理

复用处理时block大小一般都比实际分配的内存大,resize的作用就是根据复用结果把block大小改成合适的大小并做512字节对齐。

下面以Max block算法为例介绍原始内存复用技术的实现原理,Range为[4096],因此所有block大小都为4096。Max block算法内存复用示例图如下所示:

3.png

Reuse处理:按照网络节点顺序进行内存复用。内存分配时的block大小都是4096,标号为A、C、E的内存可以复用,而标号是B、D的内存由于生命周期存在交叉,无法复用。所以复用后得到3个block。

Resize处理:按照block中实际节点内存大小进行压缩。复用完成后每个block取所有节点的内存最大值作为该block最终内存大小,如block1最大的是E,最终大小为4096,block2只有一个B最终大小为2048,block3为512,最后所有block的大小累加就是复用后的总内存大小。如下图所示,复用后总内存大小为6656。

4.png

1.2 GE内存复用优化技术

Max block算法进行内存复用时,要求所有block大小都是block Range,即网络节点的内存最大值4096,所以即使实际仅需要较小的内存也要按照最大值进行内存分配,存在一定的内存浪费。Binary block算法虽然对block大小进行了细化,但是要在一定大小范围内的节点才会复用,内存较大和内存较小都无法复用,也会影响内存复用的效果,存在内存浪费的弊端。

因此,GE采用了一种更极致的内存空间复用优化技术。一级复用时只把相同大小的内存复用在一起得到一组block,二级复用时把block按照从大到小排序,顺序取后面一个block,如果生命周期不重叠和当前block进行合并,否则不做处理,以此类推进行多级递归判断,最后把未被合并的block大小进行累加就是最终内存大小,由于大block合并多个小block,因此可以进一步减少内存占用。

一级复用处理:按照实际大小进行复用,不同大小的block不复用在一起,因此AC可以复用,AE大小不同无法复用,复用后示例如下图所示。

5.png

一级复用处理后得到4个block(比原有节点数减少了一个,此例比较简单,实际网络中block的数量可以比节点数减少一个数量级),然后根据网络节点生命周期获取block的生命周期。block生命周期示例图如下所示:

6.png

然后把block按照从大到小进行排序,排序后结果如下图所示。

7.png

二级复用处理:把排序后的大block和小block依次进行合并处理,一个大block可以合并多个小block。

  • block4生命周期为[5,6],block2的生命周期为[2,4],生命周期不重叠,可以和block2进行合并,起始地址对齐。
  • block1生命周期为[1,4],和block4生命周期不重叠,但是和block2重叠,因此摆放在block2的右侧,起始地址为block2的结束地址。
  • block3生命周期为[4,5],和block4重叠,不能和block4合并,因此只能摆放在block4的右侧。
  • 最终得到复用后的内存大小为4608(4096+512),和理论最小值一致,没有任何浪费。

block合并示例图如下所示:

8.png

1.3 GE内存复用优化效果

GE的内存复用优化主要有以下优点:

  • 提高内存复用率,减少内存占用

解决不同大小内存之间的组合复用问题,可以把一块大内存切分成多块小内存进行二次复用,进一步提高内存复用率,减少内存占用。

  • 降低复用算法耗时

先按节点内存实际大小和生命周期进行一级复用,减少二级复用时的block个数(可以减少一个数量级),有效减少二级复用算法耗时。

从16个实际网络模型的测试结果看,采用GE内存复用优化技术可以更好地降低网络内存,单Stream大部分场景可逼近理论最小值,而处理耗时也较短,如下图所示。

9_1.jpg

较好的内存复用效果主要得益于GE计算图模式有全局的内存大小和生命周期信息,能够让复用算法进行更好的寻优处理;而单算子模式下,由于算法无法预测内存大小,生命周期也没有全局信息,会导致内存空洞和碎片问题,无法将内存复用做到极致,大部分场景内存占用只能做到理论最小值的1.2倍以内。相同网络图模式内存占用会比单算子模式更少,例如,相同的网络下,若单算子模式需要15.14G,图模式只需要13.8G,内存占用可降低9%左右。

2 Topo优化技术

2.1 常规Topo技术

内存复用优化技术主要解决如何逼近理论最小值的问题(一个网络在确定的Topo排序下都有一个理论最小值),而改变Topo排序可以进一步降低理论最小值的下限。业界常用的Topo排序算法有BFS,DFS,逆DFS,在不同的图结构下也会有较大的差异,常规排序算法没有考虑内存相关因素。常规Topo技术示例如下图所示:

10.png

如上网络结果所示,DFS选择左侧分支先排序时,如图10中的“优先排序左侧分支”,会导致B的内存生命周期较长[2,6],无法和C,D内存复用。DFS选择右侧分支先排序时,如图10中的“优先排序右侧分支”,B的内存生命周期是[5,6],可以和C,D内存进行复用,但是又会导致A内存的生命周期变长由[1,3]变为[1,5],因此常规Topo排序算法无法做出针对内存的最优选择,最后复用后内存大小是一个不确定的结果。

2.2 GE Topo优化技术

GE针对Topo技术进行了优化,首先做常规Topo排序,然后对排序结果进行处理,结合内存策略把某些节点的排序重新调整,从而确保调整后内存大小是可以降低的。其中一个优化策略就是把输入是长生命周期的节点向后移动,移动到排序最靠前的一个输出节点前。

长生命周期内存的判断规则:

  • 固定规则,根据类型判断,如果某节点的输入是Variable、Constant、Const类型,或者不做复用的Data、RefData类型,则此节点可向后移动,因为这些类型的节点内存本身不做复用,所以节点向后排不影响内存生命周期。
  • 动态规则,根据Topo排序结果进行判断,排序完成后,理论上可以计算出某节点的输入节点内存的最大生命周期,标记为L1,然后寻找本节点的输出内存的最小生命周期,标记为L2,如果L1 > L2,则可以将本节点移动到L2前。

如下图所示,假设节点A是Variable类型,则可以将节点B移动到输出节点F的前面,进行排序优化。

11.png

2.3 GE Topo优化效果

做了Topo优化后,降低了网络的内存理论最小值,最后内存复用后的大小会进一步下降,如下是几个网络的实际测试结果。

3 更多介绍

GE内存复用技术的相关介绍就到这里,欢迎大家关注后续技术分享。如需获取更多学习资源请登录昇腾社区。

点击关注,第一时间了解华为云新鲜技术~

 

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

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

相关文章

备份脚本

1.Oracle RMAN备份 1.1 创建目录[oracle@OEL7 ~]$ mkdir -p /u01/dbbak/script[oracle@OEL7 ~]$ cd /u01/dbbak[oracle@OEL7 ~]$ chown -R oracle:oinstall script[oracle@OEL7 ~]$ mkdir -p /u01/dbbak/db[oracle@OEL7 ~]$ mkdir -p /u01/dbbak/arch[oracle@OEL7 ~]$ cd /u01/…

聊聊springboot项目如何利用jmh来进行基准测试

前言1、什么是JMHJMH(Java Microbenchmark Harness)是由OpenJDK团队开发的一个用于Java微基准测试工具套件,主要是基于方法层面的基准测试,精度可以达到纳秒级。它提供了一种标准、可靠且可重复的方式来衡量Java代码的性能,包括方法调用、对象创建以及其他类型的 JVM 级别…

echart - x轴文字太长换行、文字倾斜、文字竖直展示

echart - x轴文字太长换行、文字倾斜、文字竖直展示 设置超过几个字换行显示xAxis: {axisLabel: {formatter: function (params) {var str = ""; // 最终拼接成的字符串var paramsLen = params.length;// 获取每项文字的个数var len = 4; …

Vscode+CodeRunner 更加优雅的运行MPICC

Vscode+CodeRunner 更加优雅的运行MPICC 1.安装 在VsCode拓展中安装CodeRunner2.配置点击设置点击 在setting.json中编辑3.setting.json设置 这里我们以cpp为例 偷懒可以直接把下面的json文件做替换 {"workbench.colorTheme": "Quiet Light","remote.…

几行代码,优雅的避免接口重复请求!同事都说好!

背景简介 我们日常开发中,经常会遇到点击一个「按钮」或者进行「搜索」时,请求接口的需求。 如果我们不做优化,连续点击「按钮」或者进行「搜索」,接口会重复请求。❝ 首先,这会导致性能浪费!最重要的,如果接口响应比较慢,此时,我们在做其他操作会有一系列bug! ❞ 那…

Windows远程桌面的奇技淫巧

远程桌面协议(RDP)是一个多通道(multi-channel)的协议,让使用者连上提供微软终端机服务的计算机(称为服务端或远程计算机)。在获取权限后,针对3389进行展开,先查询3389端口是否开启,发现没有开启(也有可能更改了端口),则可以通过注册表进行手动启动。前言Windows远程桌面…

路径规划(2)——A*算法

1、A*算法原理搜索区域(The Search Area):图中的搜索区域被划分为了简单的二维数组,数组每个元素对应一个小方格,当然我们也可以将区域等分成是五角星,矩形等,通常将一个单位的中心点称之为搜索区域节点(Node)。   开放列表(Open List):我们将路径规划过程中待检测…

编译安装Kubernetes 1.29 高可用集群(8)--Dashboard和Traefik安装部署

1.部署Dashboard 1.1 在任意k8s-master节点上安装dashboard # helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/ # helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kube…

我跟你说@RefreshScope跟Spring事件监听一起用有坑!

本文记录一下我在 Spring 自带的事件监听类添加 @RefreshScope 注解时遇到的坑,原本这两个东西单独使用是各自安好,但当大家将它们组合在一起时,会发现我们的事件监听代码被重复执行。希望大家引以为鉴,避免重复踩坑。耐心看完,你一定会有所收获! 前置描述 最近有一个用户…

Vue开发环境搭建教程

在搭建Vue开发环境时,通常需要遵循一系列步骤来确保环境配置正确且高效。以下是一个详细的步骤指南,用于在Windows系统上搭建Vue开发环境: 一、安装Node.js下载Node.js:访问Node.js官网(https://nodejs.org/zh-cn/)下载适合您操作系统的Node.js安装包。安装Node.js:双击…

数据血缘系列(2)——什么是数据血缘?

大家好,我是独孤风。在当今数据驱动的商业环境中,数据治理成为企业成功的关键因素之一。对于数据血缘的定义,一直都有争论,本文我们详细探讨下什么是数据血缘,并说明数据血缘能分析什么。 本文为《数据血缘分析原理与实践 》一书读书笔记,部分观点参考自书中原文,如需更…

windows 运行 java程序时 无故停止不动 问题

windows 运行 java程序时 无故停止不动 问题。是 cmd 程序 的 快速编辑模式 引起的。去掉即可。 右键点属性-》将 快速编辑模式 的多选框 去掉