OpenCV-Python kann in AWS Lambda nicht verwendet werden

Sep 23 2020

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

7 Marcin Sep 23 2020 at 06:59

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

  1. Erstellen Sie eine Lambda-Ebene basierend auf mylayer.zipder AWS-Konsole. Vergessen Sie nicht angeben Compatible runtimeszu python3.8.

  2. 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.

  1. 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