Запуск Scipy на Heroku

Я запустил Numpy и Matplotlib на Heroku, и я также пытаюсь установить Scipy. Однако Scipy требует установки BLAS[1], который не представлен на платформе Heroku. После обращения в службу поддержки Heroku мне предложили собрать BLAS как статическую библиотеку для развертывания и настроить необходимые переменные среды.

Итак, я скомпилировал libblas.a на 64-битной Linux-системе и установил следующие переменные, как описано в [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

После добавления scipy==0.10.1 в мои требования.txt отправка все еще не удалась.

     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


person Joseph Chang    schedule 22.03.2012    source источник


Ответы (6)


Мне удалось заставить это работать на кедровом стеке, создав numpy и scipy в автономном режиме как bdists, а затем изменив пакет сборки heroku python, чтобы распаковать их напрямую в области поставщика / venv динамометра. Вы также можете использовать пакет сборки для установки переменных среды, которые сохраняются.

Heroku официально еще не опубликовала сборочные пакеты — ищите «heroku buildpacks», чтобы получить больше сторонних/heroku сборок и информацию.

Мой форк пакета сборки python находится здесь: https://[email protected]/wyn/heroku-buildpack-python.git

Изменения находятся в bin/compile, где я получаю два новых шага: шаг scipy/numpy и шаг openopt. Сценарии для двух шагов находятся в bin/steps/npscipy и bin/steps/openopt. Я также добавил некоторые переменные в bin/release. Обратите внимание, что я предполагаю установку через файл setup.py, а не подход с использованием требований.txt (см. https://devcenter.heroku.com/articles/python-pip#traditional_distributions).

Я также загружаю бинарные файлы blas/lapack/atlas/gfortran, которые использовались для сборки numpy/scipy на динамометрическом стенде, поскольку есть расширения c, которые необходимо связать с ними. Причина создания всего в автономном режиме и загрузки заключается в том, что для установки numpy / scipy pip требуется, чтобы у вас был компилятор fortran + связанная среда разработки, и это сделало мои слаги слишком большими.

Кажется, это работает, размер фрагмента теперь составляет 35 МБ, и масштабирование тоже кажется быстрым. Все тесты numpy, кроме одного, проходят, и все тесты scipy проходят.

Это все еще работа для меня, но я решил поделиться.

person coshx    schedule 17.05.2012
comment
извините, забыл сказать, если вы хотите использовать сборочный пакет как есть, сделайте: $ heroku create appname --stack=cedar [email protected]:wyn/heroku-buildpack-python.git - person coshx; 17.05.2012
comment
Спасибо, мне нравится играть со стеком кедра и собирать пакеты. Сейчас я изучаю vulcan builder, я думаю, было бы неплохо построить эти штуки с помощью этого... - person coshx; 19.05.2012
comment
Здравствуйте, не бойтесь, я только что построил их на своем Ubuntu Oineric (?) 64-битном виде в виде пакетов bdist, т.е. установил BLAS и LAPACK env vars, а затем сделал python setup.py bdist - person coshx; 27.08.2012
comment
Потрясающая работа. Спасибо! Однако у меня возникла проблема при импорте модуля scipy.stats. Я получаю следующее исключение: ImportError: liblapack.so.3gf: невозможно открыть общий объектный файл: нет такого файла или каталога - person Paul Hunter; 25.11.2012
comment
@paul привет, извините, я сейчас на работе, поэтому не могу разобраться в этом прямо сейчас, но часто это означает, что клиентский модуль не может связать файл .so? Вы пробовали войти в свой dyno через клиент bash и использовать ldd, чтобы увидеть, что, по мнению liblapack.so.3gf, отсутствует? - person coshx; 26.11.2012
comment
Я думаю, проблема в том, что liblapack.so.3gf отсутствует полностью? - person Paul Hunter; 30.11.2012
comment
Здравствуйте, @paul: я только что посмотрел на это и думаю, что это связано с тем, что я использую синтаксис git@ url, а не git:// urls. Я подозреваю, что сборочный пакет даже не установился для вас правильно? Я исправил это в своем пакете сборки и рекомендую использовать: $ heroku create --stack=cedar --buildpack=git://github.com/wyn/heroku-buildpack-python.git - person coshx; 03.12.2012
comment
Я также разместил небольшой игрушечный пример на github (git://github.com/wyn/npsp-helloworld.git), который содержит более подробные сведения и позволяет вам попробовать пример, который, как я знаю, работает для меня. @aaronsw: извините за поздний ответ, у меня нет общедоступного примера, чтобы показать, надеюсь, примера с игрушкой будет достаточно? Я надеюсь потратить некоторое время на Рождество, работая над записью в блоге, в которой более подробно рассматривается асинхронный подход. - person coshx; 03.12.2012

На случай, если кто-то еще придет к этому, как я...

отличный ответ на этот вопрос от @coshx, к сожалению, больше не работает (по крайней мере, мне не удалось заставить его работать). Однако я сделал следующее:

  1. Я разветвил репозиторий npsicpy-binaries из @coshx и изменил все tar-файлы, чтобы они не иметь venv в качестве корневой папки внутри (моя вилка находится здесь)

  2. Я развил репозиторий npsp-helloworld из @coshx и заставил его использовать файл requirements.txt вместо setup.py (моя вилка находится здесь - это означает, что вы можете использовать подход с полным пунктом) .

  3. Я развил репозиторий heroku-buildpack-python от Heroku, взял npscipy из @coshx и изменил его для работы с этим последняя версия пакета сборки (моя вилка находится здесь - вы можете видеть, что есть например, 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 и все эти штуки с открытым исходным кодом.

person kmp    schedule 22.09.2013

Другим хорошим вариантом является conda buildpack, который позволяет добавить любой из доступных бесплатных пакетов Linux64. через Anaconda/Miniconda в приложение Heroku. Некоторые из самых популярных пакетов включают numpy, scipy, scikit-learn, statsmodels, pandas и cvxopt. В то время как сборочный пакет упрощает добавление пакетов в приложение, его недостатки заключаются в том, что сборка занимает много места и вам нужно ждать, пока Anaconda обновит библиотеки в репозитории.

Если вы запускаете новое приложение Python на Heroku, вы можете добавить сборочный пакет conda с помощью команды:

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

Если вы уже настроили приложение Python на Heroku, вы можете добавить сборочный пакет conda в существующее приложение с помощью команды:

$ 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 в приложение Python на Heroku.

person eric    schedule 27.01.2015

Компилятор slug не знает о ваших переменных среды, поэтому он терпит неудачу во время отправки, а не после запуска.

Единственный реальный вариант, который у вас есть, — это взглянуть на аддон user_env_compile, который в настоящее время находится в стадии бета-тестирования.

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

person Neil Middleton    schedule 22.03.2012

Для тех, кто хочет использовать Python 3.4 в производстве, я собрал numpy 1.8.1, scipy 0.14.0 и scikit-learn 0.15-git (по какой-то причине 0.14 не работает с другими) в виде двоичных файлов на Ubuntu 10.04. 64-разрядная версия LTS, которая работает на кедровом стеке Heroku. Вот репозиторий git.

Мой пакет сборки heroku очень похож на пакет kmp. Обратите внимание, что файл bin/steps/npscipy ссылается на мой репозиторий двоичных файлов выше.

person transcranial    schedule 13.05.2014

Я размещаю это здесь на случай, если кто-то наткнулся на это, как я. Поскольку я использую Python 3.4, thenovices buildpack не работает для меня.

Я попытался посмотреть на сборочный пакет conda, но это кажется немного излишним для моего приложения, для которого требуются только scipy и numpy. Что, наконец, работает для меня, так это это отличное руководство, использующее подход с несколькими пакетами сборки. Однако установка scipy была действительно немного длинной. Надеюсь это поможет! :)

person divestrato    schedule 12.10.2015