Невозможно загрузить dlib в AWS Lambda - PullRequest
0 голосов
/ 05 января 2019

Я создаю функцию в AWS Lambda, которая использует пакет DLIB. У меня он работает нормально локально, затем, чтобы убедиться, что я правильно скомпилировал двоичные файлы, я создал экземпляр EC2 на основе AMI-информации, предоставленной Amazon , но я не могу правильно упаковать свои зависимости.

Это ошибка, которую я получаю от AWS Lambda при попытке проверить свою функцию:

Unable to import module 'lambda_function': /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /var/task/site-packages/dlib.cpython-36m-x86_64-linux-gnu.so)

Внутри моего пакета (хранящегося в S3 размером 49 МБ) у меня есть файл lambda_function.py, а затем две подкаталоги с именами libs и site-packages. Libs содержит файлы, такие как liblapack.so, libquadmath.so, libstdc++.so.6 и т. Д.

Каталог site-packages содержит все мои зависимости для моего кода на Python - CV, Numpy и Dlib. Я уже несколько дней бьюсь головой об стол. Что касается жизни, я не могу понять, как проинструктировать лямбду использовать libstdc++.so.6, который я дал в каталоге libs.

Я думаю, что я правильно связываю все пакеты внутри lambda_function.py

import sys
import os

# Import installed packages (in site-packages and lib)
CWD = os.path.dirname(os.path.realpath(__file__))

site_pkgs = os.path.join(CWD, "site-packages")
lib_pkgss = os.path.join(CWD, "libs")

sys.path.append(site_pkgs)
sys.path.append(lib_pkgss)

import json
import cv2
import numpy as np
import dlib
import boto3
...

Есть идеи, что мне здесь не хватает?

1 Ответ

0 голосов
/ 14 февраля 2019

Не используйте папку site-packages. Вместо этого заархивируйте файлы в папке site-packages и в полной папке lib и загрузите их в AWS lambda (через корзину S3). Это должно работать тогда. Структура папок, которая работала для меня, такова.

├── dlib.cpython-36m-x86_64-linux-gnu.so
├── easy_install.py
├── lambda_function.py
├── lib
│   ├── libgfortran.so.3
│   ├── libopenblas.so.0
│   └── libquadmath.so.0          # only these three are needed.
├── pip
├── pip-10.0.1.dist-info
├── pkg_resources
├── setuptools
├── setuptools-39.0.1.dist-info
├── numpy
└── any other packages you might have(like scikit opencv etc)

Заархивируйте эту папку и затем загрузите ее в лямбду. Вам не нужно вручную ссылаться внутри кода, как вы это делали, используя sys.path.append() и os.path.join(), поэтому удалите эти строки. AWS lambda автоматически загрузит общие библиотеки из папки lib.

...