Python “Tensorflow”吗;“知道”;何时不将数据放入GPU?

Python “Tensorflow”吗;“知道”;何时不将数据放入GPU?,python,optimization,tensorflow,gpu,tensorboard,Python,Optimization,Tensorflow,Gpu,Tensorboard,我试着将tensorboard与tensorflow一起使用,作为一种设置: rand=tf.placeholder(dtype=tf.float32)#这将在稍后的tensorboard中可视化 tf.summary.image(“随机噪声可视化”,随机,最大输出=5) merged_summary_op=tf.summary.merge_all()#对我来说,这似乎是一个帮助 #合并所有与张力板相关的操作 然后我评估我的合并的\u summary\u op,并为它提供一个非常大的数组,大小

我试着将tensorboard与tensorflow一起使用,作为一种设置:

rand=tf.placeholder(dtype=tf.float32)#这将在稍后的tensorboard中可视化
tf.summary.image(“随机噪声可视化”,随机,最大输出=5)
merged_summary_op=tf.summary.merge_all()#对我来说,这似乎是一个帮助
#合并所有与张力板相关的操作
然后我评估我的
合并的\u summary\u op
,并为它提供一个非常大的数组,大小约为1GB

它似乎没有使用已经使用的内存中的任何额外GPU内存

我还试着评估我的
rand
占位符,认为可能摘要操作有特殊的处理方法来防止数据进入GPU。我做到了:

random_value=np.random.randn(30002224,1)
run(rand,feed_dict={rand:random_value})
同样,没有额外的GPU使用

然而,当我

sess.run(rand+2,feed_dict={rand:random_value})#被迫进行一些计算
还有一个额外的GPU利用率,增加了约1GB

对于上述所有实验,我将我的课程用作:

sess=tf.InteractiveSession(graph=tf.graph()) 我的问题是:

  • Tensorflow知道什么时候不用麻烦向GPU发送张量吗
  • 从交互式会话更改为正常会话是否会影响此行为
  • 这方面有什么特别的文件吗
Tensorflow知道什么时候不用麻烦向GPU发送张量吗

事实上,在您的第一次
rand
实验中,tensorflow发现不会打扰任何设备,因为提供的fetch
rand
已经在
feed\u dict
中。这种相当简单的优化可以在以下内容中看到:

self.\u final\u fetches=[x代表self中的x.\u如果x不在提要中,则获取]
。。。以及:

#我们只希望在提供获取或目标时真正执行运行,
#或者如果调用是指定提要的部分运行。
如果final_获取或final_目标或(句柄和馈送dict_张量):
结果=自运行(句柄、最终目标、最终获取、,
feed_dict_tensor、options、run_元数据)
其他:
结果=[]

第二个实验不属于这种优化,因此对图形进行了真正的评估。Tensorflow将占位符固定到可用的GPU上,因此也添加了占位符,这解释了GPU的利用率

如果使用
log\u device\u placement=True运行会话,则可以清楚地看到这一点:

将tf.Session(config=tf.ConfigProto(log\u device\u placement=True))作为sess:
随机_值=np.random.randn(300224,1)
打印(sess.run(rand+2,feed_dict={rand:random_value}).shape)

就图像摘要op而言,它确实很特别:
ImageSummary
op没有GPU实现。以下是源代码():

注册内核构建器(名称(“ImageSummary”).Device(设备CPU),
总结图像);
因此,如果您尝试手动将其放置到CPU,
session.run()
将抛出一个错误:

#这失败了!
使用tf.device('/gpu:0'):
tf.summary.image(“随机噪声可视化”,随机,最大输出=5)
merged_summary_op=tf.summary.merge_all()#对我来说,这似乎是一个帮助
#合并所有与张力板相关的操作
这似乎是合理的,因为摘要操作不执行任何复杂的计算,主要处理磁盘I/O

ImageSummary
不是唯一的CPU操作,例如,所有的摘要操作都是。有一种方法,但是目前没有更好的方法来检查GPU中是否支持某个特定的操作,除了检查源代码

一般来说,tensorflow试图尽可能多地利用可用资源,因此当GPU的位置是可能的并且没有其他限制时,引擎倾向于选择GPU而不是CPU

从交互式会话更改为正常会话是否会影响此行为

否。
交互会话
不影响设备放置逻辑。唯一的区别是,
InteractiveSession
在创建时使自己成为默认会话,而
session
仅在
with
块中是默认会话

这方面有什么特别的文件吗

我恐怕在这里是错的,但可能不会。对我来说,最好的真相来源是源代码