2017-02-28 42 views
0

我有一个不幸的是具有不支持批处理一些节点。我已经能够有多个线程调用sess.run和投掷的(即还有待充实的自定义操作)图数据通过feed_dict进入。现在我已经将我的数据tfrecords要正确地使用队列,但仍然无法找到一个方法来告诉它不只是有多个线程调用sess.run()并行运行图的多个实例。我认为tensorflow开发人员在某处创建了更“pythonic”的方式,但我还没有找到它。我如何在tensorflow中做到这一点?Tensorflow多个样本,而不配料

编辑:即使在批量数据的情况下,前面的问题仍然存在,因为我的计算花了一半的时间在CPU上,一半花在GPU上,因此无论批处理如何,一半会等待另一半。我希望图形训练多个样本以异步填充该空间。

编辑2:我想我必须把伪这里不想读上面的文字谁的人。

import tensorflow as tf 

resultOfCPUCalculation = someCPUOnlyOP(inputData)\\does not support batching 
gpuResults = aBunchOfGPUOps(resultOfCPUCalculation) 
with tf.Session() as sess: 
    sess.run([gpuResults]) 
    //only uses 1 cpu core, and the gpu is idle while it's doing it's thing. 

我想这样做是一个“管道”的方式,在这里只要CPU运算完成后,它开始在另一个样本。

回答

0
import tensorflow as tf 

input_example = get_input_example() 
cpu_output = some_cpu_only_op(input_example) 

cpu_output_batch = tf.train.batch(input_example, batch_size, num_threads) 
gpu_output_batch = a_bunch_of_gpu_ops(cpu_output_batch) 

with tf.Session() as sess: 
    coord = tf.train.Coordinator() 
    threads = tf.train.start_queue_runners(coord=coord) 

    for i in range(num_train_steps): 
     output_values = sess.run(gpu_output_batch) 
     do_stuff_with(output_values) 

    coord.request_stop() 
    coord.join(threads) 

input_example将不得不排队。

+0

对不起。我应该更清楚。当我说这些操作不支持批处理时,我的意思是在我的实际模型中,他们只需要一个单一的3D张量作为输入,而不是4D张量,其中最外层是批量。这意味着,除非我从根本上误解配料在张量流中的工作方式,否则我不能使用批次。因此我想只是平行运行图形。 –

+0

另外,现在我想起来了,配料实际上是irellevant,因为即使有配料,我还是想以某种方式有图形的多个单独计算一次,作为图形上半年受限于CPU。在CPU正在等待GPU或等待CPU的GPU的时刻,我想在等待时给他们工作。我将编辑该问题以添加此信息。 –

+0

此外,我从来没有见过py_func。不知道我是如何错过它的。这会使我已经发现的一些东西变得容易得多。 –