问题描述
我正在使用 tensorflow 中心模型“通用句子编码器”,有时应用引擎会自动关闭,再次加载此模型需要更多时间。如何让该模型留在内存中?
runtime: python
env: flex
runtime_config:
python_version: 3
automatic_scaling:
min_num_instances: 1
max_num_instances: 1
cpu_utilization:
target_utilization: 1
readiness_check:
app_start_timeout_sec: 1800
liveness_check:
path: "/liveness_check"
check_interval_sec: 30
resources:
cpu: 1
memory_gb: 6
disk_size_gb: 15
entrypoint: gunicorn -k uvicorn.workers.UvicornWorker -w 4 app.main:app --timeout 1000
日志:
A 2021-03-22T10:53:59Z [2021-03-22 10:53:59 +0000] [8] [INFO] Started server process [8]
A 2021-03-22T10:53:59Z [2021-03-22 10:53:59 +0000] [8] [INFO] Waiting for application startup.
A 2021-03-22T10:53:59Z [2021-03-22 10:53:59 +0000] [8] [INFO] Application startup complete.
A 2021-03-22T11:01:03Z [2021-03-22 11:01:03 +0000] [1] [INFO] Handling signal: term
A 2021-03-22T11:01:03Z [2021-03-22 11:01:03 +0000] [8] [INFO] Shutting down
A 2021-03-22T11:01:03Z [2021-03-22 11:01:03 +0000] [8] [INFO] Error while closing socket [Errno 9] Bad file descriptor
A 2021-03-22T11:01:04Z [2021-03-22 11:01:04 +0000] [8] [INFO] Waiting for application shutdown.
A 2021-03-22T11:01:04Z [2021-03-22 11:01:04 +0000] [8] [INFO] Application shutdown complete.
A 2021-03-22T11:01:04Z [2021-03-22 11:01:04 +0000] [8] [INFO] Finished server process [8]
A 2021-03-22T11:01:04Z [2021-03-22 11:01:04 +0000] [8] [INFO] Worker exiting (pid: 8)
解决方法
使用 App Engine flex,您的应用程序会在部署时启动(因为最小实例为 1,您总是有 1 个实例启动)。在您的启动例程中,将模型加载添加到内存中并将其保存在全局变量中。这样,您在服务上收到的任何请求都可以使用它。
但是有一些警告:
- App Engine flex 在 least once a week 重新启动以更新底层平台。因此,至少每周一次,您的实例将重新启动。但是因为你在启动时加载你的模态,所以不用担心请求响应时间!
- 当服务扩展时(不是您的情况),会创建一个新实例,因此模型会再次加载到内存中
- 同样,如果您的实例崩溃(例如内存不足或未处理的异常),则会创建一个新实例,因此此时将再次加载模型。