在Heroku上运行Scipy

27

我已经在Heroku上成功安装了Numpy和Matplotlib,现在我想要安装Scipy。然而,Scipy需要BLAS[1]来进行安装,而Heroku平台上并没有提供BLAS。在联系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

6个回答

15

我成功地在cedar stack上运行了这个程序,方法是离线构建numpy和scipy作为bdists,然后修改heroku python buildpack以便将它们直接解压到dyno的vendor/venv区域中。使用buildpack还可以设置持久化的环境变量。

Heroku尚未正式发布buildpacks - 查询“heroku buildpacks”以获取更多第三方/heroku版本和信息。

我的python build pack分支在这里: 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方法进行的(请参见https://devcenter.heroku.com/articles/python-pip#traditional_distributions)。

我还下载blas/lapack/atlas/gfortran二进制文件到dyno上,因为有需要链接到它们的C扩展。离线构建并下载的原因是pip安装numpy/scipy需要你拥有fortran编译器+相关的dev环境,这使我的slugs太大。

看起来程序可以正常工作,slug大小现在为35mb,扩展似乎也很快。除了一个numpy测试之外,所有其他numpy测试都通过了,所有scipy测试都通过了。

这对我来说仍然是正在进行的工作,但我想分享一下。


1
抱歉,我忘了说,如果你想直接使用这个构建包的话,请执行以下操作:$ heroku create appname --stack=cedar --buildpack=git@github.com:wyn/heroku-buildpack-python.git - coshx
谢谢,我很喜欢使用cedar stack和build packs。现在我正在研究vulcan builder,我认为用它来构建这些东西会很好... - coshx
太棒了,谢谢!不过我在导入scipy.stats模块时遇到了问题。我收到以下异常:ImportError:liblapack.so.3gf:无法打开共享对象文件:没有那个文件或目录。 - Paul Hunter
@paul 你好,抱歉我现在正在工作,无法立即查看,但通常这意味着客户端模块无法链接 .so 文件?你是否尝试通过 bash 客户端登录到 dyno 并使用 ldd 查看 liblapack.so.3gf 缺少了什么? - coshx
你好 @paul:我刚刚看了一下,我认为这与我使用git@ url语法而不是git:// urls有关 - 我怀疑构建包甚至没有正确安装给你?我已经在我的构建包中解决了这个问题,并建议使用:$ heroku create --stack=cedar --buildpack=git://github.com/wyn/heroku-buildpack-python.git - coshx
显示剩余3条评论

9
如果有其他人和我一样遇到同样的问题...可惜这个问题的绝佳答案(来自@coshx)不再适用(至少我无法让它工作)。但我做了以下几件事情:
  1. 我从@coshx那里fork了npsicpy-binaries存储库,并更改了所有tar文件,使它们内部没有venv作为根目录(我的fork在这里

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

  3. 我从Heroku中fork了heroku-buildpack-python存储库,取出@coshx的npscipy文件,并将其更改为与此版本的构建包兼容(我的fork在这里 - 您可以看到例如没有设置venv)。

在完成这三件事之后,我已经完美地使用了npsp-helloworld应用程序。您只需要确保在创建应用程序时正确设置构建包,然后就可以开始使用了:

$ 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和整个开源事业。


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

如果您要在Heroku上启动新的Python应用程序,则可以使用以下命令添加conda构建包:

$ 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

要使用构建包,您需要在应用程序目录中包含两个文本文件:requirements.txt和conda-requirements.txt。与标准的Python构建包一样,requirements.txt文件列出了应使用pip安装的软件包。应使用conda安装的软件包在conda-requirements.txt文件中列出。一些最有用的科学软件包包括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应用程序中。


为什么需要conda buildpack的一个清晰的解释。请注意,此buildpack由Kenneth Reitz维护,他是“负责Heroku Python产品的技术设计”的人。 - Jason
我尝试了这个构建包,但无法继续,因为它只支持 Django 1.x 包。是否有 Django 2 的选项? - devsaw

3
小知识提示:slug编译器不了解你的环境变量,这就是为什么在推送时失败而不是运行一次失败的原因。唯一的可行选择是查看目前在实验室测试的“user_env_compile”插件。请访问http://devcenter.heroku.com/articles/labs-user-env-compile

1
对于那些希望在生产中使用Python 3.4的人,我已经在Ubuntu 10.04 LTS 64位系统上构建了numpy 1.8.1、scipy 0.14.0和scikit-learn 0.15-git(由于某种原因,0.14与其他版本不兼容),这些二进制文件可在Heroku cedar堆栈上运行。 这是git repo的链接
我的heroku构建包与kmp非常相似。请注意,bin/steps/npscipy文件链接到我上面提到的二进制文件库。

0

我把这个放在这里,以防有人像我一样遇到了这个问题。由于我使用的是Python 3.4,thenovices buildpack 对我来说不起作用。

我尝试看conda buildpack,但它似乎对我只需要scipy和numpy的应用程序有点过度。最终对我有用的是this excellent guide,使用多个buildpacks方法。虽然scipy的安装确实有点长,但希望这可以帮助你! :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接