pytorch多GPU加速出错

这个错误花费了一天半左右的时间,心态差点蹦了,还好有神人指导,坚持下来了。

RuntimeError: CUDA out of memory. Tried to allocate 46.00 MiB (GPU 0; 10.76 GiB total capacity; 839.60 MiB already allocated; 24.56 MiB free; 44.40 MiB cached)

1.错误问题的解决思路
这个问题就是GPU内存不够用了。本人使用的是Linux,2080Ti的服务器,在做视频分类的任务,此时使用单GPU还是多GPU都显示出这个错误。
一开始使用nvidia-smi监控GPU发现显存的使用量很少但是依旧报出该错误,就思考是否是代码写的有bug,排除了数据和网络模型几乎所有的可能,依然没有找到解决方案。
后来,设置一部分数据,监控GPU,发现在使用GPU时,一个episode中数据加载到网络训练后,下一个episode的数据累加了,GPU显示一直在增加,但是GPU会增加到一个最大值然后保持不变(猜测是将所有数据全部加载了,因为做的是小样本前期训练数据并不是一次性加载的),会出现本文的错误,就是最大值超过了GPU的最大显存,后来设置让增加的最大值小于GPU显存极限,错误消失了。

2.pytorch多GPU加速的可能原理
同时,还发现多GPU加载数据时的可能性。pytorch使用DataParallel实现单机多GPU加速,会将模型复制到加速的GPU上,数据按照batch-size除以加速GPU数量,最后将加速的结果拼接在一起放到第一个GPU上面。实验中使用了两块GPU加速,同时,调用了两次dataloader,第一个dataloader中batch-size的大小设置为10,第二个设置为10,此时两块GPU会达到近似1:1的情况,不出出现本文的问题,当dataloader的batch-size的大小分别设置为5和15时,前一块GPU会比后一块GPU的数量大很多,以至于更快的达到显存的极限,出现了本文的问题。
我认为这两种情况的可能原因是,当加速数据可以平均分配时,会在多GPU合适的进行,但是无法分配时,可能更多的借助于第一块GPU,所以造成第一块更快的达到极限,更有可能显存崩掉。

以上仅是个人看法,如果大家有不同或者更好的见解,欢迎评论,借以学习。

全部评论

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务