2016-08-22 19 views
3

私はRNNネットワークを訓練します、最初のエポックは7.5時間使用されました。しかし、トレーニングプロセスが実行されると、テンソルフローが遅くなり、遅くなり、2番目のエポックは55時間使用されました。私は、コードをチェックし、時間とともに遅くなり、ほとんどのAPIはこれらです:トレーニングの過程でテンソルフローが遅く、遅くなることがあるのはなぜですか?

  1. session.run([var1, var1, ...], feed_dict=feed)
  2. tensor.eval(feed_dict=feed)。例えば

は、一行のコードは、プログラムが開始されると、これは0.1秒を使用し、そのプロセスが実行して、時間は10時間、時間この後、コード行がどんどん大きくなるために使用される、session.run[var1, var2, ...], feed_dict=feed)あります10秒になる。

私はこれを数回吹きました。これはどのようなトリガーですか?これを避けるにはどうすればいいですか?

このコード行の場合:self.shapes = [numpy.zeros(g[1].get_shape(), numy.float32) for g in self.compute_gradients]は、テンソルフローのグラフにノードを追加しますか?私はこれが理由かもしれないと思う。このコード行は定期的に何回も呼び出され、selftf.train.optimizerのオブジェクトではありません。

+2

メモリリークの可能性があります。 [ここ]の指示に従ってみてください(http://stackoverflow.com/documentation/tensorflow/3883/how-to-debug-a-memory-leak-in-tensorflow/13426/use-graph-finalize-to-catch-ノード追加中のグラフ#t = 20160822041413026848)を使用して原因を追跡します。 'self'が' tf.train.Optimizer'オブジェクトである場合、 '[self.compute_gradientsのgのnumpy.zeros(...)'行はグラフにノードを追加するかもしれません。 – mrry

答えて

3

作成したグラフを完成させてください(graph.finalize())。これにより、操作がグラフに追加されなくなります。私はまたself.compute_gradientsがグラフに操作を追加していると思います。ループ外で操作を定義してループ内で実行してみてください。

+0

ありがとうございました。私は 'graph.finalize()'を試しましたが、メモリリークはまったくないはずです。そして、 'numpy.ndarray'のような大きなメモリを頻繁に割り当てるというコードも削除しました。私はそれを確認するためにいくつかのエポックを実行します。 –

1

私は同様の問題がありました。私の解決策は、各エポックまたはサンプルの後に置いていた

tf.reset_default_graph() 

これにより、グラフがリセットされ、セッションを閉じる方法で使用されるすべてのリソースが解放されます。

関連する問題