Cuda out of memory

前言

我一定要说下我这个心酸的历史啊!!!事情是这样的,我通过东拼西凑得到了一个模型,在一个数据集上一跑,哟,效果还不错,磨刀霍霍准备在其它数据集上试试效果啊。结果你猜怎么着,呵,out of memory。接下来就是我心酸的解决历史了。

问题

所有的前提都是基于这个out of memory的数据集哈。
我是训练过程中没有问题,一验证就out of memory.首先我当然是上网查询原因啦,很多人都说用下面的方法:
将模型改为eval()模式
并且使用with torch.no_grad():

model.eval()
xxx
with torch.no_grad():
	for inputs in dataloader:
    	outputs,_ = model(inputs)
    	xxx

我怀着极大的期望一试,感觉问题将会迎刃而解啊。结果,哟,还是out of memory。我那个急啊。然后天马行空的想,这,我这,会不会是显存太小了。它主要不是训练有问题,那测试的时候把显存换个大点的试试。

解决1 :租云服务器

然后就开始了我漫长的租云服务器的道路。(通宵了一整晚,又伤钱又伤身啊)。说到云服务器我还是有点话语权了哈,之前我用的显存是12G的Tatan V,那我寻思着得租个显存为24g的3090啊,经过漫漫租云服务器(主要是国外的懒得翻,国内的厂商还是有几家比较合适的。纯安利,不是打广告哈。)的道路,我给你们总结下哪家服务器用得比较舒服。

厂商优点价格
MistGpu(官网) (我的邀请码)mistgpu.com/i/731655选定机器后,可以选择关机,(就是暂停),之后再开机它的端口号什么的还是不变,比如用Pycharm跑的话就不用重新配环境,也不用重新连ssh。机型也挺多,目前还有显存32g的v100,土豪的气息的3090(24g) 5元/时 v100(32g) 6元/时
矩池云(官网)(我的邀请码)g6JdK37cki19nNw价格很友好啊,新人优惠力度挺大的,券也挺多(缺点是如果点击释放该机器,待会重连就会需要重新配环境,重连ssh,建议一次到位,不要像我似的傻傻的把机器开着传数据,都是钱啊)。数据的话有初始的5个g还是多大的云端存储来着,然后我数据集挺大的,就花9.9开了个将云端扩大为50G了3090 5元/时(折后加上优惠券大概3.8元/时,反正越久越便宜)Tesla P100(16G) 4元/小时(折后2.85左右吧)
Featurize(官网)这个及以下的我都没有用过哈。目前是仅凭自己的感官发言。这应该是全网优惠前最低价格了。奈何,我等了一天,都没有实例啊(实例就是可租用的机器)桑心,所以没有感受好吧。价格是真心便宜啊3090(24g) 3.6元/时
智星云(官网主要是通过手机小程序管控,还挺方便的。我看着性能最强的A100(显存40g),牛逼。但是我没有用过哈3090(24g) 4.8元/时

上述就是我查询过的几个云服务器,但是最后只用了最上面的那两个。大家自己斟酌下哈。因为当时也是看了知乎什么的找了挺久,感谢知乎er的分享,现在也算是稍微的总结一下,其实还有挺多的云服务器厂商,但是由于时间问题所以我也就没有一一细查了。

好,说回正题,我那是花了一个下午时间传输数据,然后先是租了一个16g的P100,在远程连接之后,终于可以跑了,我那个激动啊,结果一到验证怎么的,out of memory。稳住,不气不气。说不定是16G还是不够呢对吧,所以,来24G的。我对3090那是充满期待啊,不得不说,训练时间的确比我们这12g的少了一半啊。但是一验证。。。 我有点绝望了,但是我还能稳住。最后,上32G的,这可是商用级别的机器了啊,我都不知道32G的还不行那我要怎么办了。结果,呵,还真不行。这验证的参数怎么回事啊,跟着显存的增大还通货膨胀了不成。绝望了。。。。

解决2:网络

痛定思痛,连钞能力都不能解决的问题,那肯定就是它自己本身有问题了好吧。于是我仔细排查,发现,哟,网络里面有个注意力,使用了softmax,所产生参数极多。那我想着,把这个网络模块去掉就好了嘛,但是,果然一个事物的存在是有理由的,去掉它之后,在另外一个数据集上跑出来效果不行了啊。这,那我就算跑出来了结果也没有用啊。纠结。。。

解决3:GPU训练,CPU验证

又陷入了死胡同,是牺牲我的精度还是牺牲数据集?成年人了,当然两个都要啊。这时候,一个师兄点醒了我,他说你要不试试只训练,保存损失最小的模型参数,之后再验证试试。我刚开始还不得其法,因为使用Gpu验证的时候还是会有out of memory的问题啊,后来,我突然想,能不能用cpu验证试试。结果果然可以开始验证了。上网一查,原来这个方法早就有,不过我一直陷入了死胡同,没有来得及拓展思维。
将代码改成这样子就可以在cpu上验证啦。

device = torch.device('cpu')  # 默认即在cpu上

model.to(device)

目前我还在等待数据集的训练结果之余写下这篇blog,权当记录我这半个月来的反复遭受的out of memory带来的痛苦了。其实我也不知道最后结果是好是坏,但是只要跑起来,就是好的。

祝大家好运!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值