No se puede usar OpenCV-Python en AWS Lambda

Sep 23 2020

He intentado introducir OpenCV en un bucket de S3 y luego asignarlo a una capa lambda.

Hay muy poco sobre esto en línea y lo que he visto no ha funcionado.

Me las arreglé para usar Docker con el entorno de Amazon Linux y seguí este tutorial. https://aws.amazon.com/premiumsupport/knowledge-center/lambda-layer-simulated-docker/

Agregué setuptools, wheel y opencv-python == 4.4.0.42 al archivo requirements.txt.

setuptools y wheel debido a un error anterior en el que la recomendación era incluirlos ya que necesitan actualización, aunque los he actualizado. Pero funciona con ellos, así que quién sabe.

Creé la imagen de la ventana acoplable que comprimí y puse en un cubo de S3.

Sigo recibiendo {"errorMessage": "No se puede importar el módulo 'lambda_function': libGL.so.1: no se puede abrir el archivo de objeto compartido: no existe ese archivo o directorio", "errorType": "Runtime.ImportModuleError"} cuando lo ejecuto aunque.

Parece que no puedo entender qué está mal.

¿Algunas ideas?

Respuestas

7 Marcin Sep 23 2020 at 06:59

Deberá agregar un montón de dependencias a su capa. A continuación se muestran los pasos que he usado para opencv_python en lambda.

1. En la estación de trabajo local (ventana de terminal 1)

mkdir /tmp/mylayer && cd /tmp/mylayer

echo opencv-python==4.4.0.42 > ./requirements.txt

2. En la estación de trabajo local (ventana de terminal 2)


docker run -it -v /tmp/mylayer:/mylayer  lambci/lambda:build-python3.8 bash

El comando anterior lo colocará en el contenedor de la ventana acoplable.

Dentro del contenedor:

cd /mylayer

pip install --no-deps -t python/lib/python3.8/site-packages/ -r requirements.txt

yum install -y mesa-libGL

cp -v /usr/lib64/libGL.so.1 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGL.so.1.7.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libgthread-2.0.so.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libgthread-2.0.so.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libglib-2.0.so.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGLX.so.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libX11.so.6 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libXext.so.6 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGLdispatch.so.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGLESv1_CM.so.1.2.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGLX_mesa.so.0.0.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGLESv2.so.2.1.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libxcb.so.1 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libXau.so.6 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libXau.so.6 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /lib64/libGLdispatch.so.0.0.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/

3. En la estación de trabajo local nuevamente (ventana de terminal 1)

Empaque la pythoncarpeta en mylayer.zip.

zip -r -9 mylayer.zip python

En la consola de AWS

  1. Cree una capa lambda basada en mylayer.zipen la consola de AWS. No se olvide de especificar Compatible runtimesa python3.8.

  2. Agregue la capa SciPy de AWS AWSLambda-Python38-SciPy1xy su propia capa con cv2 a su función.

Entonces tendrás dos capas en tu función.

  1. Realice la prueba básica de la capa en lambda usando la siguiente función lambda:
import cv2

def lambda_handler(event, context):    
    print(dir(csv))

La función se ejecuta correctamente (se muestra una impresión parcial).

slation3D', 'exp', 'extractChannel', 'fastAtan2', 'fastNlMeansDenoising', 'fastNlMeansDenoisingColored', 'fastNlMeansDenoisingColoredMulti', 'fastNlMeansDenoisingMulti', 'fillConvexPoly', 'fillPoly', 'filter2D', 'filterHomographyDecompByVisibleRefpoints', 'filterSpeckles', 'find4QuadCornerSubpix', 'findChessboardCorners', 'findChessboardCornersSB', 'findChessboardCornersSBWithMeta', 'findCirclesGrid', 'findContours', 'findEssentialMat', 'findFundamentalMat', 'findHomography', 'findNonZero', 'findTransformECC', 'fisheye', 'fitEllipse', 'fitEllipseAMS', 'fitEllipseDirect', 'fitLine', 'flann', 'flann_Index', 'flip', 'floodFill', 'gemm', 'getAffineTransform', 'getBuildInformation', 'getCPUFeaturesLine', 'getCPUTickCount', 'getDefaultNewCameraMatrix', 'getDerivKernels', 'getFontScaleFromHeight', 'getGaborKernel', 'getGaussianKernel', 'getHardwareFeatureName', 'getNumThreads', 'g