Google 加载大型 pickle 时,Flask 应用程序中的 App Engine gunicorn worker 超时?

Google App Engine gunicorn worker timeout in Flask app when loading a large pickle?

我有一个 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)

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

Google App 引擎日志:

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)

我尝试通过在 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

我什至尝试使用 eventlet 但它没有用:

gunicorn -t 120 -b :$PORT app:app --worker-class eventlet --workers 3 

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

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

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

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