我有一个350 MB的Sklearn泡菜文件,我想在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)
泡菜在本地加载5-12秒,但在Google App Engine F4(1GB RAM)实例上,gunicorn
工作程序超时。
Google App Engine日志:
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泡菜数据文件的过程耗时太长,App Engine认为您的实例已失败。您的容器启动时间超过三分钟。
您有一个无法轻易解决的问题。最大文件大小为32 MB(Go应用程序为64 MB)。您正在将文件下载到内存中,但是您的实例下载时间太长。
解决方案:我将使用诸如Cloud Run之类的其他服务,您可以在其中将泡菜数据文件嵌入容器映像中,从而无需下载。