当前位置: 首页 > 编程笔记 >

解决TensorFlow训练内存不断增长,进程被杀死问题

段干安和
2023-03-14
本文向大家介绍解决TensorFlow训练内存不断增长,进程被杀死问题,包括了解决TensorFlow训练内存不断增长,进程被杀死问题的使用技巧和注意事项,需要的朋友参考一下

TensorFlow训练时,遇到内存不断增长,最终导致内存不足,进程被杀死。

在这里我不准备对造成这一现象的所有原因进行探讨,只是记录一下我在项目中遇到的这一问题,下面将对我遇到的内存不断增长的原因进行分析。

在TensorFlow中构造图,是将一些op作为节点加入图中,在run之前,是需要构造好一个图的,所以在run的时候,如果run图中不存在的节点,TensorFlow就会将节点加入图中,随着不断的迭代,造成内存不断的增长,从而导致内存不足。

下面举一个很容易发现这个问题的例子:

import tensorflow as tf
x = tf.Variable(tf.constant(1))
y = tf.constant(2)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
while True:
 print(sess.run(x+y))

在上面的例子中,x,y是图中的两个节点,在while循环中run(x)或者run(y)都是不存在问题的,但是上例中我们使用的时run(x+y),而在TensorFlow的图中是不存在x+y这个节点的,所以在run的时候,图中会不断的创建该节点,最终导致了内存不足。这个例子很容易理解,这样的问题也很容易发现。

下面,将举一个不是那么容易发现的问题:

import tensorflow as tf
test = tf.get_variable('test', shape=[4, 1], initializer=tf.random_normal_initializer(stddev=0.1))
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
 sess.run(init_op)
 print(sess.run(test[0]))

这个例子是创建一个shape为[4,1]的变量对象,test为图中的一个节点,但是在我们实际使用时,我们可能并不需要test里的所有数据,加入只需要一个数据test[0],当我们使用run(test[0])时,test[0]并不是图中的节点,该节点就会在图中创建。上面的例子并没有使用循环,所以增加了节点,但是也不会造成内存的不足,当使用了循环时,就需要注意了。

解决办法:run图中存在的节点,对返回的结果进行处理,得到想要的结果,不要在run里面对节点处理(处理后的节点可能不是图中的节点)。

以上这篇解决TensorFlow训练内存不断增长,进程被杀死问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍解决tensorflow训练时内存持续增加并占满的问题,包括了解决tensorflow训练时内存持续增加并占满的问题的使用技巧和注意事项,需要的朋友参考一下 记录一次小白的tensorflow学习过程,也为有同样困扰的小白留下点经验。 先说我出错和解决的过程。在做风格迁移实验时,使用预加载权重的VGG19网络正向提取中间层结果,结果因为代码不当,在遍历图片提取时内存持续增长,导致提取

  • 本文向大家介绍tensorflow训练中出现nan问题的解决,包括了tensorflow训练中出现nan问题的解决的使用技巧和注意事项,需要的朋友参考一下 深度学习中对于网络的训练是参数更新的过程,需要注意一种情况就是输入数据未做归一化时,如果前向传播结果已经是[0,0,0,1,0,0,0,0]这种形式,而真实结果是[1,0,0,0,0,0,0,0,0],此时由于得出的结论不惧有概率性,而是错误的

  • 本文向大家介绍解决Tensorflow 内存泄露问题,包括了解决Tensorflow 内存泄露问题的使用技巧和注意事项,需要的朋友参考一下 使用tensorflow进行编程时,经常遇到操作不当,带来的内存泄露问题,这里有一个可以帮助debug问题所在方法: https://stackoverflow.com/questions/51175837/tensorflow-runs-out-of-mem

  • 问题是,那些块是什么?哪个子系统分配这些? 更新:我们不使用JIT和/或JNI本机代码调用。

  • 问题内容: 我正在使用child_process.spawn()从在Ubuntu上运行的Node.JS应用程序启动脚本。据我所知,标准的分叉或生成的* nix进程通常不会在父进程死后死亡,但是当从Node.JS生成进程时,它们似乎在我的应用程序崩溃或被ctrl-c等终止时被杀死。 。 为什么会这样,并且有解决办法?我似乎在child_process API中找不到任何明显的选项。 我的应用程序启动

  • 问题内容: 我从python脚本生成了5个不同的进程,如下所示: 我的问题是,当父进程(主脚本)以某种方式被杀死时,子进程继续运行。 当父进程被杀死时,有没有办法杀死这样生成的子进程? 编辑:我正在尝试: 但这似乎不起作用 问题答案: 我自己也遇到了同样的问题,我有以下解决方案: 打电话之前,您可以设置。然后如此处所述python.org multiprocessing 进程退出时,它将尝试终止其