我正在尝试在 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