繁体   English   中英

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

[英]How to create any AWS Lambda Python Layer? (Usage example with XGBoost)

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

我从这里( https://github.com/alexeybutyrev/aws_lambda_xgboost )抓取 xgboost 的 zip 及其依赖项并将其加载到层中。 当我尝试测试我的 lambda 时,我收到此错误:

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

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

有没有人在使用 AWS Lambda 之前遇到过这个错误?

编辑:正如@Marcin 所说,提供的第一个答案适用于 262 MB 以下的包。

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

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

1.初始化一个默认的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 ,它会生成默认lambda functionrequirements.txt文件。 现在,我们将使用您想要的 package 的名称进行编辑,在本例中xgboost

2.指定要安装的包

cd your_project_name
code hello_world/requirements.txt

因为我有 Visual Studio Code 作为编辑器,这将打开它上面的文件。 现在,我可以指定xgboost package

your_python_package

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

sam build -u

3. Zip 封装

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

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

然后 zip 文件夹的剩余内容。

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

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

4. 将您的层上传到 AWS

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

在此处输入图像描述

Notice that for zip files over 50 MB, you should upload the .zip file to an s3 bucket and provide the path, for exampl, https://s3:amazonaws.com//mybucket/my_layer.zip .

B. 超出 Lambda 层限制的 Python 包

xgboost package 本身超过 300 MB 会抛出以下错误

在此处输入图像描述

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

那么,我们怎么能通过这个呢? 我只想指出一些有用的资源。

  • 首先,@Alex 采用的Medium文章作为遵循此repo 代码的解决方案。
  • 其次, alexeybutyrev方法通过应用strip命令来减少库大小。 可以在 github repo下找到这种方法,提供了说明。

编辑(2020 年 12 月)

本月 AWS 发布了对 AWS Lambda 的容器映像支持。 遵循项目的下一个树结构

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

您可以使用以下 Docker 映像部署 XGBoost model。 请按照此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" ]

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

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

暂无
暂无

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

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