模型需要很长时间才能加载到 GCP 应用引擎上并且工作人员会重新启动

Models taking long to load on GCP app engine and workers restarting

所以我遇到的问题是,一个 运行 烧瓶 API 的应用引擎实例陷入了无休止的 worker 重启循环,并且一直没有响应,这提示应用引擎扩展和添加实例(最多 20 个!)。

flask API 服务于多个机器学习模型,这些模型必须一个接一个地加载。加载其中一个模型显然花费了很长时间,导致工人被终止。日志基本上显示了这一点:

    A 2020-03-20T14:42:23Z [2020-03-20 14:42:23 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:2952)
    A 2020-03-20T14:42:23Z [2020-03-20 14:42:23 +0000] [2952] [INFO] Worker exiting (pid: 2952)
    A 2020-03-20T14:42:24Z [2020-03-20 14:42:24 +0000] [2975] [INFO] Booting worker with pid: 2975

在 app.yaml 中更改这些设置没有效果,因为它们处于更高级别:

liveness_check:
  initial_delay_sec: 300
  check_interval_sec: 30
  timeout_sec: 4
  failure_threshold: 4
  success_threshold: 2
readiness_check:
  check_interval_sec: 5
  timeout_sec: 4
  failure_threshold: 2
  success_threshold: 2
  app_start_timeout_sec: 300

快速 google 之后,超时似乎更有可能是 gunicorn workers 运行 陷入迷雾。我发现 these docs 允许我以秒为单位设置超时时间。

瞧瞧。在我的 app.yaml 文件中,我添加了 -t 75 并且能够解决问题。事实证明,其中一个较旧的模型——一个大的朴素贝叶斯分类器——甚至需要大约 50 秒才能加载。

我的app.yaml:

entrypoint: gunicorn -b :$PORT main:app -t 75

我看到有些人 运行 App Engine 上的 flask API 在某些变体中也遇到了这个问题,所以我想我会提供这个额外的面包屑。

您应该设置 --timeout 0 无限超时。

当 App Engine 缩减实例并认为工作人员超时时,gunicorn 仲裁者会感到困惑。

App Engine 有自己的主管来监督超时(超时时间更长),因此 Gunicorn 没有必要处理工作超时。