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

在模型执行后清除Tensorflow GPU内存

谭京
2023-03-14

我已经训练了3个模型,现在正在运行代码,按顺序加载3个检查点中的每一个,并使用它们运行预测。我在用GPU。

当加载第一个模型时,它会预先分配整个GPU内存(我希望用于处理第一批数据)。但它不会在完成时卸载内存。加载第二个模型时,使用tf。使用tf重置默认图形()。Graph()。作为_default()第一个型号的GPU内存仍然被完全消耗,第二个型号的内存不足。

除了使用Python子进程或多重处理来解决这个问题(这是我通过谷歌搜索找到的唯一解决方案),还有其他方法可以解决这个问题吗?

共有3个答案

山阳辉
2023-03-14

我使用numba来释放GPU。使用TensorFlow,我找不到有效的方法。

import tensorflow as tf
from numba import cuda

a = tf.constant([1.0,2.0,3.0],shape=[3],name='a')
b = tf.constant([1.0,2.0,3.0],shape=[3],name='b')
with tf.device('/gpu:1'):
    c = a+b

TF_CONFIG = tf.ConfigProto(
gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=0.1),
  allow_soft_placement=True)

sess = tf.Session(config=TF_CONFIG)
sess.run(tf.global_variables_initializer())
i=1
while(i<1000):
        i=i+1
        print(sess.run(c))

sess.close() # if don't use numba,the gpu can't be released
cuda.select_device(1)
cuda.close()
with tf.device('/gpu:1'):
    c = a+b

TF_CONFIG = tf.ConfigProto(
gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=0.5),
  allow_soft_placement=True)

sess = tf.Session(config=TF_CONFIG)

sess.run(tf.global_variables_initializer())
while(1):
        print(sess.run(c))
国跃
2023-03-14

你可以使用Numba库释放所有的gpu内存

pip install numba 
from numba import cuda 
device = cuda.get_current_device()
device.reset()

这将释放所有内存

濮阳钟展
2023-03-14

2016年6月发行的git(https://github.com/tensorflow/tensorflow/issues/1727)表示存在以下问题:

目前,GPUDevice中的Allocator属于ProcessState,它本质上是一个全局单例。使用GPU的第一个会话初始化它,并在进程关闭时释放自己。

因此,唯一的解决办法是使用进程并在计算后关闭它们。

示例代码:

import tensorflow as tf
import multiprocessing
import numpy as np

def run_tensorflow():

    n_input = 10000
    n_classes = 1000

    # Create model
    def multilayer_perceptron(x, weight):
        # Hidden layer with RELU activation
        layer_1 = tf.matmul(x, weight)
        return layer_1

    # Store layers weight & bias
    weights = tf.Variable(tf.random_normal([n_input, n_classes]))


    x = tf.placeholder("float", [None, n_input])
    y = tf.placeholder("float", [None, n_classes])
    pred = multilayer_perceptron(x, weights)

    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
    optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)

    init = tf.global_variables_initializer()

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

        for i in range(100):
            batch_x = np.random.rand(10, 10000)
            batch_y = np.random.rand(10, 1000)
            sess.run([optimizer, cost], feed_dict={x: batch_x, y: batch_y})

    print "finished doing stuff with tensorflow!"


if __name__ == "__main__":

    # option 1: execute code with extra process
    p = multiprocessing.Process(target=run_tensorflow)
    p.start()
    p.join()

    # wait until user presses enter key
    raw_input()

    # option 2: just execute the function
    run_tensorflow()

    # wait until user presses enter key
    raw_input()

因此,如果在您创建的进程内调用函数run\u tensorflow(),并关闭该进程(选项1),内存将被释放。如果只运行run\u tensorflow()(选项2),则函数调用后不会释放内存。

 类似资料:
  • 问题内容: 我已经训练了3个模型,现在正在运行代码,依次加载3个检查点中的每一个并使用它们运行预测。我正在使用GPU。 加载第一个模型时,它会预先分配整个GPU内存(我希望通过它来处理第一批数据)。但是它不会在完成时卸载内存。当第二模型被加载,同时使用和GPU存储器仍从第一模型完全消耗,并且所述第二模型然后饥饿的存储器。 除了使用Python子进程或多进程来解决该问题(我通过Google搜索找到的

  • 4. 执行模型 4.1. 命名和绑定 名称是对象的引用。名称通过名称绑定操作引入。程序文本中名称的每一次出现都会引用名称的绑定,这种绑定在包含名称使用的最内层函数块中建立。 块是Python 程序文本的一个片段,作为一个单元执行。下面这些都是块:模块、函数体、类定义。交互式敲入的每一个命令都是块。一个脚本文件(作为解释器标准输入的文件或者在解释器的命令行中指定的第一个参数)是一个代码块。一个脚本命

  • 我的项目遇到了一些内存问题,所以我决定对一些部分进行压力测试,以查看一些性能度量。我正在使用Google的ConcurrentLinkedHashMap库作为LRU内存缓存。我的测试代码的相关部分如下所示: 当内存超过50%时,我将throttle(油门)标志设置为true(真)。我有一个监视线程,它每2秒进行一次测量。以下是我得到的数字: 由于某种原因,我没有看到LRU缓存的

  • 问题内容: 晚上好,我想知道如何清除写入到PrintWriter的数据,即是否可以在打印后从PrintWriter删除数据? 在此servlet中,我在响应中打印一些文本,并在#表示的行上希望删除所有先前打印的数据并打印新内容: 注意:我尝试过out.flush(),但旧的打印文本仍然保留 问题答案: 创建一个内存使用。您可以从获取底层缓冲区,并在需要时清除它。

  • Laravel项目在我的开发服务器(安全的https)中运行时没有任何问题。在我的新版本中,没有加载. env文件中的新配置。然后我在StackOverflow中找到了一些解决方案,上面说要清除Laravel配置和缓存。所以我运行以下命令, 使用上述命令清除缓存后,它无法正确加载样式表和js文件,并表示“混合内容:页面在”通过HTTPS加载,但请求不安全的脚本”。此请求已被阻止;内容必须通过HTT

  • 在运行flutter clean之后得到了这个异常,在clean之前它是工作的,但是在clean之后它显示了这个异常。 扑动博士-V [√]Flutter(通道稳定,1.22.5,在Microsoft Windows上[版本10.0.19041.685],现场进入)•Flutter版本1.22.5,在C:\flutterSDK\Flutter•框架修订版7891006299(4周前)2020-12