当前位置: 首页 > 知识库问答 >
问题:

几个时代后的TensorFlow-GPU OOM问题

司马高韵
2023-03-14

我用tensorflow用Nvidia Geforce 1060(6G内存)训练CNN,但我得到了一个OOM例外。

训练过程在前两个阶段都很好,但在第三个阶段出现了OOM例外。

第二个月,第二个月,第七个月,第七个月,第七个月,第七个月,第七个月,第七个月,第三个月,第七个月,第七个月,第七个月,第二个月,第七个月,第二个月,第二个月,第二个月,第二个月,第二个月,第二个月,第三个月,第三个月,第三个月,第三个月,第三个月,第三个月,第三个月,第三个月,第三个月,第三个月,第三方,第三方,第三方,第三方,第三方,第三方,第三方,第三方,第三方,第三方,第三方,第三方,第三方,第三方,第三方,第三方,第三方,第三方,第三方,第三方,第三方,第三方,第三方.cc:1192]资源耗尽:分配带形状的张量时OOM[10,10,48,48,48,48]回溯(最后一次调用):文件“/anaconda3/lib/python3.6/sitepackages/tensorflow/python/client/session.py”,第1327行,在“调用返回fn(*args)文件“/anaconda3/lib/python3.6/site packages/tensorflow/python/client/session.py”中,第1306行,处于运行状态,运行元数据)文件“/anaconda3/lib/python3.6/contextlib”,第88行,退出下一个(self.gen)文件“/anaconda3/lib/python3.6/site packages/tensorflow/python/framework/errors\u impl.py”,第466行,在使用形状分配张量[10,10,48,48,48][[节点:渐变4/global/detector\u scope/maxpool\u conv3d\u 2/MaxPool3D\u grad/MaxPool3DGrad=MaxPool3DGrad[T=DT\u FLOAT,TInput=DT\u FLOAT,data\u format=“NDHWC”,ksize=[1,2,2,2,2,1],padding=“VALID=[1,2,2,2,1],\u device=“/job:localhost/replica:0/task:0/gpu:0”](全局/检测器范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大范围/最大池范围/最大范围/最大池范围/最大池范围/最大池范围/最大池范围/最大范围/最大池范围/最大范围/最大池范围/最大范围/最大池范围/最大范围/最大池范围/最大范围/最大范围/最大范围/最大范围/最大池范围/最大范围/最大池范围/最大范围/最大范围/最大范围/最大范围/最大范围/最大范围/最大范围/最大范围/最大范围/最大范围/最大范围/最大范围/,send_device_performation=1,tensor_name=“edge_1540_Momentum_4/update”,tensor_type=DT_FLOAT,_device=“/job:localhost/replica:0/task:0/cpu:0”]]

=============================

所以,我很困惑为什么我在第三个纪元处理完前两个纪元后得到了这个OOM异常。

假设每个历元的数据集都是相同的,如果GPU内存用完,第一个历元就会出现异常。但我确实成功地完成了两个时代。那么,为什么后来会发生这种情况呢?

有什么建议吗?

共有1个答案

强承望
2023-03-14

有两次您可能会看到OOM错误,当您第一次开始训练时,以及在至少一个历元完成之后。

第一种情况仅仅是由于模型的内存大小。为此,最简单的方法是减少批量大小。如果您的模型非常大,并且批处理大小现在降到了一个,那么您仍然有一些选择:减小隐藏层的大小,或者移动到具有足够GPU甚至仅CPU执行的云实例,以便静态分配内存。

对于第二种情况,您可能会遇到某种内存泄漏。许多培训实现使用对保留数据集的回调来获得验证分数。这种执行,比如说如果被Keras调用,可能会占用GPU会话资源。如果不发布这些文件,这些文件就会堆积起来,并可能导致GPU实例在几个时期后报告OOM。其他人建议在验证会话中使用第二个GPU实例,但我认为更好的方法是使用更智能的验证回调会话处理(特别是在每个验证回调完成时释放GPU会话资源)

下面是说明回调问题的伪代码。此回调将导致OOM:

my_models_validation_score = tf.get_some_v_score

此回调不会导致OOM:

with tf.Session() as sess: 
    sess.run(get_some_v_score)

我邀请其他人帮助补充这一回应...

 类似资料:
  • 问题内容: 如何在几天,几小时,几周或几个月后迭代一个时间跨度? 就像是: 其中foo是一个函数,返回一个迭代器。我一直在研究日历模块,但是它仅适用于特定的一年或一个月,不适用于日期之间。 问题答案: 使用dateutil及其rrule实现,如下所示: 输出为 将“每月”替换为“每年”,“每月”,“每周”,“每天”,“每小时”,“半年”或“第二”。替换dtstart,直到您想要的任何datetim

  • 我目前正在创建一个程序,用户在其中输入一组特定的问题。并且程序必须在完全回答完所有问题后返回菜单。我该怎么做呢?

  • 我试图在缺货产品的单一产品页面上显示“缺货信息”。 我在 我得到以下错误: 注意:股票被错误地调用。不应直接访问产品属性。回溯:要求('wp-blog-header.php'),require_once('wp-包括/template-loader.php'),包括('/plugins/wooCommerce/模板/single-product.php'),wc_get_template_part

  • 我目前正在尝试用cubey地形制作一个基本游戏,类似于Minecraft classic。我的第一个问题: 如何在VBO中存储多维数据集列表,然后在更改该数据时重新生成该列表?我当前呈现的立方体如下所示: 我知道我需要使用和来修改VBO,但是如何存储多维数据集并在需要时删除它们?我应该使用ArrayList吗?另外,有人告诉我,我渲染立方体的方式是错误的,因为每个人都说我只渲染一个具有新坐标的立方

  • 如果我想为spring quartz使用cron触发器,quartz是使用java系统时间还是操作系统时间执行作业? 我计划有一个属性文件来保存我所有的cron触发器。如果有人去更改cron触发器以执行一个任务,那么quartz会自动接收文件中的更改吗?或者,如果这不是默认行为,我有没有办法告诉quartz如何执行此操作。 我最近一直在读spring批处理管理控制台。听起来像是一个很好的重新安排作

  • 这是错误: 回溯(最近调用最后):文件“C://users/anton/desktople/instabot/chrome instagram bot/main.py”,第8行,在my_driver.sign_in(username=username,password=password)文件“C:\users\anton\desktople\instabot\chrome instagram bo