如何创建任何AWS Lambda Python层?(XGBoost的使用示例)

2024-10-05 11:08:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我在为xgboost库创建lambda层时遇到问题。我正在运行:

我从这里(https://github.com/alexeybutyrev/aws_lambda_xgboost)抓取xgboost及其依赖项的压缩包,并将其加载到一个层中。当我尝试测试lambda时,出现以下错误:

Unable to import module 'lambda_function': No module named 'xgboost.core'

看起来__init__.py正试图通过from .core import <stuff>引用core.py

以前有人在AWS Lambda中遇到过此错误吗


Tags: tolambdapyhttpscoreimportgithubcom
2条回答

编辑:正如@Marcin所说,第一个答案提供了适用于262MB以下大容量软件包的作品

A.Lambda层大小限制内的Python包

您还可以使用AWS sam cli和Docker(请参见此link安装sam cli)在容器中构建包。基本上,您使用Python作为运行时初始化默认模板,然后在requirements.txt文件下指定包。我发现这比你提到的那篇文章容易。如果你想考虑它们以供将来使用,我会让你采取步骤。

一,。初始化默认SAM模板

在要保留项目的任何文件夹下,可以键入

sam init

这将引发一系列问题,对于快速设置,我们将选择以下快速启动模板

1 - AWS Quick Start Templates

2 - Python 3.8

Project name [sam-app]: your_project_name

1 - Hello World Example

通过选择Hello World Example,它会生成一个带有requirements.txt文件的默认lambda function。现在,我们将使用您想要的包的名称进行编辑,在本例中为xgboost

二,。指定要安装的软件包

cd your_project_name
code hello_world/requirements.txt

由于我使用visualstudio代码作为编辑器,这将打开其中的文件。现在,我可以指定xgboost

your_python_package

下面是安装Docker的原因。一些包依赖于C++。因此,建议在容器内构建(Windows上的案例)。现在,移动到template.yaml文件所在的文件夹。然后,输入

sam build -u

三,。拉链包装

有些文件不希望包含在lambda层中,因为我们只希望保留python库。因此,您可以删除以下文件

rm .aws-sam/build/HelloWorldFunction/app.py
rm .aws-sam/build/HelloWorldFunction/__init__.py
rm .aws-sam/build/HelloWorldFunction/requirements.txt

然后压缩文件夹的剩余内容

cp -r .aws-sam/build/HelloWorldFunction/ python/
zip -r my_layer.zip python/

我们根据docs将层放置在python/文件夹中 在Windows系统上zip命令应替换为 Compress-Archive my_layer/ my_layer.zip.

四,。将图层上载到AWS

在AWS上转到Lambda,然后选择LayersCreate Layer。现在,您可以上传.zip文件,如下图所示

enter image description here

注意,对于超过50MB的zip文件,您应该将.zip文件上载到s3存储桶,并提供路径,例如https://s3:amazonaws.com//mybucket/my_layer.zip

B.超过Lambda层限制的Python包

xgboost包本身超过300MB,将抛出以下错误

enter image description here

正如@Marcin善意地指出的,SAM cli的先前方法不会直接适用于超出限制的Python层。运行sam build -ugithub上存在一个未解决的问题,即指定自定义docker映像,以及可能的解决方案重新标记默认lambda/lambci映像

那么,我们怎样才能度过这一关呢?。我只想指出一些有用的资源

  • 首先,@Alex采用的Medium文章作为这个repo code之后的解决方案
  • 第二种是alexeybutyrev方法,它通过应用strip命令来减小库的大小。可以在github repo下找到这种方法,提供了说明

编辑(2020年12月)

本月AWS发布了对AWS Lambda的container Image支持。遵循项目的下一个树结构

Project/
|  app/
|   |  app.py
|   |  requirements.txt
|   |  xgb_trained.bin
|  Dockerfile
 

您可以使用以下Docker映像部署XGBoost模型。按照本repo说明进行详细说明

# Dockerfile based on https://docs.aws.amazon.com/lambda/latest/dg/images-create.html

# Define global args
ARG FUNCTION_DIR="/function"
ARG RUNTIME_VERSION="3.6"

# Choose buster image
FROM python:${RUNTIME_VERSION}-buster as base-image

# Install aws-lambda-cpp build dependencies
RUN apt-get update && \
  apt-get install -y \
  g++ \
  make \
  cmake \
  unzip \
  libcurl4-openssl-dev \
  git


# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Create function directory
RUN mkdir -p ${FUNCTION_DIR}

# Copy function code
COPY app/* ${FUNCTION_DIR}/

# Install python dependencies and runtime interface client
RUN python${RUNTIME_VERSION} -m pip install \
                    target ${FUNCTION_DIR} \
                    no-cache-dir \
                   awslambdaric \
                   -r ${FUNCTION_DIR}/requirements.txt

# Install xgboost from source
RUN git clone  recursive https://github.com/dmlc/xgboost
RUN cd xgboost; make -j4; cd python-package; python${RUNTIME_VERSION} setup.py install; cd;

# Multi-stage build: grab a fresh copy of the base image
FROM base-image

# Include global arg in this stage of the build
ARG FUNCTION_DIR

# Set working directory to function root directory
WORKDIR ${FUNCTION_DIR}

# Copy in the build image dependencies
COPY  from=base-image ${FUNCTION_DIR} ${FUNCTION_DIR}

ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ]

CMD [ "app.handler" ]

所以我一直无法弄清楚它为什么会以这种方式失败。我发现有效的解决方案是创建一个运行AmazonLinux的EC2实例,在那里安装并压缩库,然后保存到S3。有关详细说明,请参见此处:

https://medium.com/@lucashenriquessilva/how-to-create-a-aws-lambda-python-layer-db2830e08b12

相关问题 更多 >

    热门问题