【发布时间】:2019-04-18 22:05:58
【问题描述】:
我在使用 scikit 学习模型的 Google 应用引擎上上传了一个 Flask 应用程序。我希望只加载一次泡菜文件,但我不知道在哪里以及如何导入它。
我尝试在应用程序脚本的最开始导入模型,但随后网站出现错误。
main.py:
clf = joblib.load(open("static/troll_model.pkl", "rb"))
application = Flask(__name__)
@application.route("/")
def home():
return render_template('index.html')
@application.route('/predict', methods=['POST'])
def predict():
if request.method == "POST":
message = request.form['message']
data = [message]
pred = clf.predict(data)
return render_template("result.html", prediction=pred)
app.yaml:
runtime: python37
entrypoint: gunicorn -b :$PORT main:application
handlers:
- url: /static
static_dir: static
- url : /.*
script: auto
目前,每次客户要求回答时都会导入模型,它可以工作,但应用程序变得非常滞后。我只想导入一次文件。
【问题讨论】:
-
"但是网站上发生了错误。" - 错误是什么?
-
pickle 文件需要加载到创建的每个 App Engine 实例中。 IIUC 通过将脚本实例化为全局(这很好),这就是您的脚本正在发生的事情。如果您将
joblib.load(...)包装到一个写入日志条目并在启动时执行的函数中,您应该会看到每个实例不是每个请求都有一个日志条目。尽管您可以使用其他方法来持久化模型,但每个实例都必须反序列化对象才能使该实例使用它。 -
你应该已经拥有了你想要的东西。关注那个错误,我怀疑你的实例随着每个请求而死,所以每个请求都会启动一个新实例并加载模型。
-
“每个实例都必须反序列化对象”是什么意思?我必须手动执行吗?
标签: python flask scikit-learn gcloud