Nie można używać OpenCV-Python w AWS Lambda

Sep 23 2020

Próbowałem wprowadzić OpenCV do wiadra S3, a następnie przypisać go do warstwy lambda.

W Internecie jest bardzo mało o tym, a to, co widziałem, nie działa.

Udało mi się używać dockera w środowisku amazon linux i postępowałem zgodnie z tym samouczkiem. https://aws.amazon.com/premiumsupport/knowledge-center/lambda-layer-simulated-docker/

Dodałem setuptools, wheel i opencv-python == 4.4.0.42 do pliku Requirements.txt.

setuptools i wheel z powodu wcześniejszego błędu, gdzie zaleceniem było uwzględnienie ich, ponieważ wymagają aktualizacji, mimo że je zaktualizowałem. Ale to działa z nimi, więc kto wie.

Utworzyłem obraz dockera, który spakowałem i umieściłem w wiadrze S3.

Ciągle otrzymuję {"errorMessage": "Nie można zaimportować modułu 'lambda_function': libGL.so.1: nie można otworzyć pliku obiektu współdzielonego: nie ma takiego pliku ani katalogu", "errorType": "Runtime.ImportModuleError"}, gdy go uruchamiam chociaż.

Nie mogę zrozumieć, co jest nie tak.

Jakieś pomysły?

Odpowiedzi

7 Marcin Sep 23 2020 at 06:59

Będziesz musiał dodać do swojej warstwy kilka zależności. Poniżej znajdują się kroki, których użyłem do opencv_python na lambdzie.

1. Na lokalnej stacji roboczej (okno terminala 1)

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

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

2. Na lokalnej stacji roboczej (okno terminala 2)


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

Powyższe polecenie przeniesie Cię do kontenera dockera.

Wewnątrz pojemnika:

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. Ponownie na lokalnej stacji roboczej (okno terminala 1)

Spakuj pythonfolder do mylayer.zip.

zip -r -9 mylayer.zip python

W konsoli AWS

  1. Utwórz warstwę lambda w oparciu o mylayer.zipkonsolę AWS. Nie zapomnij podać Compatible runtimesdo python3.8.

  2. Dodaj AWSLambda-Python38-SciPy1xdo swojej funkcji AWS zapewniającą warstwę SciPy i własną warstwę z cv2.

Będziesz miał więc dwie warstwy w swojej funkcji.

  1. Wykonaj podstawowy test warstwy w lambdzie za pomocą następującej funkcji lambda:
import cv2

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

Funkcja działa poprawnie (pokazano wydruk częściowy).

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