深度学习框架的内存优化机制
深度学习框架的内存优化机制
https://www.cnblogs.com/DicksonJYL/p/9576896.html
这篇博文简单介绍下深度学习框架的内存优化方式,主要参考资料1,也就是MXNet的官方文档。内存优化方式主要包括:in-place operation和memory sharing两种,二者在本质上没有太大差别,同时这两种也是MxNet主要采用的内存优化方式,下面的截图均来自参考资料1,接下来基于计算图来讲解。
1、in-place operation
in-place operation的示意图如下。这里有3层sigmoid,每个sigmoid的结果都放在同一个内存中,这是因为在得到第2个sigmoid的结果C后,第1个sigmoid的结果B就没有用了,所以可以直接覆盖。
但是这种in-place operation需要注意:只有当被覆盖的变量没有用了,才能覆盖。不能覆盖的情况如下图。这里当得到C后,因为B还要被另一个节点所依赖,所以C不能用B的内存。
2、memory sharing
memory sharing的示意图如下。这里当要进行第二个卷积层的时候,因为第一个卷积层的结果B已经没有用了,所以就回收第一个卷积层结果B所放的内存,用来存放第二个卷积层的结果E。
那么memory sharing有什么要求呢?原文是这么说的:The principle is to allow memory sharing only between variables whose lifetimes don’t overlap. 也就是说只要某个变量在后续的网络中用不到了,那么这个变量的内存就可以被重新利用。
这里的life time指的是一个变量从开始计算到最后一次被用到的时间。比如fc1的life time在计算得到act1后就结束了。
那么这个life time要怎么在代码中体现呢?或者说可以通过哪些方式判断某个变量的内存可以回收并重新利用呢?可以看下面这个模拟图,这里用一个计数器来记录还有多少个依赖于该节点并且还未进行计算的节点数目,只有当这个数目为0,该块内存才可以回收。右上角的矩形框表示回收到的可以被重新利用的内存,这样每次我们需要新的内存的时候既可以选择重新开辟一个内存空间,也可以选择用回收到的内存。
这里在计算B,C,E,F的时候都用到了memory sharing,在计算G的时候用到了in-place operation。
要注意的是:在上面的模拟过程中并没有真正分配内存,而是记录下每个节点需要多少内存,最后一次性申请所需的内存。
但是在进行memory sharing的时候容易遇到一个问题:并行化。想要很好地结合并行计算和内存共享是比较难的,可以看看下面这个示意图。
这是一个相同的网络,左右两个图是不同的内存共享设计图。如果不进行并行计算,那么这两个网络从A[1]到A[8]都是可以走通的。但是如果要并行计算,那么显然右边图是可以并行的,可以按网络结构分两个线程同时计算;而左边图不行,比如A[2]和A[5]不能同时计算得到,因为二者的内存是共享的。这个对比告诉我们:不要在可并行的节点之间进行内存共享。
那么要怎么判断哪些节点可以并行计算,哪些节点不能呢?可以采用类似下图这种启发式的方法来判断。首先找到网络中的最长路径,然后把这个路径用一种颜色表示,然后继续找剩下的最长的路径,再用另一种颜色表示。因为相同颜色路径的变量都有依赖关系,所以不能被并行,因此相同颜色路径的变量可以利用内存共享机制对其进行内存分配。
参考资料1:http://mxnet.io/architecture/note_memory.html
参考资料2:https://github.com/apache/incubator-mxnet/issues/797
深度学习框架的内存优化机制相关推荐
- 深度学习模型压缩与优化加速(Model Compression and Acceleration Overview)
1. 简介 深度学习(Deep Learning)因其计算复杂度或参数冗余,在一些场景和设备上限制了相应的模型部署,需要借助模型压缩.系统优化加速.异构计算等方法突破瓶颈,即分别在算法模型.计算图或算 ...
- 深度学习框架哪家强?国产框架OneFlow做了一份测评报告
视学算法报道 机器之心编辑部 近日,国产深度学习框架 OneFlow 发布了人工智能方向深度学习领域的 DLPerf 测评报告. 数据显示,OneFlow 在 4 机 32 卡下的 ResNet50- ...
- 开源100天,OneFlow送上“百天大礼包”:深度学习框架如何进行性能优化?
11月8日是OneFlow开源100天的纪念日,为了这个有纪念性的日子,我们为大家准备了一个"百天大礼包"--深度学习框架性能优化系列文章,希望能和大家共同探讨开源框架如何进行优化 ...
- 深度学习框架 TensorFlow:张量、自动求导机制、tf.keras模块(Model、layers、losses、optimizer、metrics)、多层感知机(即多层全连接神经网络 MLP)
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 安装 TensorFlow2.CUDA10.cuDNN7.6. ...
- Spark 2.4重磅发布:优化深度学习框架集成,提供更灵活的流式接收器
Apache Spark 2.4.0是2.x系列中的第五个版本.此版本增加了屏障执行模式,以便更好地与深度学习框架集成:引入30多个更高阶的内置函数,能够更轻松地处理复杂数据类型:优化K8s集成,同时 ...
- 深度学习 占用gpu内存 使用率为0_深度解析MegEngine亚线性显存优化技术
作者 | 旷视研究院 编辑 | Linda 基于梯度检查点的亚线性显存优化方法 [1] 由于较高的计算 / 显存性价比受到关注.MegEngine 经过工程扩展和优化,发展出一套行之有效的加强版亚线性 ...
- 小米开源移动端深度学习框架MACE,自主研发,专为IoT设备优化
允中 发自 凹非寺 量子位 报道 | 公众号 QbitAI 这可能是小米目前为止最重要的AI大动作. 昨天(6月28日),在2018开源中国开源世界高峰论坛现场,小米人工智能与云平台副总裁崔宝秋对外 ...
- AI System 人工智能系统 TVM深度学习编译器 DSL IR优化 计算图 编译 优化 内存内核调度优化 DAG 图优化 DFS TaiChi 函数注册机 Registry
DSL 领域专用语言 TVM深度学习编译器 AI System 人工智能系统 参考项目 TaiChi 三维动画渲染物理仿真引擎DSL TVM 深度学习DSL 密集计算DSL LLVM 模块化编译器 编 ...
- 深度学习框架TensorFlow系列之(五)优化器1
1 背景 梯度下降算法是目前最流行的优化算法之一,并且被用来优化神经网络的模型.业界知名的深度学习框架TensorFlow.Caffe等均包含了各种关于梯度下降优化器的实现.然而这些优化器经常被用作黑 ...
最新文章
- Linux的scp命令
- Visual Studio 2017 最新全量离线下载方法[有惊喜]
- lucene 学习一
- 初步认识Volatile-缓存一致性协议
- 配置Swagger2
- php 获取某一年最后一天_vivo年货节最后一天!多款机型大促,错过让你后悔再等一年!...
- UVa OJ 128 - Software CRC (软件CRC)
- gitlab中的CI
- ASP.NET小收集:Word的编码是Unicode
- python dict遍历_python 字典(dict)遍历的四种方法性能测试报告
- 对已经关闭的的chan进行读写,会怎么样?为什么?
- Linux下性能测量和调试诊断工具Systemtap
- 平衡二叉查找树的构造与遍历(C++)
- 渐进式Web应用程序居然是Web开发的未来
- paint java_java – 为什么paint()/ paintComponent()从未被调用?
- php在线考试系统详细步骤
- 使用Connectify让电脑变为WIFI
- 伺服舵机匀加速和匀减速运动Demo
- 微信直播王者荣耀设置教程(微信教程)
- 一个硬盘的感人爱情故事