带有 SKLEARN、PANDAS 和 NUMPY 问题的 Python 部署包?

Posted

技术标签:

【中文标题】带有 SKLEARN、PANDAS 和 NUMPY 问题的 Python 部署包?【英文标题】:Python Deployment Package with SKLEARN, PANDAS and NUMPY issue? 【发布时间】:2018-08-22 21:16:50 【问题描述】:

我是 AWS 和 Python 的新手,正在尝试使用 AWS Lambda 函数实现一个简单的 ML 推荐系统以进行自学。我坚持包装 sklearn、numpy 和 pandas 的组合。如果结合任何两个库意味着(Pandas 和 Numpy)或(Numpy 和 Skype)工作正常并完美部署。因为我使用的是 ML 系统,所以我需要 sklearn(scipy 和 pandas 和 numpy),它无法工作,并且在 aws lambda 测试中出现此错误。 到目前为止我做了什么: 我的部署包来自 python3.6 virtualenv,而不是直接来自主机。 (已经安装/配置了 python3.6、virtualenv 和 awscli,并且您的 lambda 函数代码在 ~/lambda_code 目录中):

    cd ~(我们将在主目录中构建 virtualenv)

    virtualenv venv --python=python3.6(创建虚拟环境)

    source venv/bin/activate(激活虚拟环境)

    pip install sklearn, pandas, numpy

    cp -r ~/venv/lib/python3.6/site-packages/* ~/lambda_code(将所有已安装的包复制到 lambda_code 目录的根级别。这将包括一些不必要的文件,但如果需要,您可以自己删除这些文件)

    cd ~/lambda_code

    zip -r9 ~/package.zip .(压缩 lambda 包)

    aws lambda update-function-code --function-name my_lambda_function --zip-file fileb://~/package.zip(上传到 AWS)

之后出现此错误:

**"errorMessage": "Unable to import module 'index'"**

START RequestId: 0e9be841-2816-11e8-a8ab-636c0eb502bf Version: $LATEST
Unable to import module 'index': **Missing required dependencies ['numpy']**

END RequestId: 0e9be841-2816-11e8-a8ab-636c0eb502bf
REPORT RequestId: 0e9be841-2816-11e8-a8ab-636c0eb502bf  Duration: 0.90 ms   Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 33 MB  

我也在 E​​C2 实例上尝试过,但没有成功。我做了谷歌并阅读了多个博客和解决方案,但没有成功。 请帮我解决这个问题。

【问题讨论】:

你检查了this和this 是的,已经尝试过了,但是需要包 SKLEARN、Numpy 和 Pandas,并且与版本没有冲突。 【参考方案1】:

您需要确保所有依赖库和包含您的函数的 Python 文件都在一个 zip 文件中,以便它检测正确的依赖关系。

所以本质上,在上传之前,您需要将 Numpy、Panda 和您自己的文件全部放在一个 zip 文件中。还要确保您的代码将本地文件(在同一个解压缩目录中)引用为依赖项。如果您已经这样做了,那么问题可能是您包含的库是如何被引用的。一旦部署到 Lambda,通过在 AWS 上获取正确的相对路径,确保您能够将包含的库用作依赖项。

【讨论】:

但这也与 Numpy 或其他类似引用的库隔离?如果 Numpy 和你的其他库和资源在同一个位置,但可以引用其他的,那就很奇怪了。 是的,这是非常奇怪的行为,我认为 Numpy、pandas 和 sklearn lib 存在兼容性问题。因为 pandas 和 sklearn lib 都使用 numpy。【参考方案2】:

你正在使用 python 3.6 。 所以 pip3 安装 numpy 应该用,试试看。

【讨论】:

是的,我已经尝试过使用 pip3 的 python 3.6 和 python 2.7。但它不起作用并出现错误。【参考方案3】:

所以就像 Wai kin chung 说的,你需要使用 pip3 来安装库。

所以要找出默认的python版本,你可以输入:

which python

python -v

所以要使用 python3 安装,您需要输入:

python3 -m pip install sklearn, pandas, numpy --user

完成后,您可以确保安装包:

python3 -m pip freeze

这将显示与您的 python 模型一起安装的所有 python 库。 拥有库后,您将希望继续执行常规步骤。当然,您首先要删除放置在 ~/venv/lib/python3.6/site-packages/* 中的所有内容。

cd ~/lambda_code
zip -r9 ~/package.zip

【讨论】:

【参考方案4】:

如果您在 Windows 上运行它(就像我一样),您会遇到在不兼容的操作系统上编译的库的问题。

您可以使用 Amazon Linux EC2 实例或 Cloud9 开发实例来构建您的 virtualenv,如上所述。

或者,您可以下载本文讨论的预编译轮文件: https://aws.amazon.com/premiumsupport/knowledge-center/lambda-python-package-compatible/

基本上,你需要去https://pypi.org上的项目页面并下载如下命名的文件:

对于 Python 2.7:模块名称-版本-cp27-cp27mu-manylinux1_x86_64.whl 对于 Python 3.6:模块名称-版本-cp36-cp36m-manylinux1_x86_64.whl

然后将 .whl 文件解压缩到您的项目目录,并将内容与您的 lambda 代码一起重新压缩。

【讨论】:

【参考方案5】:

在 Ubuntu 18.04 上遇到了类似的问题。 使用python3.7pip3.7 解决了这个问题。

安装软件包时使用pip3.7 很重要,例如pip3.7 install numpypip3.7 install numpy --user

要在 Ubuntu 上安装 python3.7pip3.7,您可以使用 deadsnakes/ppa

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.7

curl https://bootstrap.pypa.io/get-pip.py -o /tmp/get-pip.py
python3.7 /tmp/get-pip.py

此解决方案也应该适用于 Ubuntu 16.04。

【讨论】:

以上是关于带有 SKLEARN、PANDAS 和 NUMPY 问题的 Python 部署包?的主要内容,如果未能解决你的问题,请参考以下文章

用于 sklearn 管道的 pandas 到 numpy 数组

Pandas+Numpy+Sklearn随机取数

Pandas+Numpy+Sklearn随机取数

Pandas+Numpy+Sklearn随机取数

将 pandas 稀疏数据帧转换为稀疏 numpy 矩阵以供 sklearn 使用?

Pandas sklearn one-hot 编码数据帧或 numpy?