2016-07-31 24 views
3

私は次のプログラムを実行しています。私は 'ビルド' APIコールを実行するたびに、処理が完了した後にもう1GBのメモリが使用されることがわかります。私は記憶からすべてを取り除こうとしていますが、残っていることは分かりません。Tensorflow、Flask、およびTFLearnメモリリーク

import tensorflow as tf 
import tflearn 
from flask import Flask, jsonify 
from tflearn.layers.core import input_data, dropout, fully_connected 
from tflearn.layers.conv import conv_2d, max_pool_2d 
from tflearn.layers.normalization import local_response_normalization 
from tflearn.layers.estimator import regression 

app = Flask(__name__) 

keep_prob = .8 
num_labels = 3 
batch_size = 64 

class AlexNet(): 

    def __init__(self): 

     @app.route('/build') 
     def build(): 
      g = tf.Graph() 
      with g.as_default(): 
       sess = tf.Session() 

       # Building 'AlexNet' 
       network = input_data(shape=[None, 227, 227, 3]) 
       network = conv_2d(network, 96, 11, strides=4, activation='relu') 
       network = max_pool_2d(network, 3, strides=2) 
       network = local_response_normalization(network) 
       network = conv_2d(network, 256, 5, activation='relu') 
       network = max_pool_2d(network, 3, strides=2) 
       network = local_response_normalization(network) 
       network = conv_2d(network, 384, 3, activation='relu') 
       network = conv_2d(network, 384, 3, activation='relu') 
       network = conv_2d(network, 256, 3, activation='relu') 
       network = max_pool_2d(network, 3, strides=2) 
       network = local_response_normalization(network) 
       network = fully_connected(network, 4096, activation='tanh') 
       network = dropout(network, keep_prob) 
       network = fully_connected(network, 4096, activation='tanh') 
       network = dropout(network, keep_prob) 
       network = fully_connected(network, num_labels, activation='softmax') 
       network = regression(network, optimizer="adam", 
            loss='categorical_crossentropy', 
            learning_rate=0.001, batch_size=batch_size) 

       model = tflearn.DNN(network, tensorboard_dir="./tflearn_logs/", 
            checkpoint_path=None, tensorboard_verbose=0, session=sess) 

       sess.run(tf.initialize_all_variables()) 
       sess.close() 

      tf.reset_default_graph() 

      del g 
      del sess 
      del model 
      del network 
      return jsonify(status=200) 


if __name__ == "__main__": 
    AlexNet() 
    app.run(host='0.0.0.0', port=5000, threaded=True) 
+0

メモリ割り当てはここに起こる:sess.run(tf.initialize_all_variables()) –

+0

は多分してみてください'free && sync && echo 3>/proc/sys/vm/drop_caches && free' –

+0

私はこれをMac上でローカルに実行しているので、同等のコマンドが何であるか分かりません。 –

答えて

2

私はあなたが答えが、私見を発見した場合、あなたは、HTTPリクエストハンドラ内で長時間実行されるタスクを置くことになっていないかわかりません。 HTTPはステートレスであり、ほぼ即座に呼び出しに応答するはずだからです。だから私たちはコンセプトのタスクキュー、非同期タスクなどを持っているのです。サーバー側開発の経験則は、要求にできるだけ早く応答しています。また、HTTPリクエスト内に畳み込みの深いニューラルネットワークを構築しようとすると、実際には実現できないのが普通です。 理想的なHTTPリクエストは1秒のクーペで応答する必要があるためです。 DNNクラシファイアセッションの実行に時間がかかりすぎる可能性があります(試してみる必要があります)。

最も難解な解決策は、要求内にpythonスレッドを作成し、要求をブロックせずにHTTP呼び出しに応答させることです。一方、あなたのスレッドは進んであなたのモデルを構築することができます。そして、あなたがどこかにあなたのモデルを書いたり、メール通知を送信できるなど

ここに行く:

How can I add a background thread to flask?

+1

これを行うには、 'psutil.subprocess'を使ってサブプロセスを追加します –

関連する問題