在 amazon lambda 中使用 moviepy、scipy 和 numpy

Posted

技术标签:

【中文标题】在 amazon lambda 中使用 moviepy、scipy 和 numpy【英文标题】:Using moviepy, scipy and numpy in amazon lambda 【发布时间】:2016-04-17 10:20:18 【问题描述】:

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

我已按照 here 和 here 的说明进行操作。

我现在有以下过程来构建我的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/*

第二步

我将生成的 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')

第三步

然后我将生成的存档上传到 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

【问题讨论】:

您能否尝试在上传之前删除任何*.pyc 文件。 @sushant 我在解压缩之后添加了find tmp -name '*.pyc' -type f -delete,但这并没有改变结果。 为了消除源文件名或文件名的问题,你能不能用一个简单的项目重新测试,它有一个简单的源文件,只导入 numpy,简单地打印到标准输出,什么都不做?跨度> 请参阅***.com/questions/14570011/… 以获取有关 C 扩展以及从何处加载 numpy 的建议。希望这会有所帮助。 这是一个很好的深度教程:serverlesscode.com/post/deploy-scikitlearn-on-lamba 【参考方案1】:

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

    使用 64 位 Amazon Linux AMI 2015.09.1 启动(免费层)t2.micro EC2 instance 并使用 Putty 进行 SSH 访问。

    尝试了您使用的相同命令以及亚马逊文章推荐的命令:

    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,我登录并下载来自/home/ec2-user/env/lib/python2.7/dist-packages 的所有内容(除了_markerlib、pip*、pkg_resources、setuptools* 和easyinstall*),以及来自/home/ec2-user/env/lib64/python2.7/site-packages 的所有内容来自 EC2 实例。

    我将所有这些文件夹和文件与包含 Lambda 函数的 .py 文件一起放入一个 zip 中。 illustration of all files copied

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

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

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

【讨论】:

安装 matplotlib: sudo yum -y install freetype-devel sudo yum -y install libpng-devel sudo ~/env/bin/pip2.7 --no-cache-dir install matplotlib matplotlib 还需要从/home/ec2-user/env/lib/python2.7/site-packages 下载cyclerpyparsing 在此处查看当前的 Amazon AMI:docs.aws.amazon.com/lambda/latest/dg/… Lambda 旨在确保我们不必与服务器打交道。我们只是担心我们试图利用的服务,对吧?然后通过这样做,我们担心服务器,我们实际上并不是无服务器的。另外,如果由于某种原因主机宕机了怎么办? Lambda 会带来另一个节点吗?该节点会安装这些依赖项吗? @Ganesh Satpute - 需要明确的是,上述过程仅适用于在您的脚本中包含所需的库。您不必担心服务器的管理,但您需要考虑它将是什么架构,因为 numpy 使用为特定架构构建的文件。这里只需要 EC2 服务器来构建这些文件,然后将它们放入 .zip 中,之后就不需要了。 Lambda 的工作方式是将您的 .zip 内容启动到正在运行的机器上,并在需要时运行它,如果不是,则将其删除。你不需要知道是哪台机器。【参考方案2】:

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

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

    启动一个至少有 2GO RAM 的EC2 实例(以便能够编译NumPySciPy

    安装所需的依赖项

    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
    

    stack 文件夹中目录的所有内容(_markerlib、pip*、pkg_resources、setuptools* 和 easyinstall* 除外)复制到您的语言环境:

    home/ec2-user/env/lib/python2.7/dist-packages home/ec2-user/env/lib64/python2.7/dist-packages

    EC2instance 处获取所有必需的共享库:

    libatlas.so.3 libf77blas.so.3 liblapack.so.3 libptf77blas.so.3 libcblas.so.3 libgfortran.so.3 libptcblas.so.3 libquadmath.so.0

    将它们放在stack 文件夹的lib 子文件夹中

    imageiomoviepy 的依赖项,您需要下载其依赖项的一些二进制版本:libfreeimageffmpeg;他们可以找到here。将它们放在你的堆栈文件夹的根目录下,并将libfreeimage-3.16.0-linux64.so重命名为libfreeimage.so

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

    根目录下的所有 python 依赖项 lib 子文件夹中的所有共享库 ffmpeg 根目录下的二进制文件 libfreeimage.so 根目录

    压缩此文件夹:zip -r9 stack.zip . -x ".*" -x "*/.*"

    使用以下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)
    

    编写一个依赖于moviepynumpy、...的movie_maker.py脚本

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

    将 zip 文件上传到 S3 并将其用作您的 lambda 的来源

您也可以下载stack.ziphere。

【讨论】:

您是如何找到所需的共享库列表的?有什么命令吗? 见***.com/questions/50159/… @rouk1 这是如何工作的? site-packages 目录内容的总大小约为 250mb,高于 lambda 的限制 zip 命令不包括通配符“.*”。在我的情况下,这省略了 .libs dir 以及所需的共享库。【参考方案3】:

这里的帖子帮助我找到一种方法来静态编译带有库文件的 NumPy,这些库文件可以包含在 AWS Lambda 部署包中。此解决方案不依赖于@rouk1 解决方案中的 LD_LIBRARY_PATH 值。

编译好的NumPy库可以从https://github.com/vitolimandibhrata/aws-lambda-numpy下载

这里是自定义编译 NumPy 的步骤

从头开始编译这个包的说明

使用 AWS Linux 准备一个新的 AWS EC 实例。

安装编译器依赖项

sudo yum -y install python-devel
sudo yum -y install gcc-c++
sudo yum -y install gcc-gfortran
sudo yum -y install libgfortran

安装 NumPy 依赖项

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/.

从http://sourceforge.net/projects/numpy/files/NumPy/获取最新的numpy源代码

转到 numpy 源代码文件夹,例如 numpy-1.10.4 使用以下条目创建一个 site.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)

【讨论】:

我试过这个。但是,我看到的是 liblapack.so.3 => /usr/lib64/liblapack.so.3 而不是 liblapack.so.3 => /var/task/lib/liblapack.so.3。 我用过同一个site.cfg文件 @Zzz。我以前遇到过这个问题。您需要删除现有的 NumPy 安装文件夹并重新启动编译过程。希望它有效! 我试过很多次了。我还没有安装它,但我检查了构建。它根本不使用运行时库目录。您能否将 libblas.so.3 也包含在您的构建中。谢谢。 @Vito Limandibhrata 在我的情况下,还需要 .a 文件来为 runtime_library_dirs 构建 numpy,否则 site-cfg 将被忽略。只需要做cp /usr/lib64/atlas-sse3/.a /var/task/lib/。 (numpy==1.11.1) 另外,如果您认为 site-cfg 被忽略,只需运行 python setup.py config 以了解问题所在,然后您就可以看到发生了什么。提示,如果您使用 pip,只需创建 ~/.numpy-site.cfg 并将 [atlas] 部分放入其中然后使用 pip。【参考方案4】:

现在可以使用的另一种非常简单的方法是使用 LambCI 模仿 Lambda 制作的出色 docker 容器进行构建:https://github.com/lambci/docker-lambda

lambci/lambda:build 容器类似于 AWS Lambda,但增加了一个基本完整的构建环境。要在其中启动 shell 会话:

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/lambda 容器来测试您的构建。

【讨论】:

在 docker 中安装了 numpy 之后你会做什么?即如何让它在 lambda 上工作?是否也可以从另一个运行时(例如 node.js)运行这些可执行文件?【参考方案5】:

截至 2017 年,NumPy 和 SciPy 拥有可在 Lambda 上运行的***(软件包包括预编译的 libgfortranlibopenblas)。 据我所知,MoviePy 是一个纯 Python 模块,所以基本上你可以这样做:

pip2 install -t lambda moviepy scipy

然后将您的处理程序复制到lambda 目录并压缩它。除了,您很可能会超过 50/250 MB 的大小限制。有几件事可以提供帮助:

删除 .pycs、文档、测试和其他不必要的部分; 保留 NumPy 和 SciPy 常用库的单个副本; 剥离无关部分的库,例如调试符号; 使用更高的设置压缩存档。

这是一个示例script,它自动完成了上述几点。

【讨论】:

“NumPy 和 SciPy 有***”是什么意思?我看到有一个 numpy-1.14.0.dist-info 目录,其中包含一个 WHEEL 文件。我按照here 的说明进行操作,但仍然收到Unable to import module 'solution': Missing required dependencies ['numpy'] 错误。【参考方案6】:

截至 2018 年,在 AWS EC2 上的 Python3 中安装外部模块的步骤:

    在 Amazon Linux AMI 201709 上启动 EC2。

    ssh 与 putty 使用私钥和公钥并成为超级用户。

    安装 Python 3 并创建虚拟环境,然后将其设为默认

    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
    

    使用 winscp 将站点包和 dist 包下的文件复制到本地机器中。

    要查找实际位置,请使用 grep 命令 ---

      grep -r dist-packages *. 
    

这些包可能在 lib 和 lib64 中。

    Site 和 dist 包将位于以下位置:

    /tmp/my_python_lib/lib64/python3.6,
    /tmp/my_python_lib/lib/python3.6
    

    将这些包与您的脚本文件一起压缩并上传到可以在 lambda 中访问的 S3。您必须选择所有文件并将其压缩或发送到压缩文件夹,而不是压缩根文件夹。

其他提示:

    如果要将所有包安装在一个目录下,可以使用命令:

     pip install --upgrade --target=/tmp/my_python_lib/lib/python3.6/dist-packages pandas
    

【讨论】:

【参考方案7】:

截至 2018 年 8 月,可能最简单的方法是启动 new AWS Cloud9 environment。 然后在环境中创建一个 Lambda 函数。接下来在 Cloud9 命令行中运行:

    cd YourApplicationName
    /venv/bin/pip install scipy -t .
    /venv/bin/pip install numpy -t .
    /venv/bin/pip install moviepy -t .

现在我可以在 lambda_handler 函数中导入模块了。

【讨论】:

需要设置 ec2...我们想避免这种情况,只使用 Lambda @JohnAndrews 我认为您不需要设置 ec2。或者您是指运行 Cloud9 的 ec2? 不确定,我放弃并切换到 Google Cloud Functions。无法解释它有多容易(在 30 分钟内按字面意思设置您在上面尝试做的事情)而且文档要好得多。 @karoli 这是否意味着你的 lambda 中有 venv 文件夹?我以为我们通常不会检查 venv 文件夹。 @Jun711 Pandas 似乎工作正常,并且它依赖于 numpy。【参考方案8】:

2018 年 11 月。嗨朋友们,这篇文章对我非常有帮助。然而,到目前为止,答案并不是很自动化。我在这里https://gist.github.com/steinwaywhw/6a6a25d594cc07146c60af943f74c16f 编写了一个Python 脚本和教程,以在EC2 上使用pipvirtualenv 自动创建已编译的Python 包。一切都是 Python (Boto3),没有 bash 脚本,没有 Web 控制台,没有 awscli

除了自动化之外,还有另一个变化,我认为这是一种改进。我从 EC2 下载了整个 Python 虚拟环境,保留了它的文件夹结构,而不是将 liblib64 包合并在一起。我从来不明白合并这两个文件夹的预期含义。如果某些包覆盖其他包怎么办,对吗?此外,伪造官方虚拟环境并非比自己动手更安全。

为了使下载的虚拟环境正常工作,Lambda 函数的源代码添加了一些样板代码,以使用 sys.path 更新 Python 搜索路径。 Python虚拟环境的预期sys.path可以通过

找到 在您自己的机器上,创建一个虚拟环境并激活它。 在此虚拟环境中运行 Python 脚本并在 import sys 之后执行 print(sys.path)。 您可以从那里开始并根据需要进行修改。

下面粘贴了为 Lambda 函数添​​加的样板代码的 sn-p,以便从我的打包虚拟环境中加载 numpy 和其他包。就我而言,我加载了依赖于numpypandas_datareader

import os
import sys 

# https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html
workdir = os.getenv('LAMBDA_TASK_ROOT')
version = f'sys.version_info[0].sys.version_info[1]'
additionals = [f'workdir/venv/lib64/pythonversion/site-packages',
               f'workdir/venv/lib64/pythonversion/lib-dynload',
               f'workdir/venv/lib64/pythonversion/dist-packages',
               f'workdir/venv/lib/pythonversion/dist-packages',
               f'workdir/venv/lib/pythonversion/site-packages']
sys.path = additionals + sys.path

import pandas_datareader as pdr

【讨论】:

【参考方案9】:

我可以确认@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。

【讨论】:

【参考方案10】:

我喜欢@Vito Limandibhrata 的回答,但我认为在 numpy==1.11.1 中使用 runtime_library_dirs 构建 numpy 是不够的。如果有人认为 site-cfg 被忽略,请执行以下操作:

cp /usr/lib64/atlas-sse3/*.a /var/task/lib/

需要 atlas-sse3 下的 *.a 文件来构建 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']

那么 site-cfg 将被忽略。

提示:如果使用 pip 构建带有 runtime_library_dirs 的 numpy,您最好创建 ~/.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-site.cfg 文件。这是非常简单易行的方法。

【讨论】:

【参考方案11】:

您可以在任何操作系统上使用 scipy、numpy、moviepy 和 pandas 为 lambda 创建 zip 文件。

https://pypi.org/project/scipy/#files

pypi 有适用于不同操作系统的***文件,您可以下载 manylinux whl 文件并解压缩。之后删除 dist-info 和 pyc 文件并压缩所有文件。 最终的 zip 文件可以上传到 S3 并转换为 lambda 层。

This教程有助于深入理解。

【讨论】:

以上是关于在 amazon lambda 中使用 moviepy、scipy 和 numpy的主要内容,如果未能解决你的问题,请参考以下文章

使用 lambda 函数 nodejs 从 Amazon Redshift 查询选择

Amazon S3 在另一个账户中触发另一个 Lambda 函数

python 如何在Amazon Lambda函数中运行报纸

如何在 Amazon AWS Lambda 函数中发布到 MQTT 主题?

Amazon AWS Lambda NodeJS日志记录

无法使用 Amazon Amplify 从 Lambda 调用 GraphQL