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
它对我有用。
我有一个 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
它对我有用。