python – Tensorflow“知道”何时不将数据放入GPU中?

我尝试使用tensorboard和ten​​sorflow,我做了这个设置:

rand = tf.placeholder(dtype=tf.float32)    # this will be visualised in tensorboard later on 
tf.summary.image('random_noise_visualisation', rand,max_outputs=5)
merged_summary_op = tf.summary.merge_all() # to me this seems like a helper to 
                                           # merge all tensorboard related operations

然后我评估我的merged_summary_op并为它提供一个非常大的数组,大小约为1 GB.

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

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

random_value = np.random.randn(3000,224,224,1)
sess.run(rand,Feed_dict={rand:random_value})

再次,没有额外的GPU利用率.

但是,当我这样做的时候

sess.run(rand + 2 ,Feed_dict={rand:random_value}) # forced to do some calculation

GPU利用率增加,增加约1 GB.

对于上述所有实验,我使用的会话为:

sess = tf.InteractiveSession(graph=tf.Graph())

我的问题是:

> Tensorflow知道何时不打算将Tensor发送到GPU?
>从交互式会话更改为正常会话会影响此行为吗?
>这有什么特别的文件吗?

解决方法:

Does Tensorflow kNow when to not bother to send a Tensor to the GPU ?

是.

事实上,在你的第一个rand实验中,tensorflow发现不打扰任何设备,因为提供的提取rand已经在Feed_dict中.这个相当简单的优化可以在session.py中看到:

self._final_fetches = [x for x in self._fetches if x not in Feeds]

……和later on in the same file

# We only want to really perform the run if fetches or targets are provided,
# or if the call is a partial run that specifies Feeds.
if final_fetches or final_targets or (handle and Feed_dict_tensor):
  results = self._do_run(handle, final_targets, final_fetches,
                         Feed_dict_tensor, options, run_Metadata)
else:
  results = []

第二个实验不属于此优化,因此图表是真正的评估. Tensorflow将占位符固定到可用的GPU上,因此也增加了GPU的使用率.

如果使用log_device_placement = True运行会话,则可以生动地看到这一点:

with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
  random_value = np.random.randn(300,224,224,1)
  print(sess.run(rand + 2, Feed_dict={rand: random_value}).shape)

就图像摘要操作而言,它确实很特别:ImageSummary op没有GPU实现.这是源代码(core/kernels/summary_image_op.cc):

REGISTER_KERNEL_BUILDER(Name("ImageSummary").Device(DEVICE_cpu),
                        SummaryImageOp);

因此,如果您尝试手动将其放置到cpu,session.run()将抛出错误

# THIS FAILS!
with tf.device('/gpu:0'):
  tf.summary.image('random_noise_visualisation', rand,max_outputs=5)
  merged_summary_op = tf.summary.merge_all() # to me this seems like a helper to
                                             # merge all tensorboard related operations

这似乎是合理的,因为摘要操作不执行任何复杂的计算,并且主要处理磁盘I / O.

ImageSummary不是唯一的cpu操作,例如,所有摘要操作都是.有一个related GitHub issue,但目前没有更好的方法来检查GPU是否支持特定的操作,其他检查源代码.

通常,tensorflow尝试尽可能多地利用可用资源,因此当GPU布局成为可能且没有其他限制适用时,引擎倾向于选择GPU而不是cpu.

Will changing from Interactive session to a normal session affect this behavIoUr ?

否.InteractiveSession不会影响设备放置逻辑.唯一的区别在于InteractiveSession在创建时使自己成为认会话,而Session认只在with block中.

Is there any particular documentation for this ?

我害怕在这里犯错,但可能不会.对我来说,最好的事实来源是源代码.

相关文章

MNIST数据集可以说是深度学习的入门,但是使用模型预测单张M...
1、新建tensorflow环境(1)打开anacondaprompt,输入命令行...
这篇文章主要介绍“张量tensor是什么”,在日常操作中,相信...
tensorflow中model.fit()用法model.fit()方法用于执行训练过...
https://blog.csdn.net/To_be_little/article/details/12443...
根据身高推测体重const$=require('jquery');const...