Saltar al contenido

¿Cómo crear una capa Python de AWS Lambda? (Ejemplo de uso con XGBoost)

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

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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" ]
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *