2016-08-15 9 views
1

このコードはうまくいきますが、それは私にCPUの2倍のブーストを与えますが、もっと速くできると思います。私は(forループ) TensorFlow GPUエポック最適化?

for i in tqdm(range(epochs), ascii=True): 
    sess.run(train_step, feed_dict={x: train, y_:labels}) 

私は何が起こることは、すべてのエポックは、我々は次の何をすべきかについては、CPUに戻るということだと思います...問題は、この地域に帰着考えると、forループGPUにプッシュバックします。これで、GPUはデータセット全体をメモリに収めることができます。

どうすればよいですか? CPUに戻ってその状態を報告することなく、GPUで1000エポックを連続的にクランチさせるだけです。または、ステータスを報告する頻度を制御することもできます。 GPUでクランチ1000エポックを言うといいですし、私の列車とバリデーションを確認してから、もう一度クラッシュしてください。しかし、すべての時代の間にそれをすることは本当に役に立たない。

おかげで、

〜デビッド・

答えて

3

session.runのオーバーヘッドは約100マイクロ秒であるので、あなたは10Kの手順を実行している場合、このオーバーヘッドは約1秒を追加します。これが重要な場合は、多くの小さな繰り返しを実行しており、他の場所で余分なオーバーヘッドが発生しています。 IE、GPUカーネルの起動オーバーヘッドはCPU(5usec対1usec)の5倍です。

feed_dictを使用すると、おそらく大きな問題であり、キュー/入力パイプラインを使用すると処理が高速になる可能性があります。

また、時間を費やしている場所を把握するための堅牢な方法は、プロファイルすることです。 IEの場合、forループのためにどのくらいの時間が経過したのか把握するには、次のようにcProfileを実行します。時間はTensorFlow runの内部でどこに行くか、あなたは説明here

+0

としてタイムラインプロファイリングを行うことができます把握する

​​

データキューは、オープンGPUカーネルを維持していますか?私はあなたがここで正しいかもしれないと思います。また、IPython型環境からプロファイリングを実行することも可能ですか?私はIPythonでプロトタイプを作成し、その後、プロダクションのために出荷します。私は非IPythonを行うことができると思いますが、私は本当にIPythonが好きです... –

+0

YouuはIPythonでタイムラインプロファイリングを行うことができます。それ以外の種類のプロファイリングはそれほど重要ではありません。私が言ったことはちょうどあなたに示されます.100usはsession.runで過ごしました。データキューを使用する利点は、すべてのデータがTensorFlow側に保持されることです。 feed_dictでは、各ステップで2つのコピーがあります.1つはPythonからTensorFlowランタイムにコピーし、もう1つはGPUにコピーします。 –

関連する問題