【问题标题】:Running Scipy on Heroku在 Heroku 上运行 Scipy
【发布时间】:2012-04-06 21:04:05
【问题描述】:

我在 Heroku 上运行了 Numpy 和 Matplotlib,我也在尝试安装 Scipy。但是,Scipy 需要安装 BLAS[1],这在 Heroku 平台上没有提供。联系 Heroku 支持后,他们建议我将 BLAS 构建为静态库以进行部署,并设置必要的环境变量。

所以,我在 64 位 Linux 机器上编译了 libblas.a,并按照 [2] 中的描述设置了以下变量:

$ heroku config
BLAS             => .heroku/vendor/lib/libfblas.a
LD_LIBRARY_PATH  => .heroku/vendor/lib
LIBRARY_PATH     => .heroku/vendor/lib
PATH             => bin:/usr/local/bin:/usr/bin:/bin
PYTHONUNBUFFERED => true

在我的 requirements.txt 中添加 scipy==0.10.1 后,推送仍然失败。

     File "scipy/integrate/setup.py", line 10, in configuration

       blas_opt = get_info('blas_opt',notfound_action=2)

     File "/tmp/build_h5l5y31i49e8/lib/python2.7/site-packages/numpy/distutils/system_info.py", line 311, in get_info

       return cl().get_info(notfound_action)

     File "/tmp/build_h5l5y31i49e8/lib/python2.7/site-packages/numpy/distutils/system_info.py", line 462, in get_info

       raise self.notfounderror(self.notfounderror.__doc__)

   numpy.distutils.system_info.BlasNotFoundError:

       Blas (http://www.netlib.org/blas/) libraries not found.

       Directories to search for the libraries can be specified in the

       numpy/distutils/site.cfg file (section [blas]) or by setting

       the BLAS environment variable.

好像 pip 不知道 BLAS 环境变量,所以我使用 heroku run python 检查环境:

(venv)bash-3.2$ heroku run python
Running python attached to terminal... import up, run.1
Python 2.7.2 (default, Oct 31 2011, 16:22:04) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.system('bash')
~ $ echo $BLAS
.heroku/vendor/lib/libfblas.a
~ $ ls .heroku/vendor/lib/libfblas.a
.heroku/vendor/lib/libfblas.a
~ $ 

而且看起来还不错。现在我不知道如何解决这个问题。

[1]http://www.netlib.org/blas/ [2]http://www.scipy.org/Installing_SciPy/Linux

【问题讨论】:

    标签: heroku numpy scipy blas


    【解决方案1】:

    slug 编译器不知道您的环境变量,这就是它在推送期间失败的原因,而且一次运行都没有。

    您唯一真正的选择是查看当前处于实验室测试阶段的 user_env_compile 插件。

    http://devcenter.heroku.com/articles/labs-user-env-compile

    【讨论】:

      【解决方案2】:

      我设法通过将 numpy 和 scipy 离线构建为 bdists,然后修改 heroku python buildpack 以将它们直接解压缩到 dyno 的供应商/venv 区域,从而在 cedar 堆栈上工作。您还可以使用 buildpack 设置持久的环境变量。

      Heroku 尚未正式发布构建包 - 搜索“heroku buildpacks”以获取更多第三方/heroku 构建包和信息。

      我的 python 构建包的分支在这里: https://wyn@github.com/wyn/heroku-buildpack-python.git

      更改在 bin/compile 中,我在其中获取了两个新步骤,一个 scipy/numpy 步骤和一个 openopt 步骤。这两个步骤的脚本位于 bin/steps/npscipy 和 bin/steps/openopt 中。我还在 bin/release 中添加了一些变量。请注意,我假设通过 setup.py 文件而不是 requirements.txt 方法进行安装(c.f. https://devcenter.heroku.com/articles/python-pip#traditional_distributions)。

      我还将用于构建 numpy/scipy 的 blas/lapack/atlas/gfortran 二进制文件下载到 dyno 上,因为有 c 扩展需要链接到它们。离线构建和下载所有内容的原因是 pip 安装 numpy/scipy 需要你有一个 fortran 编译器 + 相关的开发环境,这让我的 slug 太大了。

      它似乎工作了,slug 大小现在是 35mb 并且缩放似乎也很快。除一项 numpy 测试外,所有测试均通过,所有 scipy 测试均通过。

      这对我来说仍在进行中,但我想我会分享。

      【讨论】:

      • 抱歉忘了说,如果您想按原样使用 buildpack,请执行以下操作: $ heroku create appname --stack=cedar --buildpack=git@github.com:wyn/heroku-buildpack- python.git
      • 谢谢,我喜欢玩 cedar 堆栈和构建包。我现在正在研究 vulcan builder,我认为用它来构建这些东西会很好......
      • 你好 - 不用担心,我只是在我的 Ubuntu Oineric (?) 64 位上将它们构建为 bdist 包,即设置 BLAS 和 LAPACK 环境变量,然后执行 python setup.py bdist
      • 惊人的工作。谢谢!但是,在导入 scipy.stats 模块时,我遇到了问题。我得到以下异常: ImportError: liblapack.so.3gf: cannot open shared object file: No such file or directory
      • @paul 你好,对不起,我现在正在工作,所以现在不能调查这个问题,但这通常意味着客户端模块无法链接 .so 文件?您是否尝试过通过 bash 客户端登录您的 dyno 并使用 ldd 查看 liblapack.so.3gf 认为缺少的内容?
      【解决方案3】:

      万一其他人像我一样遇到这种情况......

      来自@coshx 的这个问题上的excellent answer 遗憾地不再起作用(至少我无法让它起作用)。然而,我所做的是:

      1. 我从 @coshx 分叉了 npsicpy-binaries 存储库并更改了所有 tar 文件,使得它们没有 venv 作为里面的根文件夹(我的 fork 是 here

      2. 我从@coshx 分叉了npsp-helloworld 存储库,并使它使用requirements.txt 文件而不是setup.py(我的fork 是here - 这意味着您可以使用整个pip 方法) .

      3. 我从 Heroku 分叉了 heroku-buildpack-python 存储库,从 @coshx 获取了 npscipy 文件并将其更改为与最新版本的构建包一起使用(我的 fork 是 here - 你可以看到例如,没有设置 venv)。

      完成这三件事后,npsp-helloworld 应用程序运行良好。您只需要确保在创建应用程序时正确设置 buildpack 即可:

      $ heroku create --stack=cedar --buildpack=https://github.com/kmp1/heroku-buildpack-python.git
      

      注意:我还没有弄清楚如何制作我自己的二进制文件,所以这三个库(scipy、numpy 和 scikit-learn)不是最新版本,所以请确保在安装时安装它(如果有人可以构建这些我很乐意接受他们的拉取请求):

      pip install scipy==0.11.0
      pip install numpy==1.7.0
      pip install scikit-learn==0.13.1
      

      顺便说一句 - 如果我没有以正确的方式做事,我真的很抱歉,礼仪方面。我还在学习 git 和整个开源的东西。

      【讨论】:

        【解决方案4】:

        对于那些希望在生产中使用 Python 3.4 的人,我构建了 numpy 1.8.1、scipy 0.14.0 和 scikit-learn 0.15-git(0.14 由于某种原因不能与其他版本一起使用)作为二进制文件在 Ubuntu 10.04 LTS 64 位上,它适用于 Heroku cedar 堆栈。 Here is the git repo.

        我的 heroku buildpack 与 kmp 的非常相似。请注意,bin/steps/npscipy 文件链接到我上面的二进制存储库。

        【讨论】:

          【解决方案5】:

          另一个不错的选择是conda buildpack,它允许您将通过 Anaconda/Miniconda 提供的任何免费 Linux64 软件包添加到 Heroku 应用程序。一些最受欢迎的软件包包括 numpy、scipy、scikit-learn、statsmodels、pandas 和 cvxopt。虽然 buildpack 使得将包添加到应用程序变得相当简单,但缺点是 buildback 占用了大量空间,并且您必须等待 Anaconda 更新存储库中的库。

          如果您在 Heroku 上启动一个新的 Python 应用程序,您可以使用以下命令添加 conda buildpack:

          $ heroku create YOUR_APP_NAME --buildpack https://github.com/kennethreitz/conda-buildpack.git
          

          如果您已经在 Heroku 上设置了 Python 应用程序,您可以使用以下命令将 conda buildpack 添加到现有应用程序:

          $ heroku config:add BUILDPACK_URL=https://github.com/kennethreitz/conda-buildpack.git
          

          或者,如果您需要按名称指定应用程序:

          $ heroku config:add BUILDPACK_URL=https://github.com/kennethreitz/conda-buildpack.git --app YOUR_APP_NAME
          

          要使用 buildpack,您需要在 app 目录中包含两个文本文件,requirements.txt 和 conda-requirements.txt。与标准 Python buildpack 一样,requirements.txt 文件列出了应该使用 pip 安装的包。 conda-requirements.txt 文件中列出了应使用 conda 安装的软件包。一些最有用的科学软件包包括 numpy、scipy、scikit-learn、statsmodels、pandas 和 cvxopt。可用 conda 包的完整列表可以在 repo.continuum.io 找到。

          例如:

          $ cat requirements.txt
          gunicorn==0.14.2
          requests==0.11.1
          
          $ cat conda-requirements.txt
          scipy
          numpy
          cvxopt
          

          就是这样!您现在可以将 Anaconda 包添加到 Heroku 上的 Python 应用程序。

          【讨论】:

          【解决方案6】:

          我把它放在这里以防有人像我一样偶然发现它。由于我使用的是 python 3.4,thenovices buildpack 不适合我。

          我尝试查看 conda buildpack,但对于我只需要 scipy 和 numpy 的应用程序来说,这似乎有点过头了。最终对我有用的是this excellent guide,使用了多构建包方法。 scipy 安装确实有点长。希望这可以帮助! :)

          【讨论】:

            猜你喜欢
            • 2018-01-28
            • 2016-03-23
            • 2013-08-27
            • 1970-01-01
            • 2012-06-05
            • 2011-09-17
            • 2022-01-26
            • 2017-12-14
            • 1970-01-01
            相关资源
            最近更新 更多