OpenCV-Python kann in AWS Lambda nicht verwendet werden
Ich habe versucht, OpenCV in einen S3-Bucket zu bringen und es dann einer Lambda-Schicht zuzuweisen.
Es gibt sehr wenig darüber online und was ich gesehen habe, hat nicht funktioniert.
Ich habe es geschafft, Docker mit der Amazon Linux-Umgebung zu verwenden, und bin diesem Tutorial gefolgt. https://aws.amazon.com/premiumsupport/knowledge-center/lambda-layer-simulated-docker/
Ich habe setuptools, Wheel und opencv-python == 4.4.0.42 zur Datei require.txt hinzugefügt.
Setuptools und Wheel aufgrund eines früheren Fehlers, bei dem empfohlen wurde, diese einzuschließen, da sie aktualisiert werden müssen, obwohl ich sie aktualisiert habe. Aber es funktioniert mit ihnen, also wer weiß.
Erstellt das Docker-Image, das ich gezippt und in einen S3-Bucket gestellt habe.
Ich erhalte immer wieder {"errorMessage": "Modul 'lambda_function' kann nicht importiert werden: libGL.so.1: freigegebene Objektdatei kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis", "errorType": "Runtime.ImportModuleError"}, wenn ich es ausführe obwohl.
Ich kann nicht herausfinden, was los ist.
Irgendwelche Ideen?
Antworten
Sie müssen Ihrer Ebene eine Reihe von Abhängigkeiten hinzufügen. Unten sind die Schritte aufgeführt, die ich für opencv_python auf Lambda verwendet habe.
1. Auf lokaler Workstation (Terminalfenster 1)
mkdir /tmp/mylayer && cd /tmp/mylayer
echo opencv-python==4.4.0.42 > ./requirements.txt
2. Auf lokaler Workstation (Terminalfenster 2)
docker run -it -v /tmp/mylayer:/mylayer lambci/lambda:build-python3.8 bash
Der obige Befehl versetzt Sie in den Docker-Container.
Im Behälter:
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. Wieder auf der lokalen Workstation (Terminalfenster 1)
Packen Sie den pythonOrdner in mylayer.zip.
zip -r -9 mylayer.zip python
In der AWS-Konsole
Erstellen Sie eine Lambda-Ebene basierend auf
mylayer.zipder AWS-Konsole. Vergessen Sie nicht angebenCompatible runtimeszupython3.8.Fügen Sie AWS hinzu, um SciPy-Ebene
AWSLambda-Python38-SciPy1xund Ihre eigene Ebene mit cv2 in Ihre Funktion aufzunehmen.
Sie haben also zwei Ebenen in Ihrer Funktion.
- Führen Sie einen Basistest der Schicht in Lambda mit der folgenden Lambda-Funktion durch:
import cv2
def lambda_handler(event, context):
print(dir(csv))
Die Funktion wird korrekt ausgeführt (Teilausdruck angezeigt).
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