2016-07-31 81 views
3

我正在運行以下程序,並且每次點擊「構建」API調用時,都會看到有關處理完成後另一個1 GB內存的情況。我試圖從內存中消除所有的東西,但我不知道還有什麼。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請求應該在幾秒鐘內響應。運行DNN分類器會話可能需要很多秒(需要嘗試)。

最棘手的解決方案是在請求中創建一個python線程,讓請求響應HTTP調用而不會阻塞。同時你的線程可以繼續並建立你的模型。然後你就可以寫的地方你的模型,或發送郵件通知等

在這裏你去:

How can I add a background thread to flask?

+1

你也可以通過使用'psutil.subprocess'添加一個子進程 –