加载大泡菜时,Flask 应用程序中的 Google App Engine gunicorn 工作超时?

Iam*_*oud 4 python pickle flask gunicorn google-cloud-platform

我有一个 350 MB 的 Sklearn pickle 文件,我想在 Flask 应用程序启动时加载它。

我使用_pickle它是因为在文档中提到它具有更快的加载时间:

import _pickle as pickle

start = timeit.default_timer()
with open("pickle/pipeline.pkl", 'rb') as f: 
        # ~350MB file
        pipeline = pickle.load(f)
        stop = timeit.default_timer()
        print('Time: ', stop - start)
Run Code Online (Sandbox Code Playgroud)

pickle 在本地加载 5-12 秒,但在 Google App Engine F4(1GB RAM)实例上,gunicornworker 超时。

谷歌应用引擎日志:

A 2019-10-20T20:07:55Z [2019-10-20 20:07:55 +0000] [14] [INFO] Booting worker with pid: 14

A 2019-10-20T20:11:02Z [2019-10-20 20:04:14 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:14)
Run Code Online (Sandbox Code Playgroud)

我尝试通过在app.yaml文件中添加 -t 标志来增加工作超时,如下所示,但仍然不起作用:

runtime: python
instance_class: F4
env: flex
entrypoint: gunicorn -t 120 -b :$PORT app:app

liveness_check:
  initial_delay_sec: 500

readiness_check:
  app_start_timeout_sec: 500
Run Code Online (Sandbox Code Playgroud)

我什至尝试使用 eventlet 但它不起作用:

gunicorn -t 120 -b :$PORT app:app --worker-class eventlet --workers 3 
Run Code Online (Sandbox Code Playgroud)

Xao*_*Xao 11

尝试一下entrypoint: gunicorn -t 0 -b :$PORT app:app它对我有用。


Joh*_*ley 5

加载 350 MB pickle 数据文件的过程耗时太长,App Engine 认为您的实例已失败。您的容器启动时间超过三分钟。

你有一个不容易解决的问题。最大文件大小为 32 MB(Go 应用程序为 64 MB)。您正在将文件下载到内存中,但您的实例下载它的时间太长。

解决方案:我会使用不同的服务,例如 Cloud Run,您可以在其中将 pickle 数据文件嵌入到容器映像中,这样就不需要下载了。