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

6
我正在使用Lambda处理程序加载一个已经pickle的机器学习模型,所以我需要sklearn(如果不含有它会得到“ModuleNotFoundError:No module named'sklearn'”)。因此,我创建了一个新的Docker部署包,其中包括sklearn。但是,当我尝试上传新的lambda.zip文件时,无法保存lambda函数。我收到错误消息:“未压缩大小必须小于262144000字节”。我进行了一些谷歌搜索,并找到了两个建议:(1)使用CLFAG和PIP和(2)使用Lambda层。我认为层不起作用。将部署包的某些部分移动到层中不会减少总大小(AWS文档指出,“函数和所有层的总未压缩大小不能超过250 MB的未压缩部署包大小限制”。)

CFLAGS听起来很有前途,但我以前从未使用过CFLAGS,而且我一直在遇到错误。

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

在使用CFLAGS之前,我的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 deploy
  3. cd deploy
  4. pip3 install requests pandas s3fs datetime bs4 sklearn -t ./
  5. zip -r lambda.zip *

你最终解决了这个问题吗? - coderboi
@coderboi,你有什么进展吗?你尝试过使用Docker Lambda吗? - Marcin
5个回答

5
这有点是一个答案(我能够缩小我的部署包并成功部署Lambda),但也有点不是一个答案(我仍然不知道如何使用CFLAGS)。大量的谷歌搜索最终让我找到了这篇文章,其中包含这个模块列表的链接,这些模块预先安装在AWS Lambda Python环境中。我的部署包包含了一些已经存在于AWS Lambda环境中的模块,因此不需要包含在部署包中。对我节省空间的模块是Boto3和Botocore。我没有在我的Docker环境中明确添加它们,但它们以某种方式进入了我的部署包中(我猜测S3FS依赖这些模块,在安装S3FS时它们也会被添加)。
我也能够删除许多较小的模块(datetime、dateutil、docutils、six等)。这些模块被删除后,我的软件包在250MB的限制下,我可以进行部署。
如果我仍然没有达到限制 - 我不确定是否足够 - 我将尝试上面链接文章中的另一个建议:从部署包中删除.py文件(您不需要同时拥有.pyc和.py文件)。
希望这可以帮助您减小Lambda部署包的大小!

它可以工作,但是不建议删除boto和botocore - serverlessops.io/blog/aws-lambda-and-python-boto3-bundling - Vic

4

1
我们自己遇到了这个问题,但是使用的是Spacy而不是sklearn。
您正在正确地寻找不部署已包含在AWS部署中的软件包的方法,但请注意,有时这仍然无法使您满足限制(特别是对于需要包括大型模型作为依赖项的机器学习目的)。
在这些情况下,另一个选择是将库使用的任何外部静态文件(例如模型等)保存在私有S3存储桶中,然后在运行时读取它们。例如,如this answer.所述。
顺便说一下,如果您正在使用serverless framework部署lambda函数,应该检查serverless-python-requirements插件,它允许您实现您描述的步骤,例如指定不要与函数一起部署的包并构建依赖项的“精简”版本(自动剥离.so文件、pycache和dist-info目录以及.pyc和.pyo文件。)
祝您好运 :)

0

我发现这篇文章提到了CFLAGS的使用。在评论中,一个名叫Jesper的人解释了如何引用CFLAGS:

如果其他人怀疑如何将CFLAGS添加到pip中,这是我的做法: 在运行pip之前(我在Ubuntu上这样做):

export CFLAGS="$CFLAGS -Os -g0 -Wl,--strip-all -I/usr/include:/usr/local/include -L/usr/lib:/usr/local/lib"

export CXXFLAGS="$CXXFLAGS -Os -g0 -Wl,--strip-all -I/usr/include:/usr/local/include -L/usr/lib:/usr/local/lib"

然后像这样运行 pip(针对 numpy,但可以针对任何其他软件包):
pip install numpy --no-cache-dir --compile --global-option=build_ext

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接