【问题标题】:How do I create an AWS Lambda layer for seaborn?如何为 seaborn 创建 AWS Lambda 层?
【发布时间】:2020-12-21 02:59:22
【问题描述】:

我未能为 seaborn 创建用于 AWS Lambda 的层。

我尝试使用以下命令创建 python 环境并安装 seaborn:

python -m venv python
cd python/Scripts
activate
pip3 install seaborn

安装包,然后我使用此层次结构组织文件夹: aws_lambda_python37_layer_seaborn\python\lib\python3.7\site-packages\seaborn

(site-packages 还包含许多其他文件夹,我假设它们是 seaborn 的依赖项)

我从其他人为 matplotlib 创建的层复制了层次结构,该层在 AWS Lambda 上可以正常工作。

但是,当我尝试导入 seaborn 时,我收到此错误: "errorMessage": "无法导入模块 'lambda_function': 没有名为 'seaborn' 的模块"

我正在使用 python 3.7

【问题讨论】:

  • seaborn 需要很多依赖。我创建了图层,但它超过了 70MB。您是否使用两层来克服每层 50 MB 的限制?
  • 我已经有一个工作的 mathplotlib 层,它是 seaborn 的一个依赖。你是这个意思吗?
  • 我可以按照我的方式提供 seaborn 层的步骤,但由于总大小,我必须排除它的依赖关系。如果这会有所帮助,我可以提供详细的答案。
  • 是的,请这样做。

标签: python amazon-web-services matplotlib aws-lambda seaborn


【解决方案1】:

我刚刚使用seaborn创建了自定义层,并且可以确认它可以工作。该层显式安装了一些依赖项,但不使用numpyscipy。这两个包必须由AWS托管层AWSLambda-Python37-SciPy1x提供。

因此您需要在您的函数中使用两层。下面创建了一个自定义,第二个是AWSLambda-Python37-SciPy1x

使用的技术包括最近 AWS 博客中描述的 docker 工具

因此对于这个问题,我验证了如下:

  1. 创建空文件夹,例如mylayer
mkdir mylayer && cd mylayer
  1. 进入文件夹并创建requirements.txt:
echo seaborn > requirements.txt 
echo matplotlib >> requirements.txt
echo pyparsing >> requirements.txt
echo cycler >> requirements.txt
echo certifi >> requirements.txt
echo pillow >> requirements.txt
echo six >> requirements.txt
echo pandas >> requirements.txt
echo kiwisolver >> requirements.txt
echo pytz >> requirements.txt
  1. 运行以下 docker 命令:

注意使用--no-deps 跳过任何依赖appart 从上面指定的那些。

docker run -v "$PWD":/var/task "lambci/lambda:build-python3.7" /bin/sh -c "pip install --no-deps -r requirements.txt -t python/lib/python3.7/site-packages/; exit"
  1. 将层创建为 zip:
zip -9 -r mylayer.zip python 
  1. 在 AWS 控制台中基于 mylayer.zip 创建 lambda 层。 不要忘记将Compatible runtimes 指定为python3.7

  2. 使用以下 lambda 函数在 lambda 中测试层:

import json

import seaborn

def lambda_handler(event, context):

    print(dir(seaborn))

函数正确执行

['FacetGrid', 'JointGrid', 'PairGrid', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_orig_rc_params', 'algorithms', 'axes_style', 'axisgrid', 'barplot', 'blend_palette', 'boxenplot', 'boxplot', 'categorical', 'catplot', 'choose_colorbrewer_palette', 'choose_cubehelix_palette', 'choose_dark_palette', 'choose_diverging_palette', 'choose_light_palette', 'clustermap', 'cm', 'color_palette', 'colors', 'countplot', 'crayon_palette', 'crayons', 'cubehelix_palette', 'dark_palette', 'desaturate', 'despine', 'distplot', 'distributions', 'diverging_palette', 'dogplot', 'external', 'factorplot', 'get_data_home', 'get_dataset_names', 'heatmap', 'hls_palette', 'husl_palette', 'jointplot', 'kdeplot', 'light_palette', 'lineplot', 'lmplot', 'load_dataset', 'lvplot', 'matrix', 'miscplot', 'mpl', 'mpl_palette', 'pairplot', 'palettes', 'palplot', 'plotting_context', 'pointplot', 'rcmod', 'regplot', 'regression', 'relational', 'relplot', 'reset_defaults', 'reset_orig', 'residplot', 'rugplot', 'saturate', 'scatterplot', 'set', 'set_color_codes', 'set_context', 'set_hls_values', 'set_palette', 'set_style', 'stripplot', 'swarmplot', 'utils', 'violinplot', 'widgets', 'xkcd_palette', 'xkcd_rgb']

【讨论】:

  • 感谢您的回答@Marcin,有没有办法使用https://pypi.org/ 来做到这一点,我一直在尝试使用 xlrd
  • @pc_pyr 是的,您可以以类似的方式创建其他层。只需使用所需的包修改requirements.txt。顺便说一句,如果我的回答有帮助,我们将不胜感激。
  • 谢谢@Marcin,我没有发布这个问题,因此无法接受,但赞成它,我得到ImportError: Can't determine version for xlrd,对此的任何帮助将不胜感激
  • @ 如果您针对您的问题提出具体问题,在我看来会更好。它将允许其他人也做出贡献,并且其他人将来会更容易找到它。我也尽力提供帮助。
  • 谢谢@Marcin!感谢您的帮助!
【解决方案2】:

我的帖子接受的答案适用于 Linux,也适用于 Windows,只需稍作调整。 对于偶然发现这篇文章的 Windows 用户,我必须这样做才能创建自己的层:

Docker 无法在我的计算机上正常运行的原因是我的 Windows 10 版本造成的。我有 Windows 10 Home,我需要 Professional 或 Enterprise 才能正确运行 Docker。升级到 Windows Professional 后,我能够正确安装 Docker。

正确安装 Docker 后,我就可以运行 @Marcin 的命令了。

但由于这是针对 Windows 的,我需要将“$PWD”更改为“%cd%”。

像这样: docker run -v "%cd%":/var/task "lambci/lambda:build-python3.7" /bin/sh -c "pip install --no-deps -r requirements.txt -t python/lib/python3.7/site-packages/; exit"

运行此命令后,docker 会立即提示您允许文件访问指定目录。让它让命令完成。

命令完成后,请确保仅压缩名为 python 的文件夹。由于这是针对 Windows 的,我不相信@Marcin 的 zip 命令会起作用。但是任何压缩软件都足够了。我用 7-Zip 就好了。右键单击 python 文件夹,选择“添加到 python.zip”,瞧!您的压缩层已准备好添加到 AWS Lambda。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    相关资源
    最近更新 更多