在亚马逊 lambda 中使用 moviepy、scipy 和 numpy

新手上路,请多包涵

我想使用 AWS Lambda 功能生成视频。

我已按照 此处此处 的说明进行操作。

我现在有以下过程来构建我的 Lambda 函数:

第1步

触发一个 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步

我将生成的 tarball 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 作为我的 lambda 函数的来源。当我测试该功能时,我得到以下 callstack

 START RequestId: 36c62b93-b94f-11e5-9da7-83f24fc4b7ca Version: $LATEST
['tqdm', 'imageio-1.4.egg-info', 'decorator.pyc', 'process_movie.py', 'decorator-4.0.6.dist-info', 'imageio', 'moviepy', 'tqdm-3.4.0.dist-info', 'scipy', 'numpy', 'OpenSans-Regular.ttf', 'decorator.py', 'moviepy-0.2.2.11.egg-info']
['add_newdocs.pyo', 'numarray', '__init__.py', '__config__.pyc', '_import_tools.py', 'setup.pyo', '_import_tools.pyc', 'doc', 'setupscons.py', '__init__.pyc', 'setup.py', 'version.py', 'add_newdocs.py', 'random', 'dual.pyo', 'version.pyo', 'ctypeslib.pyc', 'version.pyc', 'testing', 'dual.pyc', 'polynomial', '__config__.pyo', 'f2py', 'core', 'linalg', 'distutils', 'matlib.pyo', 'tests', 'matlib.pyc', 'setupscons.pyc', 'setup.pyc', 'ctypeslib.py', 'numpy', '__config__.py', 'matrixlib', 'dual.py', 'lib', 'ma', '_import_tools.pyo', 'ctypeslib.pyo', 'add_newdocs.pyc', 'fft', 'matlib.py', 'setupscons.pyo', '__init__.pyo', 'oldnumeric', 'compat']
can not import scipy
'module' object has no attribute 'core': AttributeError
Traceback (most recent call last):
  File "/var/task/process_movie.py", line 91, in make_movie
    import numpy
  File "/var/task/numpy/__init__.py", line 122, in <module>
    from numpy.__config__ import show as show_config
  File "/var/task/numpy/numpy/__init__.py", line 137, in <module>
    import add_newdocs
  File "/var/task/numpy/numpy/add_newdocs.py", line 9, in <module>
    from numpy.lib import add_newdoc
  File "/var/task/numpy/lib/__init__.py", line 13, in <module>
    from polynomial import *
  File "/var/task/numpy/lib/polynomial.py", line 11, in <module>
    import numpy.core.numeric as NX
AttributeError: 'module' object has no attribute 'core'

END RequestId: 36c62b93-b94f-11e5-9da7-83f24fc4b7ca
REPORT RequestId: 36c62b93-b94f-11e5-9da7-83f24fc4b7ca  Duration: 112.49 ms Billed Duration: 200 ms     Memory Size: 1536 MB    Max Memory Used: 14 MB

我不明白为什么 python 找不到文件夹结构中存在的核心目录。

编辑:

按照@jarmod 的建议,我将 lambda 函数缩减为:

 def make_movie(event, context):
    print('running make movie')
    import numpy

我现在有以下错误:

 START RequestId: 6abd7ef6-b9de-11e5-8aee-918ac0a06113 Version: $LATEST
running make movie
Error importing numpy: you should not try to import numpy from
        its source directory; please exit the numpy source tree, and relaunch
        your python intepreter from there.: ImportError
Traceback (most recent call last):
  File "/var/task/process_movie.py", line 3, in make_movie
    import numpy
  File "/var/task/numpy/__init__.py", line 127, in <module>
    raise ImportError(msg)
ImportError: Error importing numpy: you should not try to import numpy from
        its source directory; please exit the numpy source tree, and relaunch
        your python intepreter from there.

END RequestId: 6abd7ef6-b9de-11e5-8aee-918ac0a06113
REPORT RequestId: 6abd7ef6-b9de-11e5-8aee-918ac0a06113  Duration: 105.95 ms Billed Duration: 200 ms     Memory Size: 1536 MB    Max Memory Used: 14 MB

原文由 rouk1 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 955
2 个回答

在此线程中的所有帖子的帮助下,这里是记录的解决方案:

要使其正常工作,您需要:

  1. 启动一个 EC2 具有至少 2GO RAM 的实例(能够编译 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* 除外)复制到 stack 文件夹中的所有内容:

    • home/ec2-user/env/lib/python2.7/dist-packages
    • home/ec2-user/env/lib64/python2.7/dist-packages
  4. 从您那里获取所有必需的共享库 EC2 实例:

    • libatlas.so.3
    • libf77blas.so.3
    • liblapack.so.3
    • libptf77blas.so.3
    • libcblas.so.3
    • libgfortran.so.3
    • libptcblas.so.3
    • libquadmath.so.0
  5. 将它们放在 lib stack 文件夹的子文件夹中

  6. imageio is a dependency of moviepy , you’ll need to download some binary version of its dependencies: libfreeimage and of ffmpeg ;他们可以在 这里 找到。将它们放在堆栈文件夹的根目录下并重命名 libfreeimage-3.16.0-linux64.solibfreeimage.so

  7. 您现在应该有一个 stack 文件夹,其中包含:

    • root 中的所有 python 依赖项
    • lib 子文件夹中的所有共享库
    • ffmpeg 根目录下的二进制文件
    • libfreeimage.so 在根
  8. 压缩此文件夹: zip -r9 stack.zip . -x ".*" -x "*/.*"

  9. 使用以下 lambda_function.py 作为 lambda 的入口点

    from __future__ import print_function
    
    
    import os
    import subprocess
    
    
    SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
    LIB_DIR = os.path.join(SCRIPT_DIR, 'lib')
    FFMPEG_BINARY = os.path.join(SCRIPT_DIR, 'ffmpeg')
    
    
    def lambda_handler(event, context):
        command = 'LD_LIBRARY_PATH={} IMAGEIO_FFMPEG_EXE={} python movie_maker.py'.format(
            LIB_DIR,
            FFMPEG_BINARY,
        )
        try:
            output = subprocess.check_output(command, shell=True)
            print(output)
        except subprocess.CalledProcessError as e:
            print(e.output)
    
    
    
  10. 写一个 movie_maker.py 依赖于 moviepy , numpy , …

  11. 将这些添加到脚本到您的 stack.zip 文件中 zip -r9 lambda.zip *.py

  12. 将 zip 上传到 S3 并将其用作 lambda 的来源

您还可以在 此处 下载 stack.zip

原文由 rouk1 发布,翻译遵循 CC BY-SA 3.0 许可协议

我也在关注您的第一个链接并设法以这种方式(在 Windows 上)在 Lambda 函数中导入 numpypandas

  1. 使用 64 位 Amazon Linux AMI 2015.09.1 启动了一个(免费层) t2.micro EC2 实例,并使用 Putty 进行 SSH 登录。
  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

  1. 创建 虚拟环境
    virtualenv ~/env
   source ~/env/bin/activate

  1. 安装
    sudo ~/env/bin/pip2.7 install numpy
   sudo ~/env/bin/pip2.7 install pandas

  1. 然后,使用 WinSCP,我登录并从 /home/ec2-user/env/lib/python2.7/dist-packages 以及从 EC2 实例的 /home/ec2-user/env/lib64/python2.7/site-packages 下载 所有内容(_markerlib、pip*、pkg_resources、setuptools* 和 easyinstall* 除外)。

  2. 我将所有这些文件夹和文件与包含 Lambda 函数的 .py 文件一起放入一个 zip 中。 复制的所有文件的插图

  3. 因为这个 .zip 大于 10 MB,所以我创建了一个 S3 存储桶 来存储文件。我从那里复制了文件的链接,并粘贴到 Lambda 函数的“从 Amazon S3 上传 .ZIP”处。

  4. EC2 实例可以 关闭,它不再需要了。

有了这个,我可以导入 numpy 和 pandas。我不熟悉 moviepy,但 scipy 可能已经很棘手,因为 Lambda 对解压缩的部署包大小有 限制,为 262 144 000 字节。恐怕 numpy 和 scipy 一起已经结束了。

原文由 Attila Tanyi 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题