0

我正在尝试在 Python Lambda 函数上使用 Sklearn。由于 Sklearn 不是原生的,我需要在一个层中上传库及其依赖项。其中一个依赖项 Numpy 比我上传的要大,但幸运的是,AWS 已经提供了一个 Scipy、Numpy 层 (AWSLambda-Python38-SciPy1x),太好了!因此,我认为我需要使用剩余的库创建一个层,并在我的 lambda 函数上使用这两个层。因此,我在 Windows 上创建了一个包含库(joblib、threadpoolctl、scikit-learn 和 sklearn)的层,将其上传并调用了该函数,但该函数不起作用。谷歌妈妈告诉我这是由于兼容性问题(windows-linux)¹。

{
  "errorMessage": "Unable to import module 'lambda_function': cannot import name 'WinDLL' from 'ctypes' (/var/lang/lib/python3.8/ctypes/__init__.py)",
  "errorType": "Runtime.ImportModuleError"
}

最后,我决定使用 Linux 实例,安装 Python,其余库,然后上传 Lambda 层。我得到了一个“Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type”并执行了以下描述的步骤²(请善待 Linux 新手):

在我的 Windows cmd 上

cd C:/path_to_aws.pem
ssh -i "file.pem" ec2-user@ec2-x.region.compute.amazonaws.com

sudo yum update
sudo su
yum install openssl-devel
yum install libffi-devel
yum groupinstall "Development Tools"
wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz
tar -xf Python-3.8.3.tgz
cd Python-3.8.3
sudo su
./configure --enable-optimizations
nproc
make -j 1
sudo make altinstall
exit
curl -O https://bootstrap.pypa.io/get-pip.py
python3.8 get-pip.py
sudo su
python3.8 -m venv biblio/env
source ~/biblio/env/bin/activate
pip install pip --upgrade
pip install joblib
pip install threadpoolctl
pip install scikit-learn
pip install sklearn
zip -r python38_lib.zip /biblio

ISSUE:现在我已经在 Linux 机器上安装了这个库,但是如何从本地环境将它安装到我的电脑上呢?如果它在实例上(环境外部)³,我知道如何获取它:

scp -i " file.pem " ec2-user@ec2-x.region.compute.amazonaws.com:/path/file.zip C:/

如果您可以帮助我解决最初的问题,即在 Lambda 上运行 Sklearn,并使用更短且无痛的解决方案:<3!否则,你能帮我把 library.zip 文件放到我的 Windows 上吗?

非常感谢你。

¹无法导入模块“lambda_function”:无法从“ctypes”导入名称“WinDLL”(/var/lang/lib/python3.7/ctypes/__init__.py

² https://aws.amazon.com/pt/premiumsupport/knowledge-center/ec2-linux-python3-boto3/

³ https://medium.com/@dearsikandarkhan/files-copying-between-aws-ec2-and-local-d07ed205eefa

4

1 回答 1

0

TL;DR,我已经为您构建了图层。您可以通过这个 gdrive链接下载它。注意:包括 NumPy。

使用无服务器框架更容易构建 lambda 层。

# serverless.yml

service: serverless-example

plugins:
  - serverless-python-requirements

custom:
  pythonRequirements:
    dockerizePip: non-linux
    layer: true

provider:
  name: aws
  runtime: python3.8
  stage: dev
  region: us-east-1
  profile: dummy

functions:
  dummy:
    handler: dummy.handler
# requirements.txt

joblib==0.16.0
threadpoolctl==2.1.0
scikit-learn==0.23.1

只需这样做sls package -p pkg,然后命名的层 zippythonRequirements.zip将在pkg目录中。

于 2020-07-13T21:52:08.490 回答