Использование moviepy, scipy и numpy в amazon lambda
Я хотел бы создать видео с помощью AWS Lambda
характеристика.
я следовал инструкциям нашли здесь и здесь.
и теперь у меня есть следующий процесс, чтобы построить свою Lambda
функция:
Шаг 1
огонь a Amazon Linux EC2
экземпляр и запустить как root на это:
#! /usr/bin/env bash
# Install the SciPy stack on Amazon Linux and prepare it for AWS Lambda
yum -y update
yum -y groupinstall "Development Tools"
yum -y install blas --enablerepo=epel
yum -y install lapack --enablerepo=epel
yum -y install atlas-sse3-devel --enablerepo=epel
yum -y install Cython --enablerepo=epel
yum -y install python27
yum -y install python27-numpy.x86_64
yum -y install python27-numpy-f2py.x86_64
yum -y install python27-scipy.x86_64
/usr/local/bin/pip install --upgrade pip
mkdir -p /home/ec2-user/stack
/usr/local/bin/pip install moviepy -t /home/ec2-user/stack
cp -R /usr/lib64/python2.7/dist-packages/numpy /home/ec2-user/stack/numpy
cp -R /usr/lib64/python2.7/dist-packages/scipy /home/ec2-user/stack/scipy
tar -czvf stack.tgz /home/ec2-user/stack/*
Шаг 2
Я scp результирующий шар на мой ноутбук. А затем запустите этот скрипт, чтобы построить zip архив.
#! /usr/bin/env bash
mkdir tmp
rm lambda.zip
tar -xzf stack.tgz -C tmp
zip -9 lambda.zip process_movie.py
zip -r9 lambda.zip *.ttf
cd tmp/home/ec2-user/stack/
zip -r9 ../../../../lambda.zip *
process_movie.py
скрипт на данный момент только тест, чтобы увидеть, если стек в порядке:
def make_movie(event, context):
import os
print(os.listdir('.'))
print(os.listdir('numpy'))
try:
import scipy
except ImportError:
print('can not import scipy')
try:
import numpy
except ImportError:
print('can not import numpy')
try:
import moviepy
except ImportError:
print('can not import moviepy')
Шаг 3
затем я загружаю полученный архив в S3, чтобы быть источником моего
9 ответов:
Я также следовал по вашей первой ссылке и сумел импортировать включает в себя и панды в лямбда-функции таким образом (на Windows):
- начал a (free-tier)t2.микроэкземпляр EC2 с 64-разрядной Amazon Linux AMI 2015.09.1 и используется шпатлевка для SSH.
пробовал то же самое команды вы использовали и тот, который рекомендовал Amazon статья:
sudo yum -y update sudo yum -y upgrade sudo yum -y groupinstall "Development Tools" sudo yum -y install blas --enablerepo=epel sudo yum -y install lapack --enablerepo=epel sudo yum -y install Cython --enablerepo=epel sudo yum install python27-devel python27-pip gcc
создал виртуальная среда:
virtualenv ~/env source ~/env/bin/activate
установлена пакетов:
sudo ~/env/bin/pip2.7 install numpy sudo ~/env/bin/pip2.7 install pandas
затем, используя WinSCP, я вошел в систему и загрузить все (кроме _markerlib, pip*, pkg_resources, setuptools* и easyinstall*) из
/home/ec2-user/env/lib/python2.7/dist-packages
, все от/home/ec2-user/env/lib64/python2.7/site-packages
из экземпляра EC2.я поставил все эти папки и файлы в один zip, вместе с файлом .py, содержащим лямбда-функцию. иллюстрация всех скопированных файлов
потому что это .zip больше 10 МБ, я создал S3 ведро сохранить файл. Я скопировал ссылку на файл оттуда и вставил в "загрузить a .ZIP из Amazon S3 " в функции лямбда.
экземпляр EC2 может быть закрыть, это не нужен.
С этим, я мог бы импортировать NumPy и панды. Я не знаком с moviepy, но scipy уже может быть сложно, как лямбда имеет ограничения для распакованного пакета развертывания размером 262 144 000 байт. Я боюсь, что numpy и scipy вместе уже закончили это.
С помощью всех сообщений в этой теме вот решение для записей:
чтобы заставить это работать, вам нужно:
начать
EC2
экземпляр с по крайней мере 2GO ОЗУ (чтобы иметь возможность компилироватьNumPy
&SciPy
)установите необходимые зависимости
sudo yum -y update sudo yum -y upgrade sudo yum -y groupinstall "Development Tools" sudo yum -y install blas --enablerepo=epel sudo yum -y install lapack --enablerepo=epel sudo yum -y install Cython --enablerepo=epel sudo yum install python27-devel python27-pip gcc virtualenv ~/env source ~/env/bin/activate pip install scipy pip install numpy pip install moviepy
скопируйте на свой языковой компьютер все содержимое каталогов (кроме _markerlib, pip*, pkg_resources, setuptools* и easyinstall*) в
сообщения здесь помогают мне найти способ статической компиляции numpy с файлами библиотек, которые могут быть включены в пакет развертывания AWS Lambda. Это решение не зависит от значения LD_LIBRARY_PATH, как в решении @rouk1.
скомпилированную библиотеку NumPy можно загрузить из https://github.com/vitolimandibhrata/aws-lambda-numpy
вот шаги для пользовательской компиляции NumPy
инструкции по компиляции этого пакета из царапины
подготовьте новый экземпляр AWS EC с AWS Linux.
установить зависимости компилятора
sudo yum -y install python-devel sudo yum -y install gcc-c++ sudo yum -y install gcc-gfortran sudo yum -y install libgfortran
установки зависимостей включает в себя
sudo yum -y install blas sudo yum -y install lapack sudo yum -y install atlas-sse3-devel
создать /var / task / lib, чтобы содержать библиотеки времени выполнения
mkdir -p /var/task/lib
/var / task-это корневой каталог, в котором ваш код будет находиться в AWS Lambda, поэтому нам нужно статически связать необходимые файлы библиотеки в хорошо известной папке, которая в этом случае /var / task / lib
скопируйте следующие файлы библиотеки в /var / task / lib
cp /usr/lib64/atlas-sse3/liblapack.so.3 /var/task/lib/. cp /usr/lib64/atlas-sse3/libptf77blas.so.3 /var/task/lib/. cp /usr/lib64/atlas-sse3/libf77blas.so.3 /var/task/lib/. cp /usr/lib64/atlas-sse3/libptcblas.so.3 /var/task/lib/. cp /usr/lib64/atlas-sse3/libcblas.so.3 /var/task/lib/. cp /usr/lib64/atlas-sse3/libatlas.so.3 /var/task/lib/. cp /usr/lib64/atlas-sse3/libptf77blas.so.3 /var/task/lib/. cp /usr/lib64/libgfortran.so.3 /var/task/lib/. cp /usr/lib64/libquadmath.so.0 /var/task/lib/.
получить последний исходный код numpy отhttp://sourceforge.net/projects/numpy/files/NumPy/
перейдите в папку исходного кода numpy, например numpy-1.10.4 Создание сайта.cfg файл со следующими записями
[atlas] libraries=lapack,f77blas,cblas,atlas search_static_first=true runtime_library_dirs = /var/task/lib extra_link_args = -lgfortran -lquadmath
-флаги lgfortran-lquadmath необходимы для статической связи библиотек gfortran и quadmath с файлами, определенными в runtime_library_dirs
Построить NumPy
python setup.py build
Установить NumPy
python setup.py install
Проверьте, связаны ли библиотеки с файлами в /var / task / lib
ldd $PYTHON_HOME/lib64/python2.7/site-packages/numpy/linalg/lapack_lite.so
вы должны увидеть
linux-vdso.so.1 => (0x00007ffe0dd2d000) liblapack.so.3 => /var/task/lib/liblapack.so.3 (0x00007ffad6be5000) libptf77blas.so.3 => /var/task/lib/libptf77blas.so.3 (0x00007ffad69c7000) libptcblas.so.3 => /var/task/lib/libptcblas.so.3 (0x00007ffad67a7000) libatlas.so.3 => /var/task/lib/libatlas.so.3 (0x00007ffad6174000) libf77blas.so.3 => /var/task/lib/libf77blas.so.3 (0x00007ffad5f56000) libcblas.so.3 => /var/task/lib/libcblas.so.3 (0x00007ffad5d36000) libpython2.7.so.1.0 => /usr/lib64/libpython2.7.so.1.0 (0x00007ffad596d000) libgfortran.so.3 => /var/task/lib/libgfortran.so.3 (0x00007ffad5654000) libm.so.6 => /lib64/libm.so.6 (0x00007ffad5352000) libquadmath.so.0 => /var/task/lib/libquadmath.so.0 (0x00007ffad5117000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007ffad4f00000) libc.so.6 => /lib64/libc.so.6 (0x00007ffad4b3e000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ffad4922000) libdl.so.2 => /lib64/libdl.so.2 (0x00007ffad471d000) libutil.so.1 => /lib64/libutil.so.1 (0x00007ffad451a000) /lib64/ld-linux-x86-64.so.2 (0x000055cfc3ab8000)
еще один, очень простой метод, который возможен в наши дни, - это создание с использованием потрясающих контейнеров docker, которые LambCI сделал для имитации лямбда:https://github.com/lambci/docker-lambda
The
lambci/lambda:build
контейнер напоминает AWS Lambda с добавлением в основном полной среды сборки. Чтобы запустить сеанс оболочки в нем:docker run -v "$PWD":/var/task -it lambci/lambda:build bash
внутри сессии:
export share=/var/task easy_install pip pip install -t $share numpy
или, с virtualenv:
export share=/var/task export PS1="[\u@\h:\w]$ " # required by virtualenv easy_install pip pip install virtualenv # ... make the venv, install numpy, and copy it to $share
позже вы можете использовать основной контейнер lambci/лямда, чтобы проверить свои построения.
по состоянию на 2017 год, NumPy и SciPy имеют колеса, которые работают на лямбда (пакеты включают в себя предварительно скомпилированные
libgfortran
иlibopenblas
). Насколько я знаю, MoviePy-это чистый модуль Python, поэтому в основном вы можете сделать:pip2 install -t lambda moviepy scipy
затем скопируйте обработчик в
lambda
каталог и zip его. За исключением того, что вы, скорее всего, превысите ограничения на размер 50/250 МБ. Есть несколько вещей, которые могут помочь:
- удалить .pycs, docs, тесты и другие ненужные части;
- оставьте одну копию общих библиотек NumPy и SciPy;
- лишить библиотеки несущественных частей, таких как отладочные символы;
- сжатие архива с помощью более высоких настроек.
вот пример скрипт что автоматизирует вышеуказанные пункты.
Я могу подтвердить, что шаги, опубликованные @attila-tanyi, работают правильно под Amazon Linux. Я бы только добавил, что нет необходимости использовать EC2, так как есть контейнер Amazon Linux docker, доступный из репозитория по умолчанию.
docker pull amazonlinux && docker run -it amazonlinux # Follow @attila-tanyi steps # Note - sudo is not necessary here
Я использую Dockerfile, встроенный в мое приложение для сборки и развертывания в Lambda.
начиная с 2018 года, шаги по установке внешних модулей в Python3 на AWS EC2:
запустите EC2 на Amazon Linux AMI 201709.
ssh с замазкой с использованием закрытого и открытого ключа и стать суперпользователем.
установите Python 3 и создайте виртуальный env, а затем сделайте его по умолчанию
yum install python36 python36-virtualenv python36-pip virtualenv -p python3.6 /tmp/my_python_lib source /tmp/my_python_lib/bin/activate which python --to check which version s installed pip3 install numpy
скопируйте файлы в разделе пакеты сайта и пакеты dist в локальную машину с помощью winscp.
чтобы найти фактическое местоположение, используйте команды grep - - -
grep -r dist-packages *.
эти пакеты могут быть внутри lib и lib64.
пакеты Site и dist будут находиться в разделе location:
/tmp/my_python_lib/lib64/python3.6, /tmp/my_python_lib/lib/python3.6
Zip эти пакеты вместе с файлом сценария и загрузить в S3, который может быть доступен в лямбда.Вместо того, чтобы сжать корневую папку, вы должны выбрать все файлы и сжать его или отправить в сжатый папка.
Дополнительные советы:
если вы хотите установить все пакеты в один каталог, вы можете использовать команду:
pip install --upgrade --target=/tmp/my_python_lib/lib/python3.6/dist-packages pandas
мне нравится отвечать на @Вито Limandibhrata, но я думаю, что это не достаточно, чтобы построить numpy с runtime_library_dirs в пакете numpy==1.11.1. Если кто-то думает, что сайт-cfg игнорируется, сделайте следующее:
cp /usr/lib64/atlas-sse3/*.a /var/task/lib/
*.a файлы под atlas-sse3 необходимы для построения numpy. Кроме того, вам может потребоваться выполнить следующее:
python setup.py config
для проверки конфигурации numpy. Если он требует чего-то большего, вы увидите следующее сообщение:
atlas_threads_info: Setting PTATLAS=ATLAS libraries ptf77blas,ptcblas,atlas not found in /root/Envs/skl/lib libraries lapack_atlas not found in /root/Envs/skl/lib libraries ptf77blas,ptcblas,atlas not found in /usr/local/lib64 libraries lapack_atlas not found in /usr/local/lib64 libraries ptf77blas,ptcblas,atlas not found in /usr/local/lib libraries lapack_atlas not found in /usr/local/lib libraries lapack_atlas not found in /usr/lib64/atlas-sse3 <class 'numpy.distutils.system_info.atlas_threads_info'> Setting PTATLAS=ATLAS Setting PTATLAS=ATLAS Setting PTATLAS=ATLAS Setting PTATLAS=ATLAS libraries lapack not found in ['/var/task/lib'] Runtime library lapack was not found. Ignoring libraries f77blas not found in ['/var/task/lib'] Runtime library f77blas was not found. Ignoring libraries cblas not found in ['/var/task/lib'] Runtime library cblas was not found. Ignoring libraries atlas not found in ['/var/task/lib'] Runtime library atlas was not found. Ignoring FOUND: extra_link_args = ['-lgfortran -lquadmath'] define_macros = [('NO_ATLAS_INFO', -1)] language = f77 libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas', 'lapack', 'f77blas', 'cblas', 'atlas'] library_dirs = ['/usr/lib64/atlas-sse3'] include_dirs = ['/usr/include']
тогда сайт-cfg будет игнорируемый.
совет: если pip используется для построения numpy с runtime_library_dirs, вам лучше создать
~/.numpy-site.cfg
и добавить следующее:[atlas] libraries = lapack,f77blas,cblas,atlas search_static_first = true runtime_library_dirs = /var/task/lib extra_link_args = -lgfortran -lquadmath
затем numpy распознает .numpy-сайт.файл cfg. Это довольно простой и легкий способ.
по состоянию на август 2018, вероятно, самый простой способ-начать новая среда AWS Cloud9. Затем создайте лямбда-функцию внутри среды. Затем запустите это в командной строке Cloud9:
cd YourApplicationName /venv/bin/pip install scipy -t . /venv/bin/pip install numpy -t . /venv/bin/pip install moviepy -t .
теперь я могу импортировать модули в функции lambda_handler.