从零开始学习MXnet(五)MXnet的黑科技之显存节省大法
写完发现名字有点拗口。。- -#
大家在做deep learning的时候,应该都遇到过显存不够用,然后不得不去痛苦的减去batchszie,或者砍自己的网络结构呢? 最后跑出来的效果不尽如人意,总觉得自己被全世界针对了。。遇到这种情况怎么办? 请使用MXnet的天奇大法带你省显存! 鲁迅曾经说过:你不去试试,怎么会知道自己的idea真的是这么糟糕呢?
首先是传送门附上 mxnet-memonger,相应的paper也是值得一看的 Training Deep Nets with Sublinear Memory Cost。
实际上repo和paer里面都说的很清楚了,这里简单提一下吧。
一、Why?
节省显存的原理是什么呢?我们知道,我们在训练一个网络的时候,显存是用来保存中间的结果的,为什么需要保存中间的结果呢,因为在BP算梯度的时候,我们是需要当前层的值和上一层回传的梯度一起才能计算得到的,所以这看来显存是无法节省的?当然不会,简单的举个例子:一个3层的神经网络,我们可以不保存第二层的结果,在BP到第二层需要它的结果的时候,可以通过第一层的结果来计算出来,这样就节省了不少内存。 提醒一下,这只是我个人的理解,事实上这篇paper一直没有去好好的读一下,有时间在再个笔记。不过大体的意思差不多就是这样。
二、How?
怎么做呢?分享一下我的trick吧,我一般会在symbol的相加的地方如data = data+ data0这种后面加上一行 data._set_attr(force_mirroring='True'),为什么这么做大家可以去看看repo的readme,symbol的地方处理完以后,只有如下就可以了,searchplan会返回一个可以节省显存的的symbol给你,其它地方完全一样。
import mxnet as mx
import memonger # configure your network
net = my_symbol() # call memory optimizer to search possible memory plan.
net_planned = memonger.search_plan(net) # use as normal
model = mx.FeedForward(net_planned, ...)
model.fit(...)
PS:使用的时候要注意,千万不要在又随机性的层例如dropout后面加上mirror,因为这个结果,再算一次就和上一次不同了,会让你的symbol的loss变得很奇怪。。
三、总结
天奇大法吼啊!
从零开始学习MXnet(五)MXnet的黑科技之显存节省大法的更多相关文章
- 从零开始学习jQuery (五) 事件与事件对象
本系列文章导航 从零开始学习jQuery (五) 事件与事件对象 一.摘要 事件是脚本编程的灵魂. 所以本章内容也是jQuery学习的重点. 本文将对jQuery中的事件处理以及事件对象进行详细的讲解 ...
- 从零开始学习jQuery(转)
本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery ( ...
- 从零开始学习jQuery
转自:http://www.cnblogs.com/zhangziqiu/archive/2009/04/30/jQuery-Learn-1.html 本系列文章导航 从零开始学习jQuery (一) ...
- 从零开始学习MXnet(四)计算图和粗细粒度以及自动求导
这篇其实跟使用MXnet的关系不大,但对于我们理解深度学习的框架设计还是很有帮助的. 首先还是对promgramming models的一个简单介绍,这个东西实际上是在编译里面经常出现的东西,我们在编 ...
- 从零开始学习MXnet(三)之Model和Module
在我们在MXnet中定义好symbol.写好dataiter并且准备好data之后,就可以开开心的去训练了.一般训练一个网络有两种常用的策略,基于model的和基于module的.今天,我想谈一谈他们 ...
- 文本分类学习 (五) 机器学习SVM的前奏-特征提取(卡方检验续集)
前言: 上一篇比较详细的介绍了卡方检验和卡方分布.这篇我们就实际操刀,找到一些训练集,正所谓纸上得来终觉浅,绝知此事要躬行.然而我在躬行的时候,发现了卡方检验对于文本分类来说应该把公式再变形一般,那样 ...
- 黑科技!仅需 3 行代码,就能将 Gitter 集成到个人网站中,实现一个 IM 即时通讯聊天室功能?
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- 国庆出游神器:魔幻黑科技换天造物,让vlog秒变科幻大片!
摘要:国庆旅游景点人太多,拍出来的照片全是人人人.车车车,该怎么办?不妨试试这个黑科技,让你的出游vlog秒变科幻大片. 本文分享自华为云社区<国庆出游神器,魔幻黑科技换天造物,让vlog秒变科 ...
- ASP.NET从零开始学习EF的增删改查
ASP.NET从零开始学习EF的增删改查 最近辞职了,但是离真正的离职还有一段时间,趁着这段空档期,总想着写些东西,想来想去,也不是很明确到底想写个啥,但是闲着也是够 ...
随机推荐
- kivy学习三:打包成window可执行文件
根据官方文档写出如下内容,主要是为了记录自己遇到的坑! 一.打开命令行 1.win+r 2.输入CMD(没错,就是那个黑窗口就是命令行) 二.新建一个新文件夹,用来存放我们打包成的文件(这里一定要注意 ...
- go web cookie和session
cookie是存储在浏览器端,session是服务器端 cookie是有时间限制的,分会话cookie和持久cookie,如果不设置时间,那周期就是创建到浏览器关闭为止.这种是会话cookie,一般保 ...
- R语言绘图:雷达图
使用fmsb包绘制雷达图 library("fmsb") radarfig <- rbind(rep(90, 4), rep(60, 4), c(86.17, 73.96, ...
- 笔记-python-常见特殊变量
笔记-python-常见特殊变量 类似__xx,以双下划线开头的实例变量名,就变成了一个私有变量(private),只有内部可以访问,外部不能访问: 类似__xx__,以双下划线开头,并且以双下划线结 ...
- 从C到C++ (1)
从C到C++ 一. bool类型 bool取值false和true,是0和1的区别: false可以代表0,但true有很多种,并非只有1. 二. const限定符 常量在定义后就不能修改,所以定义时 ...
- lnmp操作
LNMP 1.2+状态管理: lnmp {start|stop|reload|restart|kill|status}LNMP 1.2+各个程序状态管理: lnmp {nginx|mysql|mari ...
- Android: Requesting root access in your app
package com.certusnet.videomonitor; import java.util.List; import java.io.IOException; import java.i ...
- formValidator 不支持jquery1.9以上的解决办法
不支持的原因是因为jquery1.9以上版本剔除了$.browser 在formValidator 源码最顶层.或者jquery源码里加上如下代码 $.browser = {};$.browser.m ...
- 「Haskell 学习」一 环境与大致了解
感谢<Real World Haskell>在网上的免费发布,可以白嫖学Haskell这个久闻大名的函数式编程语言了. 本文运行于openSUSE Tumbleweed下,运行相关命令时留 ...
- 最小总代价 状压DP
描述 n个人在做传递物品的游戏,编号为1-n. 游戏规则是这样的:开始时物品可以在任意一人手上,他可把物品传递给其他人中的任意一位:下一个人可以传递给未接过物品的任意一人. 即物品只能经过同一个人一次 ...