tf.linspace在GPU上运行但需要CPU内存参数(急切执行)?

时间:2018-05-23 06:31:32

标签: tensorflow gpu

我正在尝试将模型转换为以急切执行的方式运行。但是,我遇到了一个奇怪的错误,即使当tf.linspace及其所有参数都放在GPU上时,仍然需要对cpu内存进行一些复制。特别考虑这个最小的例子:

import tensorflow as tf

tfe = tf.contrib.eager
tfe.enable_eager_execution(config=tf.ConfigProto(allow_soft_placement=True,
                                        log_device_placement=True), device_policy=tfe.DEVICE_PLACEMENT_WARN)

a = tf.constant(7.).gpu()
b = tf.constant(8.).gpu()
c = tf.constant(4).gpu()

with tf.device("/device:GPU:0"):
    print(a)
    print(tf.linspace(a,b,c))

这会发出以下警告:

  

2018-05-22 23:29:56.401000:W tensorflow / c / eager / c_api.cc:506]之前   计算LinSpace输入#0预计将开启   / job:localhost / replica:0 / task:0 / device:CPU:0但实际上是打开的   / job:localhost / replica:0 / task:0 / device:GPU:0(正在运行的操作   /工作:本地主机/副本:0 /任务:0 /设备:GPU:0)。这会触发副本   这可能是一个性能瓶颈。 2018-05-22 23:29:56.401275:W   tensorflow / c / eager / c_api.cc:506]在计算LinSpace输入#1之前   预计将在/ job:localhost / replica:0 / task:0 / device:CPU:0但是   实际上是on / job:localhost / replica:0 / task:0 / device:GPU:0(操作   在/ job上运行:localhost / replica:0 / task:0 / device:GPU:0)。这个   触发副本,这可能是性能瓶颈。 2018年5月22日   23:29:56.401534:W tensorflow / c / eager / c_api.cc:506]计算之前   LinSpace输入#2预计将开启   / job:localhost / replica:0 / task:0 / device:CPU:0但实际上是打开的   / job:localhost / replica:0 / task:0 / device:GPU:0(正在运行的操作   /工作:本地主机/副本:0 /任务:0 /设备:GPU:0)。这会触发副本   这可能是一个性能瓶颈。

我在python 2.7上运行tensorflow 1.8。

1 个答案:

答案 0 :(得分:1)

是的,tf.linspace确实需要主机(即CPU)内存中的所有参数(理论上,这可能会在未来的TensorFlow版本中发生变化,但目前还没有)。这不是急切执行的特征 - 对于图形执行也是如此。在这两种情况下,如果输入张量在GPU内存中,那么它们将被复制到主机内存中。

每个原始TensorFlow操作都有一个“内核”实现,可以执行它可以执行的每个设备。似乎GPU kernel for the LinSpace operation实际上并没有使用GPU。

这是linspace操作的一些怪癖。

希望有所帮助。