2017-02-28 45 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。不知道我是如何錯過它的。這會使我已經發現的一些東西變得容易得多。 –