ไม่สามารถใช้ OpenCV-Python ใน AWS Lambda
ฉันพยายามทำให้ 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"} เมื่อฉันเรียกใช้ แม้ว่า
ดูเหมือนจะคิดไม่ออกว่ามีอะไรผิดปกติ
ความคิดใด ๆ ?
คำตอบ
คุณจะต้องเพิ่มการอ้างอิงจำนวนมากในเลเยอร์ของคุณ ด้านล่างนี้เป็นขั้นตอนที่ฉันใช้สำหรับ 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
สร้างแลมบ์ดาเลเยอร์ตาม
mylayer.zipใน AWS Console อย่าลืมที่จะระบุไปCompatible runtimespython3.8เพิ่ม AWS ให้เลเยอร์ SciPy
AWSLambda-Python38-SciPy1xและเลเยอร์ของคุณเองพร้อม cv2 ลงในฟังก์ชันของคุณ
ดังนั้นคุณจะมีสองชั้นในฟังก์ชันของคุณ
- ทำการทดสอบพื้นฐานของเลเยอร์ในแลมบ์ดาโดยใช้ฟังก์ชันแลมด้าต่อไปนี้:
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