解决Pytorch内存溢出,Ubuntu进程killed的问题

pytorch显存越来越多的一个原因

optimizer.zero_grad()
loss.backward()
optimizer.step()
train_loss += loss

参考了别人的代码发现那句loss一般是这样写

loss_sum += loss.data[0]

这是因为输出的loss的数据类型是Variable。而PyTorch的动态图机制就是通过Variable来构建图。主要是使用Variable计算的时候,会记录下新产生的Variable的运算符号,在反向传播求导的时候进行使用。如果这里直接将loss加起来,系统会认为这里也是计算图的一部分,也就是说网络会一直延伸变大那么消耗的显存也就越来越大。

用Tensor计算要写成:

train_loss += loss.item()

correct_total += torch.eq(predict, label_batch).sum().item()
train_loss += loss.item()

当需要将模型中变量提取出来参与计算时,需要使用** .item()**

补充:linux下运行pytorch程序显示“killed”或者“已杀死”

这是由pytorch对于内存不足的反应,确切说,是Linux内核对pytorch程序占用太多内存的反应。Linux内核一旦因为内存资源不足而生气的时候,会使用OOM killer将占用内存最多的进程杀掉。

这种情况下,pytorch的python程序根本就来不及显示相关的内存日志,直接在呼喊出killed这一个简短有力的词语后,就game over了。如果不提前掌握这个背景的话,你可真是会手足无措啊。

既然我们确定了是内存不足导致的问题(dmesg也能明确的显示出kernel把占了近10个GB的python进程给kill了),

那我们的解决方案就有2个:

第一个是加大内存,将我的x99平台的内存从16GB增加到64GB;这个方案先放弃了,因为内存条涨价太猛,我买不起了;

第二个是增加swap分区,当然性能会降低,但不需要额外增加成本。所以Gemfield今天的选择就是第二个方案。

1、先禁止掉swap功能

sudo swapoff /swapfile

这个命令执行之后,如果你用free命令查看的话会发现swap分区的大小变为了0。

2、增加 /swapfile的大小

sudo dd if=/dev/zero of=/swapfile bs=1M count=30720 oflag=append conv=notrunc

这个命令会在现有的/swapfile后面追加30GB,加上之前的2GB的swap分区,现在共有32个GB的swap分区了。如果按照固态硬盘128GB有300多块钱来算的话,这个命令花了七八十块钱呢。

3、设置这个文件为swap分区的挂载点:

sudo mkswap /swapfile

4、再次启用swap

sudo swapon /swapfile

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • linux或windows环境下pytorch的安装与检查验证(解决runtimeerror问题)

    1.pytorch官网下载对应安装文件 https://pytorch.org/ 在getstarted处选择对应版本 方法一:直接使用对应的安装指令进行安装 但是其实这样比较容易断或者出现runtimeout的error.解决办法:使用pip先进行源的查找,在开始下载后停掉,然后找到屏幕上打印出来的链接,手动下载whl 然后手动安装. 方法二:选择相应版本的whl进行离线下载 找到下载链接 进行whl文件的下载然后安装 pytorch从链接安装指定版本 pip3 install whl pip

  • 解决pytorch GPU 计算过程中出现内存耗尽的问题

    Pytorch GPU运算过程中会出现:"cuda runtime error(2): out of memory"这样的错误.通常,这种错误是由于在循环中使用全局变量当做累加器,且累加梯度信息的缘故,用官方的说法就是:"accumulate history across your training loop".在默认情况下,开启梯度计算的Tensor变量是会在GPU保持他的历史数据的,所以在编程或者调试过程中应该尽力避免在循环中累加梯度信息. 下面举个栗子: 上代

  • 解决pytorch 保存模型遇到的问题

    今天用pytorch保存模型时遇到bug Can't pickle <class 'torch._C._VariableFunctions'> 在google上查找原因,发现是保存时保存了整个模型的原因,而模型中有一些自定义的参数 将 torch.save(model,save_path) 改为 torch.save(model.state_dict(),save_path) 然后载入模型也做相应的更改就好了 补充:pytorch训练模型的一些坑 1. 图像读取 opencv的python和c

  • 解决Pytorch内存溢出,Ubuntu进程killed的问题

    pytorch显存越来越多的一个原因 optimizer.zero_grad() loss.backward() optimizer.step() train_loss += loss 参考了别人的代码发现那句loss一般是这样写 loss_sum += loss.data[0] 这是因为输出的loss的数据类型是Variable.而PyTorch的动态图机制就是通过Variable来构建图.主要是使用Variable计算的时候,会记录下新产生的Variable的运算符号,在反向传播求导的时候进

  • linux解决Tomcat内存溢出的问题

    Tomcat本身不能直接在计算机上运行,需要依赖于操作系统和一个JAVA虚拟机.JAVA程序启动时JVM会分配一个初始内存和最大内存给程序.当程序需要的内存超出内存的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃. 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space 即JVM Heap溢出 解释说明:JVM在启动的时候会自动设置JVM Heap的值,JVM堆的设置是指java程序运行过程中JVM可以调配使用的

  • 解决vue内存溢出报错的问题

    目录 vue内存溢出报错 vue项目打包内存溢出问题踩坑 打包时一直报错 从网上搜的答案还是踩坑了 最终针对我的有效方案 vue内存溢出报错 '"node --max-old-space-size=10240"' 不是内部或外部命令,也不是可运行的程序或批处理文件.npm ERR! code ELIFECYCLEnpm ERR! errno 9009npm ERR! mscodevue@3.0.2 dev: `vue-cli-service serve`npm ERR! Exit st

  • 解决golang内存溢出的方法

    最近在项目中出现golang内存溢出的问题,master刚开始运行时只有10多M,运行几天后,竟然达到了10多个G.而且到凌晨流量变少内存也没有明显降低,内存状态呈现一种很不健康的曲线. 像这种情况肯定是golang内存溢出了,为此我持续排查了两天,终于找到问题所在,特此记录下. 准备工作 一台较好的环境测试机,单台运行无污染. 压测工具,无论服务是http还是websocket服务,都必须准备好压测工具模拟最真实的用户场景. 将master引入net/http/pprof包,通过http访问获

  • Java基础之堆内存溢出的解决

    一.实战-内存溢出 堆内存溢出 栈内存溢出 方法区溢出 直接内存溢出 二.实战-堆内存溢出 演示堆内存溢出代码,并且定位问题 总结堆内存溢出的场景与解决方案 分析商城项目中可能存在堆内存溢出的代码并且解决 三.堆内存溢出演示代码 public class HeapOOMTest { private List<String> oomList = new ArrayList<>(); public static void main(String[] args) { HeapOOMTes

  • MySQL OOM(内存溢出)的解决思路

    OOM全称"Out Of Memory",即内存溢出. 内存溢出已经是软件开发历史上存在了近40年的"老大难"问题.在操作系统上运行各种软件时,软件所需申请的内存远远超出了物理内存所承受的大小,就叫内存溢出. 内存溢出产生原因多种多样,当内存严重不足时,内核有两种选择: 直接panic 杀掉部分进程,释放一些内核. 大部分情况下,会杀掉导致OOM的进程,然后系统恢复.通常我们会添加对内存的监控报警,例如:当memory或swap使用超过90%时,触发报警通知,需要及

  • Java常见内存溢出异常分析与解决

    Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等,而Hotspot jvm的实现中,将堆内存分为了三部分,新生代,老年代,持久带,其中持久带实现了规范中规定的方法区,而内存模型中不同的部分都会出现相应的OutOfMemoryError错误,接下来我们就分开来讨论一下.java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因: JVM内存过小.程序不严密,产生了过多的垃圾. 导致OutOfMemor

  • 解决webpack多页面内存溢出的方法示例

    因为自己的项目是基于vue-cli3进行开发,所以这里只讨论这种情况下的解决办法 在进行多页面开发的时候,项目刚开始阶段,因为文件较少,所以代码编译速度还行,但是随着项目逐渐增大,webpack编译的速度越来越慢,并且经常出现内存溢出的情况. 下面就是几种尝试的方法,加快编译的速度 增加Node运行内存 在Node中通过JavaScript使用内存时只能使用部分内存(64位系统下约为1.4 GB,32位系统下约为0.7 GB).所以不管电脑实际的运行内存是多少,Node在运行代码编译的时候,使用

  • Tomcat内存溢出分析及解决方法

    JVM管理两种类型的内存,堆和非堆.堆是给开发人员用的上面说的就是,是在JVM启动时创建:非堆是留给JVM自己用的,用来存放类的信息的.它和堆不同,运行期内GC不会释放空间. 一.内存溢出类型 1.java.lang.OutOfMemoryError: PermGen space JVM管理两种类型的内存,堆和非堆.堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的.它和堆不同,运行期内GC不会释放空间.如果web app用了大量的第三方jar或者

随机推荐