Python:Flask 上不稳定的 joblib 行为
Python: Erratic joblib behaviour on Flask
我正在尝试使用 Flask 在 AWS EC2 实例上部署机器学习模型。这些是使用 joblib 腌制的 sklearn 拟合随机森林模型。当我在本地主机上托管 Flask 并将它们加载到内存中时,一切运行顺利。但是,当我使用 mod_wsgi 在 apache2 服务器上部署它时,joblib 有时会工作(即有时使用 joblib 加载模型)而其他时候服务器只是挂起。日志中没有错误。任何想法,将不胜感激。
这是我正在使用的相关代码:
# In[49]:
from flask import Flask, jsonify, request, render_template
from datetime import datetime
from sklearn.externals import joblib
import pickle as pkl
import os
# In[50]:
app = Flask(__name__, template_folder="/home/ubuntu/flaskapp/")
# In[51]:
log = lambda msg: app.logger.info(msg, extra={'worker_id': "request.uuid" })
# Logger
import logging
handler = logging.FileHandler('/home/ubuntu/app.log')
handler.setLevel(logging.ERROR)
app.logger.addHandler(handler)
# In[52]:
@app.route('/')
def host_template():
return render_template('Static_GUI.html')
# In[53]:
def load_models(path):
model_arr = [0]*len(os.listdir(path))
for filename in os.listdir(path):
f = open(path+"/"+filename, 'rb')
model_arr[int(filename[2:])] = joblib.load(f)
print("Classifier ", filename[2:], " added.")
f.close()
return model_arr
# In[54]:
partition_limit = 30
# In[55]:
print("Dictionaries being loaded.")
dict_file_path = "/home/ubuntu/Dictionaries/VARR"
dictionaries = pkl.load(open(dict_file_path, "rb"))
print("Dictionaries Loaded.")
# In[56]:
print("Begin loading classifiers.")
model_path = "/home/ubuntu/RF_Models/"
classifier_arr = load_models(model_path)
print("Classifiers Loaded.")
if __name__ == '__main__':
log("/home/ubuntu/print.log")
print("Starting API")
app.run(debug=True)
我被这个困扰了很长一段时间。发布答案以防有人遇到此问题。使用打印语句并查看日志,我将问题缩小到 joblib.load
语句。我找到了这个很棒的博客:http://blog.rtwilson.com/how-to-fix-flask-wsgi-webapp-hanging-when-importing-a-module-such-as-numpy-or-matplotlib
使用全局进程组的想法解决了这个问题。正如该博客页面上的最高评论提到的那样,这迫使使用主解释器。
我正在尝试使用 Flask 在 AWS EC2 实例上部署机器学习模型。这些是使用 joblib 腌制的 sklearn 拟合随机森林模型。当我在本地主机上托管 Flask 并将它们加载到内存中时,一切运行顺利。但是,当我使用 mod_wsgi 在 apache2 服务器上部署它时,joblib 有时会工作(即有时使用 joblib 加载模型)而其他时候服务器只是挂起。日志中没有错误。任何想法,将不胜感激。
这是我正在使用的相关代码:
# In[49]:
from flask import Flask, jsonify, request, render_template
from datetime import datetime
from sklearn.externals import joblib
import pickle as pkl
import os
# In[50]:
app = Flask(__name__, template_folder="/home/ubuntu/flaskapp/")
# In[51]:
log = lambda msg: app.logger.info(msg, extra={'worker_id': "request.uuid" })
# Logger
import logging
handler = logging.FileHandler('/home/ubuntu/app.log')
handler.setLevel(logging.ERROR)
app.logger.addHandler(handler)
# In[52]:
@app.route('/')
def host_template():
return render_template('Static_GUI.html')
# In[53]:
def load_models(path):
model_arr = [0]*len(os.listdir(path))
for filename in os.listdir(path):
f = open(path+"/"+filename, 'rb')
model_arr[int(filename[2:])] = joblib.load(f)
print("Classifier ", filename[2:], " added.")
f.close()
return model_arr
# In[54]:
partition_limit = 30
# In[55]:
print("Dictionaries being loaded.")
dict_file_path = "/home/ubuntu/Dictionaries/VARR"
dictionaries = pkl.load(open(dict_file_path, "rb"))
print("Dictionaries Loaded.")
# In[56]:
print("Begin loading classifiers.")
model_path = "/home/ubuntu/RF_Models/"
classifier_arr = load_models(model_path)
print("Classifiers Loaded.")
if __name__ == '__main__':
log("/home/ubuntu/print.log")
print("Starting API")
app.run(debug=True)
我被这个困扰了很长一段时间。发布答案以防有人遇到此问题。使用打印语句并查看日志,我将问题缩小到 joblib.load
语句。我找到了这个很棒的博客:http://blog.rtwilson.com/how-to-fix-flask-wsgi-webapp-hanging-when-importing-a-module-such-as-numpy-or-matplotlib
使用全局进程组的想法解决了这个问题。正如该博客页面上的最高评论提到的那样,这迫使使用主解释器。