Использование 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 56

9 ответов:

Я также следовал по вашей первой ссылке и сумел импортировать включает в себя и панды в лямбда-функции таким образом (на Windows):

  1. начал a (free-tier)t2.микроэкземпляр EC2 с 64-разрядной Amazon Linux AMI 2015.09.1 и используется шпатлевка для SSH.
  2. пробовал то же самое команды вы использовали и тот, который рекомендовал 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
    
  3. создал виртуальная среда:

    virtualenv ~/env
    source ~/env/bin/activate
    
  4. установлена пакетов:

    sudo ~/env/bin/pip2.7 install numpy
    sudo ~/env/bin/pip2.7 install pandas
    
  5. затем, используя 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.

  6. я поставил все эти папки и файлы в один zip, вместе с файлом .py, содержащим лямбда-функцию. иллюстрация всех скопированных файлов

  7. потому что это .zip больше 10 МБ, я создал S3 ведро сохранить файл. Я скопировал ссылку на файл оттуда и вставил в "загрузить a .ZIP из Amazon S3 " в функции лямбда.

  8. экземпляр EC2 может быть закрыть, это не нужен.

С этим, я мог бы импортировать NumPy и панды. Я не знаком с moviepy, но scipy уже может быть сложно, как лямбда имеет ограничения для распакованного пакета развертывания размером 262 144 000 байт. Я боюсь, что numpy и scipy вместе уже закончили это.

С помощью всех сообщений в этой теме вот решение для записей:

чтобы заставить это работать, вам нужно:

  1. начать EC2 экземпляр с по крайней мере 2GO ОЗУ (чтобы иметь возможность компилировать NumPy & SciPy)

  2. установите необходимые зависимости

    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
    
  3. скопируйте на свой языковой компьютер все содержимое каталогов (кроме _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:

  1. запустите EC2 на Amazon Linux AMI 201709.

  2. ssh с замазкой с использованием закрытого и открытого ключа и стать суперпользователем.

  3. установите 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
    
  4. скопируйте файлы в разделе пакеты сайта и пакеты dist в локальную машину с помощью winscp.

    чтобы найти фактическое местоположение, используйте команды grep - - -

      grep -r dist-packages *. 
    

эти пакеты могут быть внутри lib и lib64.

  1. пакеты Site и dist будут находиться в разделе location:

    /tmp/my_python_lib/lib64/python3.6,
    /tmp/my_python_lib/lib/python3.6
    
  2. Zip эти пакеты вместе с файлом сценария и загрузить в S3, который может быть доступен в лямбда.Вместо того, чтобы сжать корневую папку, вы должны выбрать все файлы и сжать его или отправить в сжатый папка.

Дополнительные советы:

  1. если вы хотите установить все пакеты в один каталог, вы можете использовать команду:

     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.