【问题标题】:Loading a big file in a gcloud application with Flask使用 Flask 在 gcloud 应用程序中加载大文件
【发布时间】: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


【解决方案1】:

如果使用 flex gcloud 应用引擎环境,它就可以正常工作。 flex 环境允许使用本地文件(这里是 scikit learn 模型),而 strict 环境不允许。

【讨论】:

    猜你喜欢
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2016-07-20
    • 2012-03-19
    相关资源
    最近更新 更多