2016-08-03 4 views
4

私はキューに私の理解で何か欠けているように私は感じる:理解tensorflowキューとCPU <-> GPU転送

https://github.com/tensorflow/tensorflow/issues/3009

私はキューにデータをロードするときと考え、それが最後のバッチが計算されている間にGPUに事前転送されるため、次のバッチをロードする時間よりも計算に時間がかかると仮定すると、帯域幅のボトルネックはほとんどありません。

しかし、上記のリンクは、キューからグラフ(numpy < - > TF)に高価なコピーがあり、ファイルをグラフにロードして代わりに前処理を行う方が速いことを示しています。しかし、それは私には意味がありません。ファイルから256x256イメージを読み込んだり、生のnumpy配列を読み込んだりするのはなぜ重要なのですか?何かあれば、私はnumpyバージョンが速いと思います。私は何が欠けていますか?

+0

numpy配列でフィードする場合は、PythonからTensorFlowランタイムにデータを取得するための余分なシングルスレッドメモリコピーがあります。 TensorFlowオペレーションを使用してファイルからロードする場合、データはTFランタイムにとどまるため、そのコピーは必要ありません。 –

+0

最後のバッチがトレーニングされている間にGPUに事前転送することはどうですか?それで、最後のバッチが完了したらTFに入る準備ができているので、データがどこから来ているかは問題ではありません。それはどのように動作しないのですか?一日の終わりには、ディスクやキューからどこかから転送する必要がありますが、非同期の場合は重要ですか? – jstaker7

+0

ところで、その問題では、 'QueueDequeueMany'が/ cpu:0に置かれていることがわかります。そのようにキューを使用するとGPUに非同期に物事が転送されません –

答えて

4

GPUキューは実装されていないため、メインメモリにデータをロードするだけで、GPUへの非同期プリフェッチはありません。あなたはgpu:0

+0

この機能は、GPUキューのサポートを追跡しますhttps://github.com/tensorflow/tensorflow/issues/5722 –

2

に固定変数を使用して、GPUベースのキューのようなものを作ることができdocumentationは、デバイスにキューを固定することが可能であることを示唆している:

N.B.キューメソッド(q.enqueue(...)など)は、キューと同じデバイス上で実行する必要があります。互換性のないデバイス配置ディレクティブは、これらの操作を作成するときに無視されます。

しかし、上記のことは、エンキューしようとしている変数はすでにGPUにあるはずであることを意味します。

Thisコメントは、tf.identityを使用してプリフェッチを実行することができます。

関連する問題