Python flask应用程序通过Uwsgi和Nginx提供504超时?
我正在尝试部署我的keras模型。它可以在端口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
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中也适用于我