Пакет dlib в AWS Lambda с использованием Serverless и python 3.7

Я пытаюсь развернуть функцию AWS Lambda с использованием бессерверной инфраструктуры со средой выполнения python3.7, и мне нужно упаковать dlib как зависимость и импортировать внутри лямбда-функции. Есть идеи, какой самый простой способ заставить dlib работать на python3.7 и успешно упаковать его с использованием бессерверной структуры? TIA ...

ОБНОВЛЕНИЕ: я уже добавил dlib == 19.9.0 в свой файл requirements.txt, я использую Serverless plugin serverless-python-requirements и развертываю его с помощью конвейера bitbucket на основе образа ubuntu с python и node база. Я также устанавливаю cmake в сценарий конвейера, поскольку dlib, как я видел, он нужен для компиляции.

Трубопровод выходит из строя:

Container 'Build' exceeded memory limit.

и компиляция dlib останавливается на 77% со следующими повторяющимися предупреждениями об устаревании, пока конвейер не превысит объем памяти и не остановится с ошибкой:

 Scanning dependencies of target dlib
.
.

 [ 77%] Building CXX object CMakeFiles/dlib_python.dir/src/other.cpp.o
    In file included from /tmp/pip-install-nx1hok9_/dlib/dlib/external/pybind11/include/pybind11/cast.h:16,
                     from /tmp/pip-install-nx1hok9_/dlib/dlib/external/pybind11/include/pybind11/attr.h:13,
                     from /tmp/pip-install-nx1hok9_/dlib/dlib/external/pybind11/include/pybind11/pybind11.h:43,
                     from /tmp/pip-install-nx1hok9_/dlib/dlib/../dlib/python/pybind_utils.h:6,
                     from /tmp/pip-install-nx1hok9_/dlib/dlib/../dlib/python.h:6,
                     from /tmp/pip-install-nx1hok9_/dlib/tools/python/src/basic.cpp:3:
    /tmp/pip-install-nx1hok9_/dlib/dlib/external/pybind11/include/pybind11/detail/internals.h:82:34: warning: ‘int PyThread_create_key()’ is deprecated [-Wdeprecated-declarations]
         decltype(PyThread_create_key()) tstate = 0; // Usually an int but a long on Cygwin64 with Python 3.x
                                      ^
    In file included from /usr/local/include/python3.7m/pystate.h:11,
                     from /usr/local/include/python3.7m/traceback.h:8,
                     from /usr/local/include/python3.7m/Python.h:119,
                     from /tmp/pip-install-nx1hok9_/dlib/dlib/external/pybind11/include/pybind11/detail/common.h:111,
                     from /tmp/pip-install-nx1hok9_/dlib/dlib/external/pybind11/include/pybind11/pytypes.h:12,
                     from /tmp/pip-install-nx1hok9_/dlib/dlib/external/pybind11/include/pybind11/cast.h:13,
                     from /tmp/pip-install-nx1hok9_/dlib/dlib/external/pybind11/include/pybind11/attr.h:13,
                     from /tmp/pip-install-nx1hok9_/dlib/dlib/external/pybind11/include/pybind11/pybind11.h:43,
                     from /tmp/pip-install-nx1hok9_/dlib/dlib/../dlib/python/pybind_utils.h:6,
                     from /tmp/pip-install-nx1hok9_/dlib/dlib/../dlib/python.h:6,
                     from /tmp/pip-install-nx1hok9_/dlib/tools/python/src/basic.cpp:3:
    /usr/local/include/python3.7m/pythread.h:95:17: note: declared here
     PyAPI_FUNC(int) PyThread_create_key(void) Py_DEPRECATED(3.7);
                     ^~~~~~~~~~~~~~~~~~~
    In file included from /tmp/pip-install-nx1hok9_/dlib/dlib/external/pybind11/include/pybind11/cast.h:16,
                     from /tmp/pip-install-nx1hok9_/dlib/dlib/external/pybind11/include/pybind11/attr.h:13,
                     from /tmp/pip-install-nx1hok9_/dlib/dlib/external/pybind11/include/pybind11/pybind11.h:43,
                     from /tmp/pip-install-nx1hok9_/dlib/dlib/../dlib/python/pybind_utils.h:6,
                     from /tmp/pip-install-nx1hok9_/dlib/dlib/../dlib/python.h:6,
                     from /tmp/pip-install-nx1hok9_/dlib/tools/python/src/basic.cpp:3:
    /tmp/pip-install-nx1hok9_/dlib/dlib/external/pybind11/include/pybind11/detail/internals.h:82:34: warning: ‘int PyThread_create_key()’ is deprecated [-Wdeprecated-declarations]
         decltype(PyThread_create_key()) tstate = 0; // Usually an int but a long on Cygwin64 with Python 3.x
                                      ^
    In file included from /usr/local/include/python3.7m/pystate.h:11,

введите код сюда


person Riham Nour    schedule 07.05.2020    source источник
comment
Не знаю о бессерверной структуре, но обычно я создаю лямбда-слои со своими зависимостями. Для этого я использую инструмент докера lambci / lambda.   -  person Marcin    schedule 07.05.2020


Ответы (2)


Предложение Марцина работает, но несколько утомительно. К счастью, здесь на помощь приходит бессерверный фреймворк. В следующем примере используется Python 3.8, но его можно легко переключить на 3.7.

Предпосылки:

serverless.yml

service: dlib-example

provider:
  name: aws
  runtime: python3.8

functions:
  dlib:
    handler: handler.main
    layers:
      - {Ref: PythonRequirementsLambdaLayer}

plugins:
  - serverless-python-requirements

custom:
  pythonRequirements:
    dockerizePip: non-linux
    layer: true

requirements.txt

dlib==19.19.0

handler.py

import dlib


def main(event, context):
    print(dlib.__version__)


if __name__ == "__main__":
    main('', '')

Затем используйте sls deploy для создания зависимостей (в контейнере докеров) и развертывания в AWS с помощью CloudFormation.

Тестовое задание

Запустите sls invoke -f dlib --log, и вы получите что-то вроде этого:

null
--------------------------------------------------------------------
START RequestId: 9fba7253-2f3b-425f-a0b7-9ee3dfaec13b Version: $LATEST
19.19.0
END RequestId: 9fba7253-2f3b-425f-a0b7-9ee3dfaec13b
REPORT RequestId: 9fba7253-2f3b-425f-a0b7-9ee3dfaec13b  Duration: 1.66 ms   Billed Duration: 100 ms Memory Size: 1024 MB    Max Memory Used: 62 MB  Init Duration: 227.31 ms

Ваше здоровье!

person jellycsc    schedule 07.05.2020
comment
спасибо за ответ .. это именно то, что у меня есть в моем бессерверном проекте, но мой конвейер не работает. Я обновил свой пост с ошибками, которые я получаю, есть идеи? - person Riham Nour; 07.05.2020
comment
Попробуйте увеличить лимит памяти контейнера. Те ошибки, которые вы опубликовали, кажутся просто предупреждениями об устаревании. - person jellycsc; 07.05.2020
comment
ну, я на самом деле пытался увеличить лимит памяти, но получаю только больше предупреждений об устаревании, пока конвейер не сломается. всегда зависает всего на 77% - person Riham Nour; 07.05.2020
comment
Я увеличил размер до 2x и, наконец, установка завершилась. Спасибо! - person Riham Nour; 08.05.2020
comment
@RihamNour Нет проблем. Я рада, что это помогает◡̈ - person jellycsc; 08.05.2020

хорошо, я решил это, увеличив размер конвейера до 2x, и это удалось

person Riham Nour    schedule 08.05.2020