【发布时间】:2016-04-12 09:48:37
【问题描述】:
我正在尝试运行 retrain.py 脚本(可在此处获得:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/image_retraining/retrain.py)。我注意到以第 747 行开头的部分是在 CPU 上执行的,而默认应该是 GPU。因此,我添加了以下行来强制它在 GPU 上工作:
`with tf.device("/gpu:0"):
(train_step, cross_entropy, bottleneck_input, ground_truth_input, final_tensor) = add_final_training_ops(len(image_lists.keys()),
FLAGS.final_tensor_name,
bottleneck_tensor)`
它会导致以下错误:
'tensorflow.python.framework.errors.InvalidArgumentError: Cannot assign a device to node 'gradients/Mean_grad/Prod': Could not satisfy explicit device specification '/device:GPU:0' because no supported kernel for GPU devices is available
[[Node: gradients/Mean_grad/Prod = Prod[T=DT_INT32, keep_dims=false, _device="/device:GPU:0"](gradients/Mean_grad/Shape_2, gradients/Mean_grad/range_1)]]
Caused by op u'gradients/Mean_grad/Prod', defined at:
File "retrain_tensorboard_pickle_mean.py", line 921, in <module>
tf.app.run()
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/platform/app.py", line 30, in run
sys.exit(main(sys.argv))
File "retrain_tensorboard_pickle_mean.py", line 839, in main
(train_step, cross_entropy, bottleneck_input, ground_truth_input, label_ground_truth_input, final_tensor) = add_final_training_ops(len(image_lists.keys()), FLAGS.final_tensor_name, bottleneck_tensor)
File "retrain_tensorboard_pickle_mean.py", line 686, in add_final_training_ops
cross_entropy_mean)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py", line 190, in minimize
colocate_gradients_with_ops=colocate_gradients_with_ops)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py", line 241, in compute_gradients
colocate_gradients_with_ops=colocate_gradients_with_ops)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gradients.py", line 481, in gradients
in_grads = _AsList(grad_fn(op, *out_grads))
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/math_grad.py", line 91, in _MeanGrad
factor = (math_ops.reduce_prod(input_shape) //
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/math_ops.py", line 810, in reduce_prod
keep_dims, name=name)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_math_ops.py", line 1115, in _prod
keep_dims=keep_dims, name=name)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/op_def_library.py", line 655, in apply_op
op_def=op_def)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2146, in create_op
original_op=self._default_original_op, op_def=op_def)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1154, in __init__
self._traceback = _extract_stack()
...which was originally created as op u'Mean', defined at:
File "retrain_tensorboard_pickle_mean.py", line 921, in <module>
tf.app.run()
[elided 1 identical lines from previous traceback]
File "retrain_tensorboard_pickle_mean.py", line 839, in main
(train_step, cross_entropy, bottleneck_input, ground_truth_input, label_ground_truth_input, final_tensor) = add_final_training_ops(len(image_lists.keys()), FLAGS.final_tensor_name, bottleneck_tensor)
File "retrain_tensorboard_pickle_mean.py", line 681, in add_final_training_ops
cross_entropy_mean = tf.reduce_mean(cross_entropy)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/math_ops.py", line 783, in reduce_mean
keep_dims, name=name)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_math_ops.py", line 973, in _mean
keep_dims=keep_dims, name=name)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/op_def_library.py", line 655, in apply_op
op_def=op_def)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2146, in create_op
original_op=self._default_original_op, op_def=op_def)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1154, in __init__
self._traceback = _extract_stack()
我发现here 可能是一个问题,mean 没有在 GPU 上实现,但另一方面,github 上有一个 commit 修复了 GPU 上的计数平均值。
上一部分,例如生成瓶颈(第 744 行)在 GPU 上完美运行,甚至不需要强制它。
如果有任何帮助,我将不胜感激!
贾斯蒂娜
【问题讨论】:
-
最近添加了平均 GPU 实现,也许您使用的是旧版本?
-
嗯,我们有昨天的主版本,其中包含有关 reduction_ops_mean 的所有提交。所以,这真的很奇怪......所以你说,它不应该提供最新版本的 tensorflow 的任何错误?我还尝试将方法 reduce_mean 的使用替换为手动计数平均值,因此计算 reduce_sum 并将其除以张量元素的数量。这样在 GPU 上强制工作时没有错误,但我仍然看到 GPU 的使用率为 0%。
-
抱歉,我已经尝试过了,看起来 MeanGrad/Prod 似乎也没有为我放置在 GPU 上,看起来
-
所以带有整数输入的 Prod 没有为 GPU 注册。这似乎是一个遗漏,因为带有浮点输入的 Prod 已注册。提出问题github.com/tensorflow/tensorflow/issues/1919
-
好的,感谢您在此问题上添加问题!
标签: gpu tensorflow