GPU 上 TensorFlow 的输入管道

数据挖掘 张量流 显卡
2021-10-10 13:36:11

tensorflow示例 CIFAR10使用输入管道将数据从磁盘加载到队列。我想为我自己的模型实现这个,但我遇到了一个我无法以某种方式修复的错误。我的最小示例如下所示(取自教程:https ://www.tensorflow.org/programmers_guide/reading_data ):

def read_sample_of_csv(filename_queue):

   # Define Reader
   reader = tf.TextLineReader()
   key,value = reader.read(filename_queue)

   # Decode CSV
   record_defaults = [[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.]]
   col0, *col = tf.decode_csv(value, record_defaults=record_defaults)
   features = tf.stack([*col])
   reference = col0

   # Return
   return features, reference


def input_pipeline(filenames, batch_size, ...):
   # Reader for samples
   slipangle_filename_queue = tf.train.string_input_producer(filenames, shuffle=shuffle)
   features, reference = read_sample_of_csv(slipangle_filename_queue)

   # Batch samples
   capacity = min_after_dequeue + (num_threads+3) * batch_size
   feature_batch, reference_batch = tf.train.shuffle_batch([features,reference], batch_size=batch_size)

   # Return
   return feature_batch, reference_batch


with tf.device(MY_DEVICE):
   feature_batch, ref_batch = input_pipeline(filenames, batch_size, ...)

这基本上是 CIFAR10 中所做的,只是使用 csv。该脚本使用 MY_DEVICE = '/cpu:0' 运行,但是当我尝试使用 MY_DEVICE = '/gpu:0' 在 GPU 上运行它时,我收到以下错误

InvalidArgumentError (see above for traceback): Cannot assign a device to node 'shuffle_batch/random_shuffle_queue': 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: 
QueueEnqueue: CPU 
QueueSize: CPU 
QueueClose: CPU 
QueueDequeueMany: CPU 
RandomShuffleQueue: CPU 
[[Node: shuffle_batch/random_shuffle_queue = RandomShuffleQueue[capacity=1500, component_types=[DT_FLOAT, DT_FLOAT], container="", min_after_dequeue=1000, seed=0, seed2=0, shapes=[[9], []], shared_name="", _device="/device:GPU:0"]()]]

我不能在 GPU 上使用输入管道吗?这不是 CIFAR10 所做的吗?

1个回答

我的问题的解决方案:如果您运行 tensorflow 会话,您可以选择不同设备上的节点放置是硬编码还是软编码。在 CIFAR10 的具体情况下,这意味着:

  1. 队列被放置在 GPU 上,这就是弹出错误的原因,但是:

  2. 如果您打开软放置它可以工作。这意味着,即使无法将模型的多个部分放置在 GPU 上,Tensorflow 也会通过将它们放置在其他位置来自动解决这个问题

  3. 我实际上不知道节点的放置位置。我猜在CPU上,但我不确定。在张量板中,输入管道节点的颜色声称在 GPU 上的位置。很混乱!

可以通过像这样开始会话来完成软放置:

sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=True))

我在以下教程页面上找到了这个:https ://www.tensorflow.org/tutorials/using_gpu