【问题标题】:Unable to import Pandas in AWS Lambda无法在 AWS Lambda 中导入 Pandas
【发布时间】:2019-12-23 09:18:49
【问题描述】:

我是 AWS Lambda 的新手,我想在 Lambda 上运行机器学习 API 的代码。总之,我想在 Lambda 上运行的函数是一个读取一些 csv 文件以创建一个 pandas 数据帧并在其中搜索,另一个通过来自 Flask 应用程序的请求运行一些腌制的机器学习模型。为此,我需要导入与 Amazon Linux 兼容的 pandas、joblib 和可能的 scikit-learn。我使用的是 Windows 机器。

一般来说,我会采用通过上传 zip 文件来使用 Lambda 层的方法。当然,由于 Lambda 有一个带有 SciPy 和 Numpy 的预构建层,所以我不会导入它们。如果我导入它们,无论如何我都会超过 Lambda 的层限制。 更具体地说,我做了以下工作:

  • 下载并提取了上面列出的库的 linux 兼容版本。例如:我从这个link 下载了“pandas-0.25.0-cp35-cp35m-manylinux1_x86_64.whl”并解压到一个文件夹中。
  • 解压后的库位于以下目录:

    lambda_layers\python\lib\python3.7\site-packages

  • 它们被压缩成一个文件并上传到 S3 Bucket 以创建层。

我导入了包:

import json
import boto3
import pandas as pd

我从 Lambda 收到以下错误:

{ "errorMessage": "Unable to import module 'lambda_function': C extension: No module named 'pandas._libs.tslibs.conversion' not built. 如果要从源目录导入 pandas,可能需要运行'python setup .py build_ext --inplace --force' 先构建 C 扩展。", “errorType”:“Runtime.ImportModuleError” }

【问题讨论】:

  • 你能试试这个吗:github.com/keithrozario/Klayers,有一个我没有测试过的 pandas 层是公开的。 arn:aws:lambda::113088814899:layer:Klayers-python37-pandas:

标签: python-3.x pandas aws-lambda


【解决方案1】:

文件夹结构应该是标准的,您也可以使用 Docker 创建压缩的 Linux 兼容库并将其上传到 AWS Lambda 层。以下是为 AWS Lambda 层创建压缩库的测试命令:

  1. 创建并导航到一个目录:

    $mkdir aws1
    $cd aws1
    
  2. 在 Dockerfile 中写入以下命令并通过 CTRL + D 退出:

    $cat> Dockerfile
    
    FROM amazonlinux:2017.03  
    RUN yum -y install git \ 
        python36 \  
        python36-pip \  
        zip \  
        && yum clean all  
    RUN python3 -m pip install --upgrade pip \  
        && python3 -m pip install boto3
    
  3. 您可以为图像提供任何名称:

    $docker build -t pythn1/lambda .
    
  4. 运行镜像:

    $docker run --rm -it -v ${PWD}:/var/task pythn1/lambda:latest bash  
    
  5. 在 requirements.txt 中指定要压缩的包,然后按 CTRL + D 退出:

    $ cat > requirements.txt
    pandas
    sklearn
    
  6. 您可以在这里尝试使用正确的文件结构 (/python/lib/python3.6/site-packages/),但我还没有测试:

    $pip install -r requirements.txt -t /usr/lib/python3.6/dist-packages/ 
    
  7. 导航到以下目录:

    $cd var/task
    
  8. 创建一个 zip 文件:

    $ zip -r ./layers.zip /usr/lib/python3.6/dist-packages/  
    

您应该能够在 aws1 文件夹中看到一个 layers.zip 文件。如果您在安装时提供了正确的文件夹结构,则不需要以下步骤。但是,对于我使用的文件夹结构,需要以下命令:

  1. 解压layers.zip。
  2. 退出 Docker 或打开一个新终端并导航到您解压缩文件的文件夹。解压后的文件将位于文件夹结构/usr/lib/python3.6/dist-packages/。

  3. 将这些文件复制到正确的文件夹结构中:

    $ cp -r ./python/lib/python3.6/site-packages/ /usr/lib/python3.6/dist-packages/
    
  4. 再次压缩它们:

    $ zip -r ./lib_python.zip ./python
    
  5. 将 zip 文件上传到层,然后将该层添加到您的 Lambda 函数。此外,请确保在创建图层时选择正确的运行环境。

【讨论】:

  • 感谢您的回答。我遵循了一些 Docker 指南,但它们对我不起作用。尽管如此,这仍然是目前比较流行和最新的解决方案之一。
【解决方案2】:

按照此文档 - https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path,您应该为您的 python 层压缩 python\lib\python3.7\site-packages\pandas(和其他依赖项)文件夹。

确保将层添加到函数中并按照文档获取正确的权限。

【讨论】:

    【解决方案3】:

    我很欣赏所给出的答案,只是在这里发布我自己的答案(我在寻找一整天后找到的)以供参考。

    我关注了这个guide 和这个guide。

    总的来说,我所做的步骤是:

    1. 通过 ssh 连接到我的 Amazon EC2 实例(在 Linux 上运行)。我
      想在 Beanstalk 上部署一个应用程序,所以它已经准备好了 反正我。
    2. 按照第一个指南中的步骤安装 python 3.7。 按照第二个指南中的步骤安装库。之一 关键注意事项是不要使用pip install -t 安装,因为那 将导致库和 C 扩展未构建。
    3. 将python\lib\python3.7\site-packages\中的目录压缩为
      这里的答案提到了(尽管我确实遵循了目录
      指导我的第一次尝试)
    4. 通过
      从 EC2 实例获取文件 文件齐拉。
    5. 按照 Lambda 层指南操作即可。

    【讨论】:

    • 我按照这些步骤为 ML 库 (xgboost) 创建了一个层;其中 .so 文件约为 410MB,压缩后的库版本约为 150MB。创建了一个存储桶并将压缩版本放在那里,并尝试在 lambda 层中使用 s3 链接以在函数中使用它;它抱怨“无法创建图层版本:解压缩的大小必须小于 262144000 字节”。最好的出路是什么?
    • AWS Lambda 层的大小非常有限(最大 250MB),所以我不认为这是目前部署模型的推荐且有效的方式。当我问这个问题时,我利用了 Lambda 提供的包含 scipy、numpy 等的预构建层,这是一个巨大的帮助,因为它们占用了大量空间。我建议改为寻找 SageMaker 指南。
    • 尝试link 中的解决方案,将库的 zip 从 s3 复制到 lambda 运行时的 /tmp 目录并更新 sys.path(除了使用层)
    猜你喜欢
    • 2020-12-04
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多