2016-12-08 8 views
3

私はTensorflowを使ってアルゴリズムを書いています。次のように私のコードの構造は次のとおりです。Tensorflow:グラフにデータを入力

  1. は、各リストは、CSVファイルから単一の行が含まれている場合は、csvファイルからデータを読み込み、リストのリストに保存します。

  2. feed_dictアプローチを使用して、グラフに1行のデータを入力します。これは、すべての行が処理されるまでループで実行されます。

TFグラフはGPUで実行されます。私の質問は、CPUからGPUに起こるデータ転送に関連しています。 feed_dictを使用すると、ホストからデバイスへの小さな転送がたくさんあるでしょうか?はいの場合、feed_dictを使用してバルク転送を行い、TFグラフにループを使用することは可能でしょうか?

+0

それは、これらの小さな転送がボトルネックではない可能性がありますので、転送速度を向上させることが非常にあなたのトレーニングのスループットを向上させることはありません。だからあなたは最適化する前に物事をプロファイルする必要があります。実際にボトルネックになっている場合は、トレーニングと並行してGPUにプリフェッチすることが可能です(例えば、Tim Zamanのアプローチ[こちら](https://github.com/tensorflow/tensorflow/issues/5722#issuecomment-266297116) –

+0

Canあなたはこれをどのようにプロファイルするか教えてください?いくつかのメトリックを取得するためにnvprofを使用しようとしましたが、Tensorflowコードで使用すると何も表示されませんでした。 nvprofは生のCUDAコードで使用すると動作します。 – user1274878

+0

'feed_dict'を直接使うのではなく、GPUに固定されたTensorFlow変数に' batch'を保存してください。 1つの 'session.run'で' tf.assign'と 'feed_dict'を実行してバッチをその変数に送ります。 2番目の 'session.run'では、プレースホルダーの代わりに変数からバッチを取る実際の計算を行います。次に、最初のセッションの実行をコメントアウトすると、プリフェッチ・ソリューションで達成可能な最大速度が得られます –

答えて

2

はい。ファイルサイズが小さい(例えば、1行のテキスト)場合、ホストからデバイスへの小さな転送が多くなる可能性がある。ここで

は、カスタムfill_feed_dict機能付きfeed_dict使用例です:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/fully_connected_feed.pyご利用の場合

しかし、TensorFlowのQueueRunnerを使用して多くの小さなファイルを処理する方が簡単かもしれません。これにより、データをプリフェッチしてTensorFlowグラフのデータ可用性を向上させるリーダースレッドのプールが作成されます。

Create the graph, etc. 
init_op = tf.global_variables_initializer() 

# Create a session for running operations in the Graph. 
sess = tf.Session() 

# Initialize the variables (like the epoch counter). 
sess.run(init_op) 

# Start input enqueue threads. 
coord = tf.train.Coordinator() 
threads = tf.train.start_queue_runners(sess=sess, coord=coord) 

try: 
    while not coord.should_stop(): 
     # Run training steps or whatever 
     sess.run(train_op) 

except tf.errors.OutOfRangeError: 
    print('Done training -- epoch limit reached') 
finally: 
    # When done, ask the threads to stop. 
    coord.request_stop() 

# Wait for threads to finish. 
coord.join(threads) 
sess.close() 

https://www.tensorflow.org/how_tos/reading_data/#batching

関連する問題