Nie można używać OpenCV-Python w AWS Lambda
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
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
Utwórz warstwę lambda w oparciu o
mylayer.zipkonsolę AWS. Nie zapomnij podaćCompatible runtimesdopython3.8.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.
- 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