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