使用 CFLAGS 和 PIP 缩小 AWS Lambda 部署包以适应 sklearn

tjc*_*jc4 7 python pip amazon-web-services scikit-learn aws-lambda

我正在使用 Lambda 处理程序加载腌制的机器学习模型,因此我需要 sklearn(如果未包含,我会收到“ModuleNotFoundError:没有名为 'sklearn' 的模块”)

因此,我使用 sklearn 在 Docker 中创建了一个新的部署包。

但是当我尝试上传新的 lambda.zip 文件时,我无法保存 lambda 函数。我收到错误:解压后的大小必须小于 262144000 字节

我做了一些谷歌搜索,发现了两个建议:(1)将 CLFAG 与 PIP 结合使用,(2)使用 Lambda Layers

我不认为图层会起作用。将我的部署包的部分内容移动到层不会减少总大小(并且AWS 文档指出“函数和所有层的解压缩总大小不能超过解压部署包大小限制 250 MB”。

CFLAGS 听起来很有希望,但我以前从未使用过 CFLAGS,并且遇到了错误。

我正在尝试添加标志:-Os -g0 -Wl,--strip-all

在 CLFAGS 之前,我的 docker pip 命令是:pip3 install requests pandas s3fs datetime bs4 sklearn -t ./

首先我尝试:pip3 install requests pandas s3fs datetime bs4 sklearn -t -Os -g0 -Wl,--strip-all ./

这产生了各种错误“没有这样的选项:-g”

然后我尝试了CFLAGS = -Os -g0 -Wl,--strip-all pip3 install requests pandas s3fs datetime bs4 sklearn -t ./CFLAGS = -Os -g0 -Wl,--strip-all

但他们产生了错误“CFLAGS:找不到命令”

谁能帮助我了解如何使用 CFLAGS?

另外,我很熟悉“乞丐不能挑剔”这句话,所以任何建议将不胜感激。

也就是说,我有点菜鸟,所以如果您能在我的 Docker 部署包工作流程的上下文中帮助我使用 CFLAGS,我将不胜感激。

我的 Docker 工作流程是:

  1. docker run -it olivierhervieu/amazonlinux-python36-onbuild
  2. mkdir部署
  3. cd 部署
  4. pip3 安装请求 pandas s3fs datetime bs4 sklearn -t ./
  5. zip -r lambda.zip *

tjc*_*jc4 5

这有点是一个答案(我能够缩小我的部署包并部署我的 Lambda),但有点不是一个答案(我仍然不知道如何使用 CFLAGS)。

经过大量谷歌搜索,我最终找到了这篇文章,其中包含指向 AWS Lambda Python 环境中预安装的 模块列表的链接。

我的部署包包含 AWS Lambda 环境中已存在的多个模块,因此不需要包含在部署包中。

为我节省最多空间的模块是 Boto3 和 Botocore。我没有明确地将这些添加到我的 Docker 环境中,但它们无论如何都进入了我的部署包(我猜测 S3FS 依赖于这些模块,并且在安装 S3FS 时也会添加它们)。

我还能够删除许多较小的模块(datetime、dateutil、docutils、6 等)。删除这些模块后,我的包低于 250mb 限制,并且我能够进行部署。

如果我仍然没有低于限制 - 我不确定这是否足够 - 我将尝试上面链接文章中的另一个建议:从部署包中删除 .py 文件(您不需要同时使用 .pyc 和.py 文件)。

希望这对您的 Lambda 部署包大小有所帮助!