Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python flask应用程序通过Uwsgi和Nginx提供504超时?_Python_Nginx_Flask_Keras_Uwsgi - Fatal编程技术网

Python flask应用程序通过Uwsgi和Nginx提供504超时?

Python flask应用程序通过Uwsgi和Nginx提供504超时?,python,nginx,flask,keras,uwsgi,Python,Nginx,Flask,Keras,Uwsgi,我正在尝试部署我的keras模型。它可以在端口5000上使用flask,当我尝试通过这个命令Uwsgi--socket 0.0.0.0:5000--protocol=http-w wsgi:app测试通过Uwsgi为它服务时,它给出了所需的结果。当我尝试配置一个单独的Uwsgi fie,然后配置一个Nginx配置,以便进行更长时间的部署,以便可以通过Nginx通过多个端口提供服务时,就会出现问题。当我运行此url时,它会给我一个504超时错误 http://35.230.90.108/predi

我正在尝试部署我的keras模型。它可以在端口
5000
上使用flask,当我尝试通过这个命令
Uwsgi--socket 0.0.0.0:5000--protocol=http-w wsgi:app
测试通过Uwsgi为它服务时,它给出了所需的结果。当我尝试配置一个单独的Uwsgi fie,然后配置一个Nginx配置,以便进行更长时间的部署,以便可以通过Nginx通过多个端口提供服务时,就会出现问题。当我运行此url时,它会给我一个504超时错误

http://35.230.90.108/predict/ethnicity?auth_token=WyIxYSDFg467YT.A3MmJlODcyODkzOGQzZjk4YzUiXQ.B5e5SgsDcaMgiRqx21Ydf8M&url=https://thumb7.shutterstock.com/display_pic_with_logo/768073/110309945/stock-photo-Picture-of-Smith-young-black-man-in-the-interior-of-coffee-shop-110309945.jpg

我正在使用本教程进行部署:

https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uwsgi-and-nginx-on-ubuntu-16-04
以下是部署文件、nginx配置和Uwsgi配置的代码

部署文件

import dlib
import requests
import numpy as np
from skimage import io
from skimage.transform import resize
from keras import backend as K
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
from keras import applications
from flask import Flask, jsonify, request, abort, make_response

app = Flask(__name__)

auth_token = 'WyIxYSDFg467YT.A3MmJlODcyODkzOGQzZjk4YzUiXQ.B5e5SgsDcaMgiRqx21Ydf8M'

top_model_weights_ethnicity = 'ethnicity.071217.23-0.28.hdf5'
img_width, img_height = 139, 139
confidence_ethnicity = '0.59'

detector = dlib.get_frontal_face_detector()
graph = K.get_session().graph

class_to_label_ethnicity = {"0": "arabs", "1": "asia", "2": "black", "3": "hispanics-latinos",
                            "4": "southasia", "5": "white"}

def get_face(path):
    with graph.as_default():
        img = io.imread(path)
        dets = detector(img, 1)
        output = None
        for i, d in enumerate(dets):
            img = img[d.top():d.bottom(), d.left():d.right()]
            img = resize(img, (img_width, img_height))
            output = np.expand_dims(img, axis=0)
            break
        return output


def get_pretrained_model():
    with graph.as_default():
        pretrained_model = applications.InceptionResNetV2(include_top=False, weights='imagenet',
                                                          input_shape=(img_width, img_height, 3))
        return pretrained_model


def get_features(image, pretrained_model):
    with graph.as_default():
        features = pretrained_model.predict(image)
        return features


with graph.as_default():
    pretrained_model = get_pretrained_model()
    model_ethnicity = Sequential()
    model_ethnicity.add(Flatten(input_shape=(3, 3, 1536)))
    model_ethnicity.add(Dense(256, activation='relu'))
    model_ethnicity.add(Dropout(0.5))
    model_ethnicity.add(Dense(6, activation='softmax'))
    model_ethnicity.load_weights(top_model_weights_ethnicity)

@app.route("/predict/ethnicity", methods=['GET', 'POST'])
def predict_ethnicity():
    with graph.as_default():
        if request.args.get('auth_token') != auth_token:
            abort(make_response(jsonify(message="No valid access token. Write an email to research@influencerdb.com "
                                                "to become authenticated."), 403))
        confidence = request.args.get('confidence', confidence_ethnicity)
        if request.method == 'POST':
            if 'file' not in request.files:
                abort(make_response(jsonify(message="No image found. Use 'file' as a key to upload an image."), 404))
            else:
                file = request.files['file']
                path_to_img = "uploaded/%s" % file.filename
                file.save(path_to_img)
        else:
            path_to_img = request.args.get('url')
        if get_face(path_to_img) is None:
            abort(make_response(jsonify(message="No face found."), 454))
        else:
            features = get_features(get_face(path_to_img), pretrained_model)
            prediction = model_ethnicity.predict_proba(features)
            ethnicity = {class_to_label_ethnicity[str(y)]: str(value) for (x, y), value in np.ndenumerate(prediction)}
            suggestion = class_to_label_ethnicity[str(np.argmax(prediction[0]))] \
                if np.max(prediction[0]) > float(confidence) else ""
            return jsonify({'probabilities': ethnicity, 'suggestion': suggestion}), 200


if __name__ == "__main__":
    app.run(host='0.0.0.0')
[Unit]
Description=uWSGI instance to serve myproject
After=network.target
[Service]
User=rehan_aziz
Group=www-data
WorkingDirectory=/home/rehan_aziz/myproject
Environment="PATH=/home/rehan_aziz/anaconda3/envs/myproject/bin"
ExecStart=/home/rehan_aziz/anaconda3/envs/myproject/bin/uwsgi --ini myproject.ini
[Install]
WantedBy=multi-user.target
server {
    listen 80;
    server_name 35.230.90.108;
    location / {
        include uwsgi_params;
        uwsgi_pass unix:///home/rehan_aziz/myproject/myproject.sock;
    }
}
from myproject import app

if __name__ == "__main__":
    app.run()
myproject.ini(wsgi配置)

系统单位文件

import dlib
import requests
import numpy as np
from skimage import io
from skimage.transform import resize
from keras import backend as K
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
from keras import applications
from flask import Flask, jsonify, request, abort, make_response

app = Flask(__name__)

auth_token = 'WyIxYSDFg467YT.A3MmJlODcyODkzOGQzZjk4YzUiXQ.B5e5SgsDcaMgiRqx21Ydf8M'

top_model_weights_ethnicity = 'ethnicity.071217.23-0.28.hdf5'
img_width, img_height = 139, 139
confidence_ethnicity = '0.59'

detector = dlib.get_frontal_face_detector()
graph = K.get_session().graph

class_to_label_ethnicity = {"0": "arabs", "1": "asia", "2": "black", "3": "hispanics-latinos",
                            "4": "southasia", "5": "white"}

def get_face(path):
    with graph.as_default():
        img = io.imread(path)
        dets = detector(img, 1)
        output = None
        for i, d in enumerate(dets):
            img = img[d.top():d.bottom(), d.left():d.right()]
            img = resize(img, (img_width, img_height))
            output = np.expand_dims(img, axis=0)
            break
        return output


def get_pretrained_model():
    with graph.as_default():
        pretrained_model = applications.InceptionResNetV2(include_top=False, weights='imagenet',
                                                          input_shape=(img_width, img_height, 3))
        return pretrained_model


def get_features(image, pretrained_model):
    with graph.as_default():
        features = pretrained_model.predict(image)
        return features


with graph.as_default():
    pretrained_model = get_pretrained_model()
    model_ethnicity = Sequential()
    model_ethnicity.add(Flatten(input_shape=(3, 3, 1536)))
    model_ethnicity.add(Dense(256, activation='relu'))
    model_ethnicity.add(Dropout(0.5))
    model_ethnicity.add(Dense(6, activation='softmax'))
    model_ethnicity.load_weights(top_model_weights_ethnicity)

@app.route("/predict/ethnicity", methods=['GET', 'POST'])
def predict_ethnicity():
    with graph.as_default():
        if request.args.get('auth_token') != auth_token:
            abort(make_response(jsonify(message="No valid access token. Write an email to research@influencerdb.com "
                                                "to become authenticated."), 403))
        confidence = request.args.get('confidence', confidence_ethnicity)
        if request.method == 'POST':
            if 'file' not in request.files:
                abort(make_response(jsonify(message="No image found. Use 'file' as a key to upload an image."), 404))
            else:
                file = request.files['file']
                path_to_img = "uploaded/%s" % file.filename
                file.save(path_to_img)
        else:
            path_to_img = request.args.get('url')
        if get_face(path_to_img) is None:
            abort(make_response(jsonify(message="No face found."), 454))
        else:
            features = get_features(get_face(path_to_img), pretrained_model)
            prediction = model_ethnicity.predict_proba(features)
            ethnicity = {class_to_label_ethnicity[str(y)]: str(value) for (x, y), value in np.ndenumerate(prediction)}
            suggestion = class_to_label_ethnicity[str(np.argmax(prediction[0]))] \
                if np.max(prediction[0]) > float(confidence) else ""
            return jsonify({'probabilities': ethnicity, 'suggestion': suggestion}), 200


if __name__ == "__main__":
    app.run(host='0.0.0.0')
[Unit]
Description=uWSGI instance to serve myproject
After=network.target
[Service]
User=rehan_aziz
Group=www-data
WorkingDirectory=/home/rehan_aziz/myproject
Environment="PATH=/home/rehan_aziz/anaconda3/envs/myproject/bin"
ExecStart=/home/rehan_aziz/anaconda3/envs/myproject/bin/uwsgi --ini myproject.ini
[Install]
WantedBy=multi-user.target
server {
    listen 80;
    server_name 35.230.90.108;
    location / {
        include uwsgi_params;
        uwsgi_pass unix:///home/rehan_aziz/myproject/myproject.sock;
    }
}
from myproject import app

if __name__ == "__main__":
    app.run()
nginx配置文件

import dlib
import requests
import numpy as np
from skimage import io
from skimage.transform import resize
from keras import backend as K
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
from keras import applications
from flask import Flask, jsonify, request, abort, make_response

app = Flask(__name__)

auth_token = 'WyIxYSDFg467YT.A3MmJlODcyODkzOGQzZjk4YzUiXQ.B5e5SgsDcaMgiRqx21Ydf8M'

top_model_weights_ethnicity = 'ethnicity.071217.23-0.28.hdf5'
img_width, img_height = 139, 139
confidence_ethnicity = '0.59'

detector = dlib.get_frontal_face_detector()
graph = K.get_session().graph

class_to_label_ethnicity = {"0": "arabs", "1": "asia", "2": "black", "3": "hispanics-latinos",
                            "4": "southasia", "5": "white"}

def get_face(path):
    with graph.as_default():
        img = io.imread(path)
        dets = detector(img, 1)
        output = None
        for i, d in enumerate(dets):
            img = img[d.top():d.bottom(), d.left():d.right()]
            img = resize(img, (img_width, img_height))
            output = np.expand_dims(img, axis=0)
            break
        return output


def get_pretrained_model():
    with graph.as_default():
        pretrained_model = applications.InceptionResNetV2(include_top=False, weights='imagenet',
                                                          input_shape=(img_width, img_height, 3))
        return pretrained_model


def get_features(image, pretrained_model):
    with graph.as_default():
        features = pretrained_model.predict(image)
        return features


with graph.as_default():
    pretrained_model = get_pretrained_model()
    model_ethnicity = Sequential()
    model_ethnicity.add(Flatten(input_shape=(3, 3, 1536)))
    model_ethnicity.add(Dense(256, activation='relu'))
    model_ethnicity.add(Dropout(0.5))
    model_ethnicity.add(Dense(6, activation='softmax'))
    model_ethnicity.load_weights(top_model_weights_ethnicity)

@app.route("/predict/ethnicity", methods=['GET', 'POST'])
def predict_ethnicity():
    with graph.as_default():
        if request.args.get('auth_token') != auth_token:
            abort(make_response(jsonify(message="No valid access token. Write an email to research@influencerdb.com "
                                                "to become authenticated."), 403))
        confidence = request.args.get('confidence', confidence_ethnicity)
        if request.method == 'POST':
            if 'file' not in request.files:
                abort(make_response(jsonify(message="No image found. Use 'file' as a key to upload an image."), 404))
            else:
                file = request.files['file']
                path_to_img = "uploaded/%s" % file.filename
                file.save(path_to_img)
        else:
            path_to_img = request.args.get('url')
        if get_face(path_to_img) is None:
            abort(make_response(jsonify(message="No face found."), 454))
        else:
            features = get_features(get_face(path_to_img), pretrained_model)
            prediction = model_ethnicity.predict_proba(features)
            ethnicity = {class_to_label_ethnicity[str(y)]: str(value) for (x, y), value in np.ndenumerate(prediction)}
            suggestion = class_to_label_ethnicity[str(np.argmax(prediction[0]))] \
                if np.max(prediction[0]) > float(confidence) else ""
            return jsonify({'probabilities': ethnicity, 'suggestion': suggestion}), 200


if __name__ == "__main__":
    app.run(host='0.0.0.0')
[Unit]
Description=uWSGI instance to serve myproject
After=network.target
[Service]
User=rehan_aziz
Group=www-data
WorkingDirectory=/home/rehan_aziz/myproject
Environment="PATH=/home/rehan_aziz/anaconda3/envs/myproject/bin"
ExecStart=/home/rehan_aziz/anaconda3/envs/myproject/bin/uwsgi --ini myproject.ini
[Install]
WantedBy=multi-user.target
server {
    listen 80;
    server_name 35.230.90.108;
    location / {
        include uwsgi_params;
        uwsgi_pass unix:///home/rehan_aziz/myproject/myproject.sock;
    }
}
from myproject import app

if __name__ == "__main__":
    app.run()
wsgi应用程序服务文件

import dlib
import requests
import numpy as np
from skimage import io
from skimage.transform import resize
from keras import backend as K
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
from keras import applications
from flask import Flask, jsonify, request, abort, make_response

app = Flask(__name__)

auth_token = 'WyIxYSDFg467YT.A3MmJlODcyODkzOGQzZjk4YzUiXQ.B5e5SgsDcaMgiRqx21Ydf8M'

top_model_weights_ethnicity = 'ethnicity.071217.23-0.28.hdf5'
img_width, img_height = 139, 139
confidence_ethnicity = '0.59'

detector = dlib.get_frontal_face_detector()
graph = K.get_session().graph

class_to_label_ethnicity = {"0": "arabs", "1": "asia", "2": "black", "3": "hispanics-latinos",
                            "4": "southasia", "5": "white"}

def get_face(path):
    with graph.as_default():
        img = io.imread(path)
        dets = detector(img, 1)
        output = None
        for i, d in enumerate(dets):
            img = img[d.top():d.bottom(), d.left():d.right()]
            img = resize(img, (img_width, img_height))
            output = np.expand_dims(img, axis=0)
            break
        return output


def get_pretrained_model():
    with graph.as_default():
        pretrained_model = applications.InceptionResNetV2(include_top=False, weights='imagenet',
                                                          input_shape=(img_width, img_height, 3))
        return pretrained_model


def get_features(image, pretrained_model):
    with graph.as_default():
        features = pretrained_model.predict(image)
        return features


with graph.as_default():
    pretrained_model = get_pretrained_model()
    model_ethnicity = Sequential()
    model_ethnicity.add(Flatten(input_shape=(3, 3, 1536)))
    model_ethnicity.add(Dense(256, activation='relu'))
    model_ethnicity.add(Dropout(0.5))
    model_ethnicity.add(Dense(6, activation='softmax'))
    model_ethnicity.load_weights(top_model_weights_ethnicity)

@app.route("/predict/ethnicity", methods=['GET', 'POST'])
def predict_ethnicity():
    with graph.as_default():
        if request.args.get('auth_token') != auth_token:
            abort(make_response(jsonify(message="No valid access token. Write an email to research@influencerdb.com "
                                                "to become authenticated."), 403))
        confidence = request.args.get('confidence', confidence_ethnicity)
        if request.method == 'POST':
            if 'file' not in request.files:
                abort(make_response(jsonify(message="No image found. Use 'file' as a key to upload an image."), 404))
            else:
                file = request.files['file']
                path_to_img = "uploaded/%s" % file.filename
                file.save(path_to_img)
        else:
            path_to_img = request.args.get('url')
        if get_face(path_to_img) is None:
            abort(make_response(jsonify(message="No face found."), 454))
        else:
            features = get_features(get_face(path_to_img), pretrained_model)
            prediction = model_ethnicity.predict_proba(features)
            ethnicity = {class_to_label_ethnicity[str(y)]: str(value) for (x, y), value in np.ndenumerate(prediction)}
            suggestion = class_to_label_ethnicity[str(np.argmax(prediction[0]))] \
                if np.max(prediction[0]) > float(confidence) else ""
            return jsonify({'probabilities': ethnicity, 'suggestion': suggestion}), 200


if __name__ == "__main__":
    app.run(host='0.0.0.0')
[Unit]
Description=uWSGI instance to serve myproject
After=network.target
[Service]
User=rehan_aziz
Group=www-data
WorkingDirectory=/home/rehan_aziz/myproject
Environment="PATH=/home/rehan_aziz/anaconda3/envs/myproject/bin"
ExecStart=/home/rehan_aziz/anaconda3/envs/myproject/bin/uwsgi --ini myproject.ini
[Install]
WantedBy=multi-user.target
server {
    listen 80;
    server_name 35.230.90.108;
    location / {
        include uwsgi_params;
        uwsgi_pass unix:///home/rehan_aziz/myproject/myproject.sock;
    }
}
from myproject import app

if __name__ == "__main__":
    app.run()

这似乎是uwsgi中Keras和线程的问题

所以,将master设置为false,并将进程更改为1为我修复它,这仍然是一个问题,尽管它无法扩展。但它对实验有效

因此,请在
myproject.ini

[uwsgi]
module = wsgi:app
master = false <-- this
processes = 1 <-- and this
socket = myproject.sock
chmod-socket = 660
vacuum = true
die-on-term = true
[uwsgi]
module=wsgi:app

master=false部署文件的名称是什么?@ManishMahendru它的名称也是
myproject
如果它是“myproject.py”,那么就把它改为“wsgi.py”,因为在“myproject.ini”中,您提到的模块是wsgi:app。希望对你有用you@ManishMahendru我有一个单独的文件,我刚才添加了导入应用程序并运行该文件。文件名是
wsgi.py
。类似于模块名。我想我得到了超时错误,因为在nginx的生存时间内,inception模型没有从互联网上加载(尽管不确定)。我试图改变超时,但没有任何解决方案,因为这个问题,我得到同样的东西在这里!如果它不起作用,您可能还想添加
更便宜的=0
我不确定是否还有其他人,但添加
惰性应用程序=true
帮了我的忙。我不需要任何其他参数。我可以确认Pramesh提到的解决方案在Tensorflow 2.1.1中也适用于我