Solución:
EDITAR: Como ha comentado @Marcin, la primera respuesta proporcionada funciona para paquetes de menos de 262 MB de tamaño.
A. Paquetes de Python dentro del límite de tamaño de la capa Lambda
También puede hacerlo con AWS sam cli y Docker (consulte este enlace para instalar SAM cli), para construir los paquetes dentro de un contenedor. Básicamente, inicializa una plantilla predeterminada con Python
como tiempo de ejecución y, a continuación, especifica los paquetes en el requirements.txt
expediente. Lo encontré más fácil que el artículo que mencionaste. Te dejo pasos si quieres considerarlos para uso futuro.
1. Inicialice una plantilla SAM predeterminada
En cualquier carpeta en la que desee mantener el proyecto, puede escribir
sam init
esto generará una serie de preguntas, para una configuración rápida elegiremos las Plantillas de inicio rápido de la siguiente manera
1 - AWS Quick Start Templates
2 - Python 3.8
Project name [sam-app]: your_project_name
1 - Hello World Example
Al elegir el Hello World Example
genera un valor predeterminado lambda function
con un requirements.txt
expediente. Ahora vamos a editar con el nombre del paquete que quieres, en este caso xgboost
2. Especifique los paquetes para instalar
cd your_project_name
code hello_world/requirements.txt
como tengo Visual Studio Code como editor, esto abrirá el archivo en él. Ahora, puedo especificar el xgboost
paquete
your_python_package
Aquí viene la razón para tener instalado Docker. Algunos paquetes confiaban C++
. Por lo tanto, se recomienda construir dentro de un contenedor (caso en Windows). Ahora, vaya a la carpeta donde template.yaml
se encuentra el archivo. Luego, escriba
sam build -u
3. Paquetes zip
hay algunos archivos que no desea que se incluyan en su capa lambda, porque solo queremos mantener las bibliotecas de Python. Por lo tanto, podría eliminar los siguientes archivos
rm .aws-sam/build/HelloWorldFunction/app.py
rm .aws-sam/build/HelloWorldFunction/__init__.py
rm .aws-sam/build/HelloWorldFunction/requirements.txt
y luego comprima el contenido restante de la carpeta.
cp -r .aws-sam/build/HelloWorldFunction/ python/
zip -r my_layer.zip python/
donde colocamos la capa en el python/
carpeta de acuerdo con los documentos En el sistema Windows, zip
el comando debe ser reemplazado por
Compress-Archive my_layer/ my_layer.zip.
4. Cargue su capa a AWS
En AWS, vaya a Lambda
, entonces escoge Layers
y Create Layer
. Ahora puedes subir tu .zip
archivo como muestra la imagen de abajo
Tenga en cuenta que para archivos zip de más de 50 MB, debe cargar el .zip
archivo a un depósito s3 y proporcione la ruta, por ejemplo, https://s3:amazonaws.com//mybucket/my_layer.zip
.
B. Paquetes de Python que superan los límites de la capa Lambda
los xgboost
el paquete por sí solo tiene más de 300 MB y arrojará el siguiente error
Como @Marcin ha señalado amablemente, el enfoque anterior con SAM cli no funcionaría directamente para las capas de Python que exceden el límite. Hay un problema abierto en github para especificar una imagen de Docker personalizada cuando se ejecuta sam build -u
y una posible solución para volver a etiquetar el predeterminado lambda/lambci
imagen.
Entonces, ¿cómo podríamos pasar por esto ?. Ya existen algunos recursos útiles que solo señalaría.
- Primero, el artículo de Medium que @Alex tomó como solución que sigue este código de repositorio.
- En segundo lugar, el enfoque alexeybutyrev que funciona aplicando el comando strip para reducir el tamaño de las bibliotecas. Se puede encontrar este enfoque en un repositorio de github, se proporcionan las instrucciones.
Editar (diciembre de 2020)
Este mes, AWS lanza compatibilidad con imágenes de contenedor para AWS Lambda. Siguiendo la siguiente estructura de árbol para su proyecto
Project/
|-- app/
| |-- app.py
| |-- requirements.txt
| |-- xgb_trained.bin
|-- Dockerfile
Puede implementar un modelo XGBoost con la siguiente imagen de Docker. Siga las instrucciones de este repositorio para obtener una explicación detallada.
# 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" ]