【问题标题】:如何在包依赖项> 500MB的AWS lambda上运行python代码?
【发布时间】:2019-08-23 03:19:39
【问题描述】:

要求是我必须在 lambda 上触发 SageMaker 端点以获取预测(这很容易),但必须使用 XGBoost 和 SHAP 等软件包对变量重要性进行一些额外处理。

我可以使用 SageMaker Jupyter 笔记本到达终点并获得可变的重要性。现在,我想在 AWS lambda 上复制同样的东西。

1) 如何在 AWS lambda 上运行带有 Pandas、XGBoost 和 SHAP 包依赖项的 python 代码(总包大小大于 500MB)。解压后的部署包大小大于 250 MB,因此 lambda 不允许部署。我什至尝试使用 Cloud9 中的 lambda 函数,但由于大小限制而得到相同的错误。我也尝试过 lambda 层,但没有运气。

2) 有没有办法让我在 lambda 上或通过 lambda 运行包含如此大包的代码,绕过 250 MB 的部署包大小限制

3) 有没有办法通过 lambda 触发 SageMaker notebook 执行,它会进行计算并将输出返回给 lambda?

【问题讨论】:

  • 考虑使用 AWS ElasticBeanstalk。

标签: python amazon-web-services aws-lambda xgboost amazon-sagemaker


【解决方案1】:

尝试将您的依赖项上传到 Lambda 层。仅供参考:https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html

【讨论】:

  • 正如在其他地方的评论中提到的,此解决方案仍受 250 MB 大小限制(所有解压缩层的大小加上您的 lambda 函数的总和)。
【解决方案2】:

除了为您的依赖项使用多个层之外 - 您可能希望通过 linux strip 命令减少 *.so 文件,该命令会丢弃生产中可能不需要的编译目标文件中的符号

为了剥离所有*.so-

  1. 使用 linux/docker 容器访问您的依赖项目录
  2. cd 到你的依赖目录
  3. 运行
find . -name *.so -exec strip {} \;

将对当前工作目录中的每个*.so文件递归执行strip命令。

它帮助我将我的一个依赖对象从 94MB 减少到仅 7MB

【讨论】:

    【解决方案3】:

    我发现 AWS lambda 大小的 250MB 限制非常严格。 xgboost 包中只有一个文件 ibxgboost.so 已经大约 140 MB,剩下的只有 110 MB 用于其他所有内容。这使得 AWS lambdas 只能用于简单的“hello world”内容。 作为一个丑陋的解决方法,您可以将 xgboost 包存储在 s3 上的某个位置,然后将其从 lambda 调用例程复制到 /tmp 文件夹,并将您的 python 路径指向它。允许的 tmp 空间稍高一些 - 500MB,因此它可能会起作用。 我不确定在 lambda 函数运行之间是否没有清理 /tmp 文件夹。

    【讨论】:

      【解决方案4】:

      在进行实际预测之前,您可以尝试使用 SageMaker 推理管道进行预处理。基本上,您也可以使用用于推理训练的相同预处理脚本。部署管道模型后,带有预处理任务的全套容器将安装并运行在端点或转换作业中的每个 EC2 实例上。特征处理和推理的执行延迟很低,因为推理管道中部署的容器位于同一 EC2 实例(端点)上。您可以参考文档here

      以下博客文章/笔记本详细介绍了此功能

      【讨论】:

      • 感谢您的回复。从架构的角度来看,这似乎是可行的。但是,我不确定如何实际实施它。在示例中,主要是预处理,其中数据被处理并存储在管道中下一个模型可访问的位置。在我的场景中,我想在 XGBoost 端点做出预测之后运行一个 python 脚本(具有很大的依赖关系)。该脚本将计算变量重要性,然后将最终结果(模型预测+变量重要性)发送回 API 或 lambda 函数
      猜你喜欢
      • 1970-01-01
      • 2018-09-25
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      相关资源
      最近更新 更多