繁体   English   中英

为什么我的 Python 应用程序总是在 AWS lambda 上冷启动两次?

[英]Why does my Python app always cold start twice on AWS lambda?

我有一个 lambda,在 Python 中,我正在冷启动期间加载大型机器学习 model。 代码是这样的:

uuid = uuid4()
app_logger.info("Loading model... %s" % uuid)

endpoints.embedder.load()

def create_app() -> FastAPI:
    app = FastAPI()

    app.include_router(endpoints.router)

    return app

app_logger.info("Creating app... %s" % uuid)
app = create_app()
app_logger.info("Loaded app. %s" % uuid)
handler = Mangum(app)

部署后的第一次,AWS Lambda 似乎启动了两次不同的 UUID 看到的 Lambda。 这是日志:

2023-01-05 21:44:40.083 | INFO     | myapp.app:<module>:47 - Loading model... 76a5ac6f-a4fc-490e-b21c-83bb5ef458eb
2023-01-05 21:44:42.406 | INFO     | myapp.embedder:load:31 - Loading embedding model
2023-01-05 21:44:50.626 | INFO     | myapp.app:<module>:47 - Loading model... c633a9c6-bcfc-44d5-bacf-9834b39ee300
2023-01-05 21:44:51.878 | INFO     | myapp.embedder:load:31 - Loading embedding model
2023-01-05 21:45:00.418 | INFO     | myapp.app:<module>:59 - Creating app... c633a9c6-bcfc-44d5-bacf-9834b39ee300
2023-01-05 21:45:00.420 | INFO     | myapp.app:<module>:61 - Loaded app. c633a9c6-bcfc-44d5-bacf-9834b39ee300

这种情况一直发生。 它第一次执行 10 秒,然后似乎重新启动并再次执行。 日志中没有错误表明为什么会这样。 我将我的 Lambda 配置为使用 memory 的 4G 运行,并且它总是加载 < 3GB 使用。

任何想法为什么会发生这种情况以及如何避免它?

总结到目前为止评论中的所有知识:

  • AWS 将初始阶段限制为 10 秒。 这在这里解释: https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtime-environment.html
  • 如果应用程序超过 10 秒,它会在没有此限制的情况下再次启动
  • 如果您达到 10 秒的限制,有两种方法可以解决这个问题:
    • 在调用期间加载 function 后初始化 model。 缺点是您无法获得 CPU 提升和较低的初始化成本。
    • 使用预配的并发。 Init 不限于 10 秒,但这更昂贵并且仍然会遇到与不使用它相同的问题,例如,如果您的使用量激增。
  • 与 S3 和 Docker 层缓存相比,将我的 model 移至 EFS 确实缩短了启动时间,但不足以使其在 < 10 秒内初始化。 不过,它可能适用于模型稍小的其他用例。

也许有一天 SnapStart 会为 Python 解决这个问题。在那之前,我将回到 EC2。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM