AWS Lambda'da OpenCV-Python kullanılamaz

Sep 23 2020

OpenCV'yi bir S3 kovasına almaya ve ardından onu bir lambda katmanına atamaya çalışıyorum.

İnternette bununla ilgili çok az şey var ve gördüklerim işe yaramadı.

Docker'ı amazon linux ortamında kullanmayı başardım ve bu öğreticiyi takip ettim. https://aws.amazon.com/premiumsupport/knowledge-center/lambda-layer-simulated-docker/

Gereksinimleri.txt dosyasına setuptools, wheel ve opencv-python == 4.4.0.42 ekledim.

Kurulum araçları ve tekerlek, daha önceki bir hata nedeniyle, tavsiyenin bunları güncellememe rağmen, bunların güncellenmesi gerektiğinden dahil edilmesidir. Ama onlarla çalışıyor, kim bilir.

Sıkıştırdığım ve bir S3 kovasına koyduğum docker görüntüsünü oluşturdum.

Çalıştırdığımda {"errorMessage": "'lambda_function' modülü içe aktarılamıyor: libGL.so.1: paylaşılan nesne dosyası açılamıyor: Böyle bir dosya veya dizin yok", "errorType": "Runtime.ImportModuleError"} alıyorum rağmen.

Neyin yanlış olduğunu anlayamıyorum.

Herhangi bir fikir?

Yanıtlar

7 Marcin Sep 23 2020 at 06:59

Katmanınıza bir dizi bağımlılık eklemeniz gerekecek. Lambda üzerinde opencv_python için kullandığım adımlar aşağıdadır.

1. Yerel iş istasyonunda (terminal penceresi 1)

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

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

2. Yerel iş istasyonunda (terminal penceresi 2)


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

Yukarıdaki komut sizi docker konteynerine koyacaktır.

Kabın içinde:

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. Yerel iş istasyonunda tekrar (terminal penceresi 1)

pythonKlasörü içine paketleyin mylayer.zip.

zip -r -9 mylayer.zip python

AWS konsolunda

  1. mylayer.zipAWS Konsolu'na dayalı olarak lambda katmanı oluşturun . Belirtmek unutmayın Compatible runtimesetmek python3.8.

  2. AWS'yi, SciPy katmanını AWSLambda-Python38-SciPy1xve kendi katmanınızı cv2 ile işlevinize ekleyin.

Böylece işlevinizde iki katmana sahip olacaksınız .

  1. Aşağıdaki lambda işlevini kullanarak katmanın lambda'da temel testini gerçekleştirin:
import cv2

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

İşlev doğru şekilde yürütülür (kısmi çıktı gösterilmiştir).

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