Không thể sử dụng OpenCV-Python trong AWS Lambda

Sep 23 2020

Tôi đã cố gắng đưa OpenCV vào một thùng S3 và sau đó gán nó vào một lớp lambda.

Có rất ít thông tin về điều này trên mạng và những gì tôi thấy đã không hoạt động.

Tôi đã quản lý để sử dụng docker với môi trường linux amazon và đã làm theo hướng dẫn này. https://aws.amazon.com/premiumsupport/knowledge-center/lambda-layer-simulated-docker/

Tôi đã thêm setuptools, wheel và opencv-python == 4.4.0.42 vào tệp tin request.txt.

setuptools và bánh xe do lỗi trước đó trong đó khuyến nghị đưa chúng vào khi chúng cần cập nhật, mặc dù tôi đã cập nhật chúng. Nhưng nó hoạt động với họ, vì vậy ai biết được.

Đã tạo hình ảnh docker mà tôi đã nén và đặt trong thùng S3.

Tôi tiếp tục nhận được {"errorMessage": "Không thể nhập mô-đun 'lambda_ Chức năng': libGL.so.1: không thể mở tệp đối tượng được chia sẻ: Không có tệp hoặc thư mục như vậy", "errorType": "Runtime.ImportModuleError"} khi tôi chạy nó Tuy nhiên.

Tôi dường như không thể tìm ra điều gì là sai.

Có ý kiến ​​gì không?

Trả lời

7 Marcin Sep 23 2020 at 06:59

Bạn sẽ cần thêm một loạt các phụ thuộc vào lớp của mình. Dưới đây là các bước tôi đã sử dụng cho opencv_python trên lambda.

1. Trên máy trạm cục bộ (cửa sổ đầu cuối 1)

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

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

2. Trên máy trạm cục bộ (cửa sổ đầu cuối 2)


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

Lệnh trên sẽ đưa bạn vào vùng chứa docker.

Bên trong hộp đựng:

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. Trên máy trạm cục bộ một lần nữa (cửa sổ đầu cuối 1)

Đóng gói pythonthư mục vào mylayer.zip.

zip -r -9 mylayer.zip python

Trong bảng điều khiển AWS

  1. Tạo lớp lambda dựa trên mylayer.zipBảng điều khiển AWS. Đừng quên chỉ định Compatible runtimescho python3.8.

  2. Thêm AWS cung cấp lớp SciPy AWSLambda-Python38-SciPy1xvà lớp của riêng bạn với cv2 vào chức năng của bạn.

Vì vậy, bạn sẽ có hai lớp trong chức năng của mình.

  1. Thực hiện kiểm tra cơ bản của lớp trong lambda bằng cách sử dụng hàm lambda sau:
import cv2

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

Hàm thực thi chính xác (hiển thị một phần bản in).

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