Создание собственного лямбда-слоя AWS для Scikit-изображения - PullRequest
2 голосов
/ 14 октября 2019

Схема: Мне нужно использовать scikit-image внутри некоторых лямбда-функций AWS, поэтому я собираюсь создать собственный лямбда-слой AWS, содержащий scikit-image.

Мои вопросы в целом должны относиться к любому модулю Python, особенно к scikit-learn, или к любому пользовательскому слою в целом.


Справочная информация: После долгих поисков и чтениякажется, что лучший способ сделать это - использовать docker для локального запуска лямбда-среды выполнения AWS, а затем установить / скомпилировать scikit-образ (или какой-либо модуль, который вы ищете). После этого вы можете загрузить / установить его в AWS в качестве пользовательского слоя.

Это концептуально довольно просто, но я немного борюсь с лучшими практиками для этого. У меня это работает, но я не уверен, что делаю это наилучшим / правильным / оптимальным / безопасным способом ... есть миллионы пост-блогов, отличающихся от других, и сами документы AWS (ИМХО) слишком подробный, но пропустите некоторые основные вопросы .

Я пытался в основном следовать двум хорошим сообщениям среднего уровня, здесь и здесь ... спасибо этим парням.


Мои основные вопросы:

  1. Где лучше всего найти последнюю версию окна настройки AWS AMI?

Существует несколько (даже на самом Amazon) нескольких местоположений / версий и т. Д. Для того, что предположительно является последним изображением. например, https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html, или https://cdn.amazonlinux.com/os-images/2.0.20190823.1/.

.. Это игнорирует множество возможностей, не размещаемых на Amazon GitHub, таких как lambci/lambda:build-python3.6 от средних сообщений здесь или onema/amazonlinux4lambda из здесь .

Я бы предпочел использовать предоставленное Amazon изображение докера как для обеспечения безопасности, так и для актуальности.

Является ли здесь лямбда-время выполнения AWS здесь , которое ссылается на этот AMI , образ докера? Если да (или нет), как загрузить его взапустить его локально? Как вы можете быть уверены, что знаете, когда вам может понадобиться перестроить слой , потому что лямбда-время выполнения AWS изменяется amazon, и это нарушает ваш слой, используя старыйвремя выполнения? Лучше ли построить (скомпилировать в случае scikit-image) установленный модуль pip внутри контейнера AIM докера, или просто сказать pipскачать предварительно собранную версию и надеяться / довериться, что она получит скомпилированные библиотеки, которые лучше всего подходят для AMI, который вы используете?

В основном, здесь я обеспокоен стабильностью и производительностью,Я хотел бы убедиться, что скомпилированные библиотеки для scikit-изображения в этом случае максимально оптимизированы для контейнера AMI.

Лучше просто скачать и использовать SAM AWS, чтобы сделать все это? (выглядит излишне сложно и сложно, но похоже, что оно заботится о том, чтобы вы ''постоянно использую «правильный» контейнер док-станции AMI) Есть ли (хорошие, надежные) репозитории из предварительно построенных лямбда-слоев вокруг (которые могут сделать все это спорным)? Я посмотрел, но не смог найти.

... спасибо за любые советы, мысли и комментарии!

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Я не эксперт в этом, но у меня был тот же набор вопросов в тот же день. Однако я могу ответить на вопросы № 1 и № 2. Вывод их из строя:
2) AMI - это не изображение докера, оно используется для экземпляра EC2.

1) Вот как я получил соответствующий образ докера:

Я установил SAM cli и выполнил следующие команды:

sam init --runtime python3.7 (пример установки hello world)
sam build -u (builds app, -u означает использование контейнера)

Вывод из sam build -u:

Извлечение lambci / lambda: build-python3.7 Изображение контейнера Docker

Итак, поехали. Вы можете получить образ непосредственно из dockerhub или, если у вас установлен SAM Cli, вы можете выполнить «sam build -u». Теперь, когда у вас есть образ, вам не нужно выполнять весь рабочий процесс SAM, если вы не хотите использовать служебные данные.

0 голосов
/ 16 октября 2019

Интересная пара дней, чтобы понять это. ... надеюсь, что ответ ниже будет некоторой помощью любому, кто пытается выяснить, как сделать пользовательский слой (для python, но и для других языков).


Где находитсялучшее место, где можно найти последнее изображение докера AWS AMI?

Ответ, как указывает Грэг выше, где находится «правильное» изображение докера для создания слоев: lambci/lambda:build-python3.7. Это официальное репозиторий SAM для используемых ими образов докеров.

Полный список для всех лямбда-сред среды выполнения AWS, а не только для Python, здесь


Какой лучший способ создать свой собственный лямбда-слой AWS? ... Каков наилучший способ создания пользовательского слоя модуля Python?

На сегодняшний день я нашел лучший способ использовать SAM AWS в комбинации с некоторыми твиками, которые я использовал из замечательного блога здесь .

Твики нужны, потому что (на момент написания этой статьи) AWSSAM позволяет вам определять ваши слои, , но фактически не создает их для вас . ... См. этот запрос от github группы SAM.

Я не буду пытаться объяснить это очень подробно здесь - вместо этого, пожалуйста, ознакомьтесь с блог bryson3gps . Он объясняет это хорошо, и вся заслуга ему . *


ОК, краткий обзор процесса использования:

В настоящее время AWS SAM не будет build ваш слой для вас.

То есть, если вы определите файл require.txt для набора модулей для установки в слое, он фактически не установит / соберет их в локальный каталог, готовый для загрузки в AWS (так какделает, если вы используете его для определения лямбда-функции).

Но, если вы определите слой в SAM, он упакует (сжать все и загрузить на S3) и разверните (определите его в облаке AWS с помощью ARN и т. д. и т. д., чтобы его можно было использовать) этот слой для вас.


Способ заставить SAM построить свойСлои тоже

Взломать, в настоящее время, чтобы "обмануть" СЭМ в создании вашего слоя для вас, из блога bryson3Gps здесь , это

  1. Определите фиктивный шаблон лямбда-функции AWS в SAM. Затем для этой функции сделайте пип requirement.txt, который SAM будет использовать во время сборки, чтобы загрузить нужные модули в ваш слой. Вы фактически не будете использовать эту функцию ни для чего.

Это влечет за собой создание файла SAM template.yaml, который определяет базовую функцию. Посмотрите учебник по SAM, а затем посмотрите блог bryson3gps. Это довольно просто.

Определите слой AWS в том же файле template.yaml. Опять же, не слишком сложно - посмотрите блог

В спецификации SAM для определения слоя установите ContentUri (т. Е. Где он ищет файлы / каталоги для архивации и загрузки в AWS) в место сборки для функции, которую вы определили в (1) .

Итак, когда вы используете sam build, она создаст функцию для вас (т. е. обработайте requirements.txt для функции) и поместите полученные пакеты функций в каталог для последующего архивирования и отправки в AWS.

Но (это ключ) у определенного вами уровня есть ContentUri указывает на ту же самую директорию sam build, которая использовалась для создания каталога для (фиктивной) функции.

Итак, когда вы говорите SAM упаковать (отправить на S3) и развернуть (настроить с помощью AWS)) для шаблона в целом, он загрузит / создаст слой, который вы определили, , но также будет использовать правильное содержимое для слоя, который был построен для (фиктивной) функции.

Работает хорошо.

Пара дополнительных советов

1

В блоге bryson3gps он указывает, что этот метод не помещает пакет слоев в правильное местоположение в директории лямбда-AMI, чтобы они были найдены по умолчанию (для python, которыйэто / opt / python). Вместо этого они помещаются в /opt.

Его способ обойти это - добавить / opt к sys.path в ваших лямбда-скриптах перед импортом:

sys.path.append('/opt')
import <a module in your layer>

Вместо этого, перед sam package загрузкой на S3 (после sam build), вы можете перейти в соответствующий каталог .aws-sam/<your package subdir> и переместить все в новый каталог / python в этом каталоге пакета. Это приводит к тому, что модули слоя помещаются в / opt / python правильно, а не просто /opt.

cd .aws-sam/<wherever you package is>/
mkdir .python
mv * .python
mv .python python

2

Если вы создаете слой Python со скомпилированнымкод (например, scikit-изображение, которое я использую) убедитесь, что вы используете sam build -u (с флагом -u).

Это будет гарантировать сборку (pip«Требование.txt) будет происходить внутри док-контейнера, соответствующего лямбда-времени выполнения AWS, и DL будет иметь правильные библиотеки) для времени выполнения.

3

Если вы включаете какие-либо модуликоторые зависят от numpy или scipy, затем после sam build -u , но до пакета / deploy , убедитесь, что вы попали в соответствующий каталог .aws-sam/<your package>, которыйсобран и удаляет модули numpy и scipy, которые установит зависимость

cd .aws-sam/<wherever you package is>/
rm -r numpy*
rm -f scipy*

Вместо этого вы должны указать использовать предоставляемый AWS слой numpy / scipy в вашей функции лямбды.

Я не смог найти способ заставить SAM запускать pip с параметром --no_dep, поэтому нужно сделатьэто вручную

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...