死亡Error:OSError: [Errno 12] Cannot allocate memory

死亡Error:OSError: [Errno 12] Cannot allocate memory死亡Error:OSError:[Errno12]Cannotallocatememory调试背景:使用的是github上https://github.com/arunmallya/packnet这里的代码。调试的时候,出现Error,如下:main()File”main.py”,line378,inmainmanager.prune()Fi…

大家好,又见面了,我是你们的朋友全栈君。

死亡Error:OSError: [Errno 12] Cannot allocate memory

调试背景:使用的是github上https://github.com/arunmallya/packnet这里的代码。

调试的时候,出现Error,如下:

    main()
  File "main.py", line 378, in main
    manager.prune()
  File "main.py", line 263, in prune
    savename='_final', best_accuracy=accuracy)
  File "main.py", line 217, in train
    self.do_epoch(epoch_idx, optimizer)
  File "main.py", line 174, in do_epoch
    for batch, label in tqdm(self.train_data_loader, desc='Epoch: %d ' % (epoch_idx)):
  File "/home/rvlg/anaconda3/envs/torch/lib/python3.5/site-packages/tqdm/_tqdm.py", line 1032, in __iter__
    for obj in iterable:
  File "/home/rvlg/anaconda3/envs/torch/lib/python3.5/site-packages/torch/utils/data/dataloader.py", line 301, in __iter__
    return DataLoaderIter(self)
  File "/home/rvlg/anaconda3/envs/torch/lib/python3.5/site-packages/torch/utils/data/dataloader.py", line 158, in __init__
    w.start()
  File "/home/rvlg/anaconda3/envs/torch/lib/python3.5/multiprocessing/process.py", line 105, in start
    self._popen = self._Popen(self)
  File "/home/rvlg/anaconda3/envs/torch/lib/python3.5/multiprocessing/context.py", line 212, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "/home/rvlg/anaconda3/envs/torch/lib/python3.5/multiprocessing/context.py", line 267, in _Popen
    return Popen(process_obj)
  File "/home/rvlg/anaconda3/envs/torch/lib/python3.5/multiprocessing/popen_fork.py", line 20, in __init__
    self._launch(process_obj)
  File "/home/rvlg/anaconda3/envs/torch/lib/python3.5/multiprocessing/popen_fork.py", line 67, in _launch
    self.pid = os.fork()
OSError: [Errno 12] Cannot allocate memory

遇到这个问题,由于代码本身的额原因先是考虑到运行电脑的内存问题,于是用

watch -n 2 nvidia-smi
watch -n 2 free -m

全程监视电脑CPU、GPU,以及物理内存、交换区内存的变化情况,发现并不是内存的原因。找bug未果。
换了一个思路,从出错的代码以及错误提示上来看,是dataloader.py出了问题,于是Google,关键词:dataloader OSError: [Errno 12] Cannot allocate memory
果然有很多人也是由于在dataload的时候出错,找了很多原因:
1、电脑内存原因(已排除)
2、电脑系统线程数量限制:https://blog.csdn.net/m0_37644085/article/details/92795488:修改最大进程数(尝试无效)
3、设置pin_memory=False;(尝试无效)
4、修改多线程数量:设置num_workers,num_workers是加载数据(batch)的线程数目,系统默认的数量是4,改成1之后,没有效果,后面改成0,问题解决!!!程序可以跑了。

总结:
当计算机的内存充足的时候,可以设置pin_memory=True。当系统卡住,或者交换内存使用过多的时候,设置pin_memory=False。因为pin_memory与电脑硬件性能有关,pytorch开发者不能确保每一个炼丹玩家都有高端设备,因此pin_memory默认为False。
(实操时,貌似如果内存交换过多时,置pin_memory = True会卡住,可以将其设为False,对应的num_workers = 0)

特发此帖纪念,认真查了两天多!!!希望可以帮到大家。
转载请注明来源:https://blog.csdn.net/breeze210/article/details/99679048,谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152619.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql分析慢查询_开启慢查询日志

    mysql分析慢查询_开启慢查询日志一、生成实验数据原理:sql蠕虫复制(这种生成数据方式同样适用于数据表中有主键的情况)。insertintocomic(name,pen_name,cover)selectname,pen_name,coverfromcomic 二、慢查询日志设置当语句执行时间较长时,通过日志的方式进行记录,这种方式就是慢查询的日志。1、临时开启慢查询日志(如果需要长时间…

    2022年10月14日
    3
  • SQL学习(一):months_between日期函数

    SQL学习(一):months_between日期函数日期函数months_between的用法:MONTHS_BETWEEN(date1,date2)用于计算date1和date2之间有几个月。如果date1在日历中比date2晚,那么MONTHS_BETWEEN()就返回一个正数。如果date1在日历中比date2早,那么MONTHS_BETWEEN()就返回一个负数。如果date1和date2日期一样,那么MONTHS_BETWEEN()就返回一个0。案例SQL>selectmonths_between(to_date(

    2022年8月20日
    8
  • MySql5.7 配置文件 my.cnf 设置

    MySql5.7 配置文件 my.cnf 设置

    2021年10月27日
    52
  • 软件架构与设计模式_软件架构设计

    软件架构与设计模式_软件架构设计什么是架构?软件体系结构通常被称为架构,指可以预制和可重构的软件框架结构。架构尚处在发展期,对于其定义,学术界尚未形成一个统一的意见,而不同角度的视点也会造成软件体系结构的不同理解,以下是一些主流的标准观点。ANSI/IEEE610.12-1990软件工程标准词汇对于体系结构定义是:“体系架构是以构件、构件之间的关系、构件与环境之间的关系为内容的某一系统的基本组…

    2022年8月31日
    4
  • callee和caller的区别_caller中文

    callee和caller的区别_caller中文Javascriptarguments.callee和caller的区别一、callee  在学习callee之前,需要先学习arguments。  arguments:含义:该对象代表正在执行的函数和调用它的函数的参数。 语法: 1 [function.]arguments[n]   参数:function:当前正在执行的Func…

    2025年6月20日
    2
  • 群晖 docker 端口_群晖 l2tp

    群晖 docker 端口_群晖 l2tp最近群晖docker某个容器端口总是被扫描,系统自动封禁了很多IP,遂想更改端口,个人对Linux和docker非常不熟悉,只做记录,如有错误,欢迎指出流程分为以下几个步骤:停止容器修改端口映射重启docker停止容器首先用dockerps命令查看所有的容器名称和id例如容器ID为a1b2c3用dockerstopa1b2c3来停止容器修改端口映射修改端口映射主要在了两个文件hostconfig.json和config.v2.json下面是如何找到这两个文件的路径利用cd/v

    2022年10月18日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号