2012-03-22 24 views
26

Mam Numpy i Matplotlib działające na Heroku, a także próbuję zainstalować Scipy. Jednak Scipy wymaga BLAS [1] do zainstalowania, co nie jest prezentowane na platformie Heroku. Po skontaktowaniu się z obsługą Heroku zaproponowali mi zbudowanie BLASa jako biblioteki statycznej do wdrożenia i skonfigurowanie niezbędnych zmiennych środowiskowych.Uruchamianie Scipy na Heroku

Więc skompilowany libblas.a na polu 64-bitowego systemu Linux i ustawić następujące zmienne jak opisano w [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 

Po dodaniu scipy == 0.10.1 moim requirements.txt, Push nadal nie działa.

 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. 

Wydaje się, że PIP nie jest świadomy zmiennej środowiskowej Blas, więc sprawdź środowisko używając run Heroku Pythona:

(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 
~ $ 

I wydaje się w porządku. Teraz nie mam pojęcia, jak rozwiązać ten problem.

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

Odpowiedz

3

Kompilator ślimak nie jest świadomy swoich zmiennych środowiskowych, dlatego nie jest on w trakcie naciśnięciem, a raz nie działa.

Jedyną dostępną opcją jest przeglądanie dodatku user_env_compile, który jest obecnie w fazie testów laboratoryjnych.

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

15

udało mi się uzyskać tej pracy na stosie cedrowego budując numpy i scipy trybie offline jak bdists a następnie modyfikując buildpack Heroku Pythona rozpakować te na obszarach sprzedawca/venv Dyno bezpośrednio. Możesz także użyć buildpack, aby ustawić zmienne środowiskowe, które się utrzymają.

Heroku nie opublikowali jeszcze oficjalnie buildpacków - szukaj 'heroku buildpacks', aby uzyskać więcej informacji na temat osób trzecich i heroku.

Mój widelec pakietu python build jest tutaj: https://[email protected]/wyn/heroku-buildpack-python.git

Zmiany są w bin/skompilować gdzie zaopatrywać się dwa nowe etapy, a scipy/numpy krok oraz krok openopt. Skrypty dla dwóch kroków znajdują się w bin/steps/npscipy i bin/steps/openopt. Dodałem także kilka zmiennych do bin/release. Zauważ, że zakładam instalację przez plik setup.py, a nie przez metodę requirements.txt (patrz: https://devcenter.heroku.com/articles/python-pip#traditional_distributions).

Pobieram również pliki binarne blas/lapack/atlas/gfortran, które zostały użyte do zbudowania numpy/scipy na dyno, ponieważ są rozszerzenia c, które muszą się do nich podłączyć. Powodem budowania wszystkiego offline i pobierania jest to, że instalowanie pip-numpy/scipy wymaga posiadania kompilatora fortranowego + powiązanego środowiska dev i to spowodowało, że moje ślimaki są zbyt duże.

Wydaje się działać, rozmiar ślimaka wynosi teraz 35mb, a skalowanie również wydaje się szybkie. Wszystkie testy z wyjątkiem jednego są niezauważone i wszystkie testy scipy mijają.

To wciąż jest w toku, ale myślałem, że się podzielę.

+1

Przepraszam, zapomniałem powiedzieć, jeśli chcesz użyć buildpack, jak to zrobić: $ heroku stwórz appname --stack = cedar [email protected]: wyn/heroku-buildpack-python.git – coshx

+3

Świetna robota! Jestem gościem Pythona w Heroku. :) –

+0

Dzięki, cieszę się z gry z cedrowego stosu i budowania paczek. Teraz zajmuję się budowniczym wulkanów, myślę, że dobrze by było zbudować te rzeczy ... – coshx

8

Na wypadek, gdyby ktoś inny podszedł do tego, tak jak ja ...

excellent answer na to pytanie z @coshx niestety już nie działa (przynajmniej nie mogłem go uruchomić). To, co zrobiłem, jednak był następujący:

  1. I rozwidlone npsicpy-binaries repozytorium z @coshx i zmienione wszystkie pliki tar takie, które nie mają venv jako główny folder wewnątrz (mój widelec jest here)

  2. Rozwidlałem repozytorium npsp-helloworld z @ coshx i użyłem pliku requirements.txt zamiast setup.py (mój fork to here - oznacza to, że możesz użyć całej metody pip).

  3. I rozwidlone repozytorium heroku-buildpack-python z Heroku, wziął plik z @coshx npscipy i zmienił go do pracy z najnowszej wersji pakietu build (mój widelec jest here - widać, że nie ma venv skonfigurować, na przykład).

Po wykonaniu tych trzech czynności, aplikacja npsp-helloworld działa idealnie. Musisz tylko upewnić się, że ustawienie buildpack odpowiednio podczas tworzenia aplikacji i jesteś dobry, aby przejść:

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

UWAGA: Nie wypracowaliśmy jak zrobić własne pliki binarne jeszcze, więc trzech bibliotek (scipy, numpy i scikit-learn) nie są najnowsze wersje, więc upewnij się, gdy go zainstalować robisz (jeśli ktoś może zbudować to ja chętnie akceptować żądania ściągania dla nich):

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

przy okazji - Naprawdę przepraszam, jeśli nie zrobiłem tego we właściwy sposób, zgodnie z zasadami etyki. Wciąż uczę się git i tego całego oprogramowania open source.

1

Dla tych, którzy chcą używać Pythona 3.4 w produkcji, zbudowałem numpy 1.8.1, scipy 0.14.0 i scikit-learn 0.15-git (0.14 nie działa z innymi z jakiegoś powodu) jako binaria na Ubuntu 10.04 LTS 64-bit, który działa na stosie cedrów Heroku. Here is the git repo.

Mój buildout heroku jest bardzo podobny do tego z kmp. Zwróć uwagę, że plik bin/steps/npscipy łączy się z moim repozytorium plików binarnych powyżej.

8

Inną dobrą opcją jest conda buildpack, która pozwala dodać dowolny z darmowych pakietów Linux64 dostępnych przez Anacondę/Minicondę do aplikacji Heroku. Niektóre z najpopularniejszych pakietów to numpy, scipy, scikit-learn, statsmodels, pandy i cvxopt. Podczas budowania sprawia, że ​​dość łatwo dodać pakiety do aplikacji, wadą jest to, że buildback zajmuje dużo miejsca i że trzeba czekać na Anacondzie, aby zaktualizować biblioteki w repozytorium.

Jeśli rozpoczynasz nową aplikację Pythona na Heroku można dodać buildpack Conda za pomocą polecenia:

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

Jeśli już tylko konfiguracja aplikacji Pythona na Heroku, można dodać buildpack Conda do istniejąca aplikacja za pomocą polecenia:

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

Lub, jeśli trzeba określić aplikację po nazwie:

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

Aby użyć buildpack, będziesz musiał dołączyć dwa pliki tekstowe do katalogu app, requirements.txt i conda-requirements.txt. Podobnie jak w przypadku standardowego buildpaka Pythona, plik requirements.txt zawiera listę pakietów, które powinny zostać zainstalowane za pomocą pip. Pakiety, które powinny zostać zainstalowane przy użyciu conda, są wymienione w pliku conda-requirements.txt. Niektóre z najbardziej użytecznych pakietów naukowych to numpy, scipy, scikit-learn, statsmodels, pandy i cvxopt. Pełną listę dostępnych pakietów conda można znaleźć pod adresem repo.continuum.io.

Na przykład:

$ cat requirements.txt 
gunicorn==0.14.2 
requests==0.11.1 

$ cat conda-requirements.txt 
scipy 
numpy 
cvxopt 

To jest to! Możesz teraz dodać pakiety Anaconda do aplikacji Python na Heroku.

+0

[Wyjaśnienie] (https://devcenter.heroku.com/articles/python-c-deps), dlaczego istnieje buildpack conda. Zauważ, że ten buildpack jest utrzymywany przez Kennetha Reitza, który jest ["odpowiedzialny za techniczny projekt oferty Pythona firmy Heroku."] (Https://www.linkedin.com/in/kennethreitz) – Jason

1

Zakładam to tutaj, na wypadek, gdyby ktoś potknął się o to tak jak ja. Ponieważ używam Pythona 3.4, thenovices buildpack nie działa dla mnie.

Próbowałem spojrzeć na build build, ale wydaje mi się to trochę przesadą dla mojej aplikacji, która wymaga tylko scipy i numpy. To, co w końcu działa dla mnie, to this excellent guide, używając podejścia multi buildpacks. Instalacja scipy była jednak naprawdę długa. Mam nadzieję że to pomoże! :)