Невозможно использовать 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": "Невозможно импортировать модуль 'lambda_function': libGL.so.1: не удается открыть файл общих объектов: нет такого файла или каталога", "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. Не забудьте указать Compatible runtimesв python3.8.

  2. Добавьте AWSLambda-Python38-SciPy1xв функцию AWS provide слой SciPy и свой собственный слой с 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