烧瓶应用程序通过Uwsgi和Nginx给出504超时?

时间:2018-03-13 11:55:31

标签: python nginx flask keras uwsgi

我正在尝试部署我的keras模型。它在端口5000上的烧瓶工作正常,当我尝试通过此命令uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:app通过Uwsgi测试它时,它给了我想要的结果。当我尝试配置单独的Uwsgi fie然后使用Nginx配置来进行更长时间的部署以便可以通过nginx通过多个端口提供服务时出现问题。当我运行此网址时,它会给我 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-portrait-of-smiling-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')

myproject.ini(wsgi配置)

[uwsgi]
module = wsgi:app
master = true
processes = 5
socket = myproject.sock
chmod-socket = 660
vacuum = true
die-on-term = true

systemd单元文件

[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

nginx配置文件

server {
    listen 80;
    server_name 35.230.90.108;
    location / {
        include uwsgi_params;
        uwsgi_pass unix:///home/rehan_aziz/myproject/myproject.sock;
    }
}

wsgi app服务文件

from myproject import app

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

1 个答案:

答案 0 :(得分:0)

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

因此将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