Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在AWS lambda上使用包依赖项运行python代码>;500MB?_Python_Amazon Web Services_Aws Lambda_Xgboost_Amazon Sagemaker - Fatal编程技术网

如何在AWS lambda上使用包依赖项运行python代码>;500MB?

如何在AWS lambda上使用包依赖项运行python代码>;500MB?,python,amazon-web-services,aws-lambda,xgboost,amazon-sagemaker,Python,Amazon Web Services,Aws Lambda,Xgboost,Amazon Sagemaker,要求是我必须在lambda上触发SageMaker端点以获得预测(这很容易),但必须使用XGBoost和SHAP等包对可变重要性进行额外处理 使用SageMaker Jupyter笔记本,我能够到达终点并获得可变的重要性。现在,我想在AWS lambda上复制同样的东西 1) 如何在AWS lambda上运行python代码,其中包含Pandas、XGBoost和SHAP的包依赖项(总包大小大于500MB)。解压缩的部署包大小大于250 MB,因此lambda不允许部署。我甚至尝试使用Cloud

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

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

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

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


3) 是否有办法通过lambda触发SageMaker笔记本执行,从而执行计算并将输出返回lambda?

尝试将依赖项上载到lambda层。仅供参考:

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

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


我一直遵循的一个标准是,我从不使用lambda函数发送库或外部软件包,我总是创建层

层是包含库、自定义运行时或其他依赖项的ZIP存档。对于层,您可以在函数中使用库,而无需将它们包含在部署包中

如果您将每个依赖项,即Pandas、XGBoost和SHAP打包到它们自己的Lambda层中,并将其附加到函数中,您的问题可能会得到解决


中了解有关Lambda层的更多信息我发现AWS Lambda大小的250MB限制非常严格。xgboost包中只有一个文件ibxgboost.so的大小已经在140 MB左右,剩下的所有文件都只有110 MB。这使得AWS lambdas除了用于简单的“hello world”之外没有任何用处。 作为一种难看的解决方法,您可以将xgboost包存储在s3上的某个位置,然后从lambda调用例程将其复制到/tmp文件夹,并将python路径指向它。允许的tmp空间稍高一点-500MB,因此它可能会工作。
但是我不确定在lambda函数运行期间/tmp文件夹是否未被清理

考虑使用AWS ElasticBeanstalk。谢谢回复。从建筑的角度来看,这似乎是可行的。但是,我不知道如何实际实施它。在示例中,它主要是预处理,其中数据被处理并存储在管道中下一个模型可以访问的位置。在我的场景中,我希望在XGBoost端点做出预测之后运行python脚本(具有较大的依赖项)。脚本将计算变量重要性,然后最终结果(模型预测+变量重要性)将发送回API或lambda函数。如果有500MB的包,它将不适合当前aws限制下的层。即使使用层,所有层的总大小仍受当前250MB大小限制的约束。如其他地方的评论所述,此解决方案仍受250MB大小限制的约束(所有解压缩层的大小加上lambda函数)。