2016-07-31 23 views
3

Ich führe das folgende Programm aus und jedes Mal, wenn ich den API-Aufruf 'build' anwähle, sehe ich, dass weitere 1 GB Speicher belegt sind, nachdem der Prozess abgeschlossen ist. Ich versuche, alles aus dem Gedächtnis zu eliminieren, aber ich bin mir nicht sicher, was bleibt.Tensorflow, Flask und TFLearn Speicherleck

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

Die Speicherzuweisung hier geschieht: sess.run (tf.initialize_all_variables()) –

+0

vielleicht versuchen 'free && sync && echo 3>/proc/sys/vm/drop_caches && free' –

+0

Ich führe das lokal auf einem Mac, so dass ich nicht sicher bin, was der entsprechende Befehl ist. –

Antwort

2

Ich bin mir nicht sicher, ob Sie die Antwort gefunden haben, aber meine Meinung nach, sind Sie eigentlich nicht lange laufende Aufgaben in den HTTP-Request-Handler setzen. Weil HTTP statuslos ist und fast sofort auf den Anruf reagieren soll. Aus diesem Grund haben wir die Konzeptaufgabenwarteschlangen, asynchronen Aufgaben usw. Die Faustregel bei der serverseitigen Entwicklung lautet, so schnell wie möglich auf die Anfrage zu antworten. Und wenn Sie versuchen, ein faltbares, tiefes neuronales Netzwerk innerhalb der HTTP-Anfrage aufzubauen, ist es normal, dass es nicht wirklich machbar ist. Weil ideale HTTP-Anfrage in einem Couple von Sekunden reagieren sollte. Ihre DNN Classifier-Sitzung kann zu viele Sekunden dauern (müssen Sie versuchen).

Die hackiest Lösung würde einen Python-Thread innerhalb der Anfrage erstellen und die Anfrage auf den HTTP-Aufruf reagieren lassen, ohne zu blockieren. Unterdessen kann dein Thread weitergehen und dein Modell aufbauen. Und dann können Sie Ihr Modell irgendwo schreiben oder eine E-Mail-Benachrichtigung senden usw.

Hier gehen Sie:

How can I add a background thread to flask?

+1

Sie können dies auch tun, indem Sie einen Subprozess mit 'psutilsubprocess' hinzufügen –