2016-07-31 3 views
3

Я запускаю следующую программу, и каждый раз, когда я нахожусь в вызове API 'build', я вижу, что после того, как процесс завершился, мы рассмотрим еще одну 1 ГБ памяти. Я пытаюсь устранить все из памяти, но я не уверен, что осталось.Tensorflow, Flask и TFLearn Memory Leak

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' –