我正在尝试部署我的keras模型。它在端口5000
上的flask上可以正常工作,当我尝试通过此命令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 [email protected] " "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
系统单位文件
[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应用服务文件
from myproject import app
if __name__ == "__main__":
app.run()
我正在尝试部署我的keras模型。它可以在5000端口上的flask上正常工作,当我尝试通过此命令uwsgi --socket 0.0.0.0:5000 --protocol = http -w wsgi:app通过它通过Uwsgi提供服务时,它...