Não é possível usar OpenCV-Python no AWS Lambda

Sep 23 2020

Tenho tentado obter o OpenCV em um balde S3 e, em seguida, atribuí-lo a uma camada lambda.

Há muito pouco sobre isso online e o que eu vi não funcionou.

Consegui usar o docker com o ambiente Linux do Amazon e segui este tutorial. https://aws.amazon.com/premiumsupport/knowledge-center/lambda-layer-simulated-docker/

Adicionei setuptools, wheel e opencv-python == 4.4.0.42 ao arquivo requirements.txt.

setuptools e wheel por causa de um erro anterior em que a recomendação era incluí-los porque eles precisam de atualização, embora eu os tenha atualizado. Mas funciona com eles, quem sabe.

Criei a imagem da janela de encaixe que compactei e coloquei em um balde S3.

Continuo recebendo {"errorMessage": "Não é possível importar o módulo 'lambda_function': libGL.so.1: não é possível abrir o arquivo de objeto compartilhado: Não existe esse arquivo ou diretório", "errorType": "Runtime.ImportModuleError"} quando o executo Apesar.

Não consigo descobrir o que está errado.

Alguma ideia?

Respostas

7 Marcin Sep 23 2020 at 06:59

Você precisará adicionar várias dependências à sua camada. Abaixo estão as etapas que usei para opencv_python em lambda.

1. Na estação de trabalho local (janela do terminal 1)

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

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

2. Na estação de trabalho local (janela do terminal 2)


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

O comando acima o colocará no contêiner do docker.

Dentro do contêiner:

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. Na estação de trabalho local novamente (janela do terminal 1)

Empacote a pythonpasta em mylayer.zip.

zip -r -9 mylayer.zip python

No console AWS

  1. Crie a camada lambda com base no mylayer.zipAWS Console. Não se esqueça de especificar Compatible runtimespara python3.8.

  2. Adicione camada AWS fornecer SciPy AWSLambda-Python38-SciPy1xe sua própria camada com cv2 em sua função.

Portanto, você terá duas camadas em sua função.

  1. Execute o teste básico da camada em lambda usando a seguinte função lambda:
import cv2

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

A função é executada corretamente (impressão parcial mostrada).

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