(原)tensorflow中函数执行完毕,显存不自动释放

转载请注明出处:

http://www.cnblogs.com/darkknightzh/p/7608916.html

参考网址:

https://stackoverflow.com/questions/39758094/clearing-tensorflow-gpu-memory-after-model-execution

https://github.com/tensorflow/tensorflow/issues/1727#issuecomment-285815312s

tensorflow中,在一个函数内配置完GPU,tf分配了显存,等函数执行完,显存不会释放(貌似torch7中也一样。。。)。第二个参考网址指出:

As for the original problem, currently the Allocator in the GPUDevice belongs to the ProcessState, which is essentially a global singleton. The first session using GPU initializes it, and frees itself when the process shuts down. Even if a second session chooses a different GPUOptions, it would not take effect.

第一个session对GPU初始化后,即便释放了显存,第二个sess使用不同的GPU选项来初始化GPU,也不会起效。

第一个网址Oli Blum指出,use processes and shut them down after the computation才能释放显存。具体代码如下(可以参考第一个网址):

 1 import tensorflow as tf
 2 import multiprocessing
 3 import numpy as np
 4
 5 def run_tensorflow():
 6
 7     n_input = 10000
 8     n_classes = 1000
 9
10     # Create model
11     def multilayer_perceptron(x, weight):
12         # Hidden layer with RELU activation
13         layer_1 = tf.matmul(x, weight)
14         return layer_1
15
16     # Store layers weight & bias
17     weights = tf.Variable(tf.random_normal([n_input, n_classes]))
18
19
20     x = tf.placeholder("float", [None, n_input])
21     y = tf.placeholder("float", [None, n_classes])
22     pred = multilayer_perceptron(x, weights)
23
24     cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
25     optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)
26
27     init = tf.global_variables_initializer()
28
29     with tf.Session() as sess:
30         sess.run(init)
31
32         for i in range(100):
33             batch_x = np.random.rand(10, 10000)
34             batch_y = np.random.rand(10, 1000)
35             sess.run([optimizer, cost], feed_dict={x: batch_x, y: batch_y})
36
37     print "finished doing stuff with tensorflow!"
38
39
40 if __name__ == "__main__":
41
42     # option 1: execute code with extra process
43     p = multiprocessing.Process(target=run_tensorflow)
44     p.start()
45     p.join()
46
47     # wait until user presses enter key
48     raw_input()
49
50     # option 2: just execute the function
51     run_tensorflow()
52
53     # wait until user presses enter key
54     raw_input()

使用multiprocessing.Process运行run_tensorflow后,显存会自动释放,但是如果直接执行run_tensorflow,显存不会自动释放。当然,该函数计算量较小,如果显卡太好,可能看不到运行multiprocessing.Process后,显存分配、计算并释放的过程,感觉就像没有运行一样。。。

时间: 2024-10-29 19:11:40

(原)tensorflow中函数执行完毕,显存不自动释放的相关文章

iOS 怎么在一个函数执行完毕得到某个参数值后再去执行他下边的代码

最近项目中牵扯OC与H5交互, 其中有一个问题是H5加载相册的照片,方法大体是: 和后台制定好协议, 在请求中拦截这个协议, 之后传递一个相对地址给H5来加载本地图片. 交互时, H5调用OC注册的方法, 回调OC传递过来的照片的相对地址以便加载手机照片. 这里出现问题了, 要做到H5同步加载手机的图片,并不容易, 因为调用OC注册的方法时, 就要接着返回图片的相对地址, 来不及等用户操作, 就要返回地址. 所以要想办法执行完用户的操作, 得到相对路径之后再传递给H5, 这里就要先执行完用户的选

C++中函数模板,显式具体化,显式实例化:

函数模板 形如: template<typename T>  //没有分号 void func(T &a,T &b); 称为函数模板,其中,template和typename为关键字,typename可以用class来替代.T(可以用其他的名称)表示一种泛型,既可以表示int型,也可以表示double或其他类型,将它想象成C++里面的数据类型的集合. 也就是说: void func(T &a,T &b)= void func(int &a,int &am

main 主函数执行完毕后,是否可能会再执行一段代码?(转载)

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon

关于显卡的显存

显存,也被叫做帧缓存,它的作用是用来存储显卡芯片处理过或者即将提取的渲染数据.如同计算机的内存一样,显存是用来存储要处理的图形信息的部件. 作用 显存 如同计算机的内存一样,显存是用来存储要处理的图形信息的部件.我们在显示屏上看到的画面是由一个个的像素点构成的,而每个像素点都以4至32甚至64位的数据来控制它的亮度和色彩,这些数据必须通过显存来保存,再交由显示芯片和CPU调配,最后把运算结果转化为图形输出到显示器上.显存和主板内存一样,执行存贮的功能,但它存贮的对像是显卡输出到显示器上的每个像素

[Pytorch]深度模型的显存计算以及优化

原文链接:https://oldpan.me/archives/how-to-calculate-gpu-memory 前言 亲,显存炸了,你的显卡快冒烟了! torch.FatalError: cuda runtime error (2) : out of memory at /opt/conda/conda-bld/pytorch_1524590031827/work/aten/src/THC/generic/THCStorage.cu:58 想必这是所有炼丹师们最不想看到的错误,没有之一.

如何理解javaSript中函数的参数是按值传递

本文是我基于红宝书<Javascript高级程序设计>中的第四章,4.1.3传递参数小节P70,进一步理解javaSript中函数的参数,当传递的参数是对象时的传递方式. (结合资料的个人理解,有不正确的地方,希望大家指出,谢谢啦!) 参考的资料有: https://github.com/simongong/js-stackoverflow-highest-votes/blob/master/questions21-30/parameter-passed-by-value-or-referen

php中函数的实参和形参

php中函数的实参和形参严格一一对应.例子: <?php function test($a,$b=2,$c){  //函数test第二个参数给默认值 $result=3*$a+2*$b+$c; return $result; } echo test(3,4,5);//调用正确,结果为22 echo test(3,,5);  //错误,没有给第二个形参传值,即使第二个形参有默认参数也不能绕过他而给第三个参数传值 echo test(3,4);//错误,没有给第三个参数传值 总结:函数中的形参带默认

深入理解卷积与模型大小问题,解决显存不足

在训练自己的模型时常常出现显存不足等问题,这个时候我们常用的方法就是调参.一般常用的方法有以下几点: 模型压缩网络参数调整, 比如减小训练图像大小,降低FC output个数,使用小的conv kernel size等.深度学习框架调整减层但是对于既定网络,我们减小训练图像大小或者改变batchsize大小都会影响模型的性能,这点在目标检测和语义分割中反应比较明显.那么我们要做的是在不改变网络性能的情况下,尽量的压缩模型,空出足够的显存进行GPU加速. GPU基础知识我们利用gpustat工具包

tensorflow中使用指定的GPU及GPU显存

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本文目录 1 终端执行程序时设置使用的GPU 2 python代码中设置使用的GPU 3 设置tensorflow使用的显存大小 3.1 定量设置显存 3.2 按需设置显存 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6591923.html 参考网址: http://stackoverflo