ไม่สามารถใช้ OpenCV-Python ใน AWS Lambda

Sep 23 2020

ฉันพยายามทำให้ OpenCV เป็นที่เก็บข้อมูล S3 แล้วกำหนดให้กับเลเยอร์แลมบ์ดา

มีเพียงเล็กน้อยเกี่ยวกับเรื่องนี้ทางออนไลน์และสิ่งที่ฉันเห็นก็ไม่ได้ผล

ฉันจัดการเพื่อใช้นักเทียบท่ากับสภาพแวดล้อม amazon linux แล้วและทำตามบทช่วยสอนนี้ https://aws.amazon.com/premiumsupport/knowledge-center/lambda-layer-simulated-docker/

ฉันได้เพิ่ม setuptools, wheel และ opencv-python == 4.4.0.42 ลงในไฟล์ requirements.txt

setuptools และ wheel เนื่องจากเกิดข้อผิดพลาดก่อนหน้านี้ซึ่งคำแนะนำคือให้รวมสิ่งเหล่านี้ไว้ด้วยเนื่องจากจำเป็นต้องอัปเดตแม้ว่าฉันจะอัปเดตแล้วก็ตาม แต่มันใช้ได้กับพวกเขาดังนั้นใครจะรู้

สร้างอิมเมจนักเทียบท่าที่ฉันบีบอัดและใส่ในถัง S3

ฉันได้รับ {"errorMessage": "Unable to import module 'lambda_function': libGL.so.1: can't open shared object file: No such file or directory", "errorType": "Runtime.ImportModuleError"} เมื่อฉันเรียกใช้ แม้ว่า

ดูเหมือนจะคิดไม่ออกว่ามีอะไรผิดปกติ

ความคิดใด ๆ ?

คำตอบ

7 Marcin Sep 23 2020 at 06:59

คุณจะต้องเพิ่มการอ้างอิงจำนวนมากในเลเยอร์ของคุณ ด้านล่างนี้เป็นขั้นตอนที่ฉันใช้สำหรับ opencv_python บนแลมบ์ดา

1. บนเวิร์กสเตชันท้องถิ่น (หน้าต่างเทอร์มินัล 1)

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

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

2. บนเวิร์กสเตชันท้องถิ่น (หน้าต่างเทอร์มินัล 2)


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

คำสั่งดังกล่าวจะนำคุณเข้าไปในคอนเทนเนอร์นักเทียบท่า

ภายในภาชนะ:

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. บนเวิร์กสเตชันท้องถิ่นอีกครั้ง (หน้าต่างเทอร์มินัล 1)

แพ็คpythonโฟลเดอร์ลงในmylayer.zip.

zip -r -9 mylayer.zip python

ในคอนโซล AWS

  1. สร้างแลมบ์ดาเลเยอร์ตามmylayer.zipใน AWS Console อย่าลืมที่จะระบุไปCompatible runtimespython3.8

  2. เพิ่ม AWS ให้เลเยอร์ SciPy AWSLambda-Python38-SciPy1xและเลเยอร์ของคุณเองพร้อม cv2 ลงในฟังก์ชันของคุณ

ดังนั้นคุณจะมีสองชั้นในฟังก์ชันของคุณ

  1. ทำการทดสอบพื้นฐานของเลเยอร์ในแลมบ์ดาโดยใช้ฟังก์ชันแลมด้าต่อไปนี้:
import cv2

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

ฟังก์ชันจะดำเนินการอย่างถูกต้อง (แสดงการพิมพ์บางส่วน)

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