tf.Variable可以固定到GPU吗?

时间:2018-01-25 02:54:05

标签: tensorflow gpu

我的代码:

import tensorflow as tf

def main():
    with tf.device('/gpu:0'):
        a = tf.Variable(1)
        init_a = tf.global_variables_initializer()

        with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
           sess.run(init_a)

if __name__ == '__main__':
    main()

错误:

  

InvalidArgumentError(请参阅上面的回溯):无法分配设备   for operation' Variable':无法满足显式设备   规范' /设备:GPU:0'因为没有支持GPU的内核   设备可用。

这是否意味着不能将Variable固定到GPU上?

this是另一个与此主题相关的主题。

2 个答案:

答案 0 :(得分:3)

在GPU上全面支持

int32类型(截至2018年1月)。我相信完整的错误会说:

InvalidArgumentError (see above for traceback): Cannot assign a device for operation 'Variable': Could not satisfy explicit device specification '/device:GPU:0' because no supported kernel for GPU devices is available.
Colocation Debug Info:
Colocation group had the following types and devices: 
Assign: CPU 
Identity: CPU 
VariableV2: CPU 
         [[Node: Variable = VariableV2[container="", dtype=DT_INT32, shape=[], shared_name="", _device="/device:GPU:0"]()]]

DT_INT32会导致您遇到麻烦,因为您明确要求将变量放在GPU上,但没有GPU内核用于相应的操作和dtype。

如果这只是一个测试程序,实际上你需要另一种类型的变量,比如float32,你应该没问题。例如:

import tensorflow as tf

with tf.device('/gpu:0'):
  # Providing 1. instead of 1 as the initial value will result
  # in a float32 variable. Alternatively, you could explicitly
  # provide the dtype argument to tf.Variable()
  a = tf.Variable(1.)
  init_a = tf.global_variables_initializer()

  with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
    sess.run(init_a)

或者,您可以选择在CPU上显式放置int32变量,或者根本不指定任何设备,让TensorFlow的设备放置在适当的位置选择GPU。例如:

import tensorflow as tf

v_int = tf.Variable(1, name='intvar')
v_float = tf.Variable(1., name='floatvar')
init = tf.global_variables_initializer()

with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
  sess.run(init)

这将显示'intvar'放在CPU上,而'floatvar'在GPU上使用一些日志行,如:

floatvar: (VariableV2)/job:localhost/replica:0/task:0/device:GPU:0
intvar: (VariableV2)/job:localhost/replica:0/task:0/device:CPU:0

希望有所帮助。

答案 1 :(得分:1)

这意味着Tensorflow无法找到您指定的设备。

我假设您要指定您的代码在GPU 0上执行。

正确的语法是:

with tf.device('/device:GPU:0'):

您正在使用的缩写仅允许用于CPU。

您也可以在此处查看此答案:How to get current available GPUs in tensorflow?
它显示了如何列出TF识别的GPU设备。

这列出了语法:https://www.tensorflow.org/tutorials/using_gpu