我正在尝试将模型转换为以急切执行的方式运行。但是,我遇到了一个奇怪的错误,即使当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。
答案 0 :(得分:1)
是的,tf.linspace
确实需要主机(即CPU)内存中的所有参数(理论上,这可能会在未来的TensorFlow版本中发生变化,但目前还没有)。这不是急切执行的特征 - 对于图形执行也是如此。在这两种情况下,如果输入张量在GPU内存中,那么它们将被复制到主机内存中。
每个原始TensorFlow操作都有一个“内核”实现,可以执行它可以执行的每个设备。似乎GPU kernel for the LinSpace
operation实际上并没有使用GPU。
这是linspace操作的一些怪癖。
希望有所帮助。