Flask Python:烧瓶上不稳定的joblib行为

Flask Python:烧瓶上不稳定的joblib行为,flask,scikit-learn,apache2,mod-wsgi,joblib,Flask,Scikit Learn,Apache2,Mod Wsgi,Joblib,我正在尝试使用Flask在AWS EC2实例上部署一个机器学习模型。这些是sklearn的拟合随机森林模型,使用joblib进行处理。当我在本地主机上托管Flask并将它们加载到内存中时,一切都会顺利运行。但是,当我使用mod_wsgi将其部署到apache2服务器上时,joblib有时工作(即有时使用joblib加载模型),而其他时候服务器只是挂起。日志中没有错误。任何想法都将不胜感激 以下是我正在使用的相关代码: # In[49]: from flask import Flask, js

我正在尝试使用Flask在AWS EC2实例上部署一个机器学习模型。这些是sklearn的拟合随机森林模型,使用joblib进行处理。当我在本地主机上托管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)

我被这件事困扰了很长一段时间。发布答案,以防有人遇到此问题。通过使用print语句和查看日志,我将问题缩小到
joblib.load
statement。我发现了这个很棒的博客:


使用全局过程组的想法解决了这个问题。正如该博客页面上的顶部评论所提到的那样,这迫使我们使用主解释器。

这正是我们面临的问题。谢谢你的帮助