【问题标题】:Tensorflow multiple samples without batchingTensorFlow 多个样本,无需批处理
【发布时间】:2017-02-28 04:06:36
【问题描述】:

不幸的是,我有一个图表,其中一些节点不支持批处理。(尚未充实的自定义操作)我已经能够让多个线程调用 sess.run 并通过 feed_dict 投入数据.我现在已经将我的数据转换为 tfrecords 以正确利用队列,但仍然无法找到一种方法来告诉它并行运行图形的多个实例,而无需多个线程调用 sess.run()。我假设 tensorflow 开发人员已经在某处创建了一种更“pythonic”的方式,但我还没有找到它。我如何在 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 操作完成,它就会从另一个样本开始。

【问题讨论】:

    标签: python multithreading tensorflow


    【解决方案1】:
    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 必须由队列提供。

    【讨论】:

    • 对不起。我应该更清楚。当我说这些操作不支持批处理时,我的意思是在我的实际模型中,它们只是将单个 3D 张量作为输入,而不是最外层维度是批次的 4D 张量。这意味着,除非我从根本上误解了 tensorflow 中批处理的工作方式,否则我不能使用批处理。因此我想改为简单地并行运行图形。
    • 另外,现在我想到了,批处理实际上是无关紧要的,因为即使使用批处理,我仍然希望以某种方式一次对图形进行多个单独的计算,作为前半部分图仅限于cpu。目前,要么 cpu 正在等待 gpu,要么 gpu 正在等待 cpu,我想在他们等待时让他们工作。我将编辑问题以添加此信息。
    • 另外,我以前从未见过 py_func。想知道我是怎么错过的。它会让我现在已经弄清楚的一些事情变得容易得多。
    • “将一半的时间花在 CPU 上”是指“做不在 tensorflow 图中的事情”吗?如果是这样,将这些东西包装在 tf.py_func 中,然后 tensorflow 将解决剩下的问题。它仍将在 cpu 上运行,但会尽可能使其并行运行。不是所有在 tensorflow 中运行的东西都在 GPU 上运行,也不是所有在非 tf 代码中运行的东西都将在 CPU 上运行。
    • 不,我的意思是操作在 cpu 上运行,但在图中。 Tensorflow 不能并行化它,因为它只是做自己的事情,它下面的节点依赖于它。当我调用 sess.run([training step]) 时,它会阻塞,直到整个过程完成。没有任何东西可以并行化。一次只处理一个样本,并且 gpu 使用率保持在较低水平。我正在寻找一种将样本排队以异步运行的方法,以便当 cpu 通常空闲等待 gpu 完成其工作并等待新调用 sess.run 时,其他样本正在 cpu 上运行。我无法说得更清楚。
    猜你喜欢
    • 2017-11-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2018-03-20
    相关资源
    最近更新 更多