Multithreaded SciPy/NumPy with OpenBLAS on debian
Some months ago, just after I got an 8-core CPU, I wasted a weekend trying to get SciPy/NumPy to build against OpenBLAS. OpenBLAS is neat, as it has built-in and automatic support for multi-threading, for things like computing the dot-matrix of large matrices this can really be a time saver.
I was using roughly these instructions, but it was too complicated and I got nowhere and gave up.
Then I got a new MacBook, and set it up using homebrew rather than macports, and I noticed that NumPy was built against OpenBLAS by default. Now, it would be a shame to let debian be any worse off…
Luckily, it was much easier than I thought:
1. Install the openblas and lapack libraries and dev-headers
sudo apt-get install libopenblas-dev liblapack-dev
2. Setup a virtualenv
To make sure we do not mess up the whole system, setup a virtualenv (if you ever install more than 3 python packages, and do not yet know about virtualenv, you really should get to know it, it’s a little piece of magic!):
virtualenv env source env/bin/activate
3. Install NumPy
In Debian, openblas/lapack fit into the alternatives system, and the implementation you chose gets symlinked to /usr/lib, however, this confuses numpy and you must point it to the right place, i.e. to /usr/lib/openblas-base
Download and unpack NumPy:
mkdir evn/download pip install -d env/download numpy mkdir env/build cd env/build tar xf ../download/numpy-1.7.1.tar.gz
Now create a site.cfg file with the following content:
[default] library_dirs= /usr/lib/openblas-base [atlas] atlas_libs = openblas
Build/install NumPy:
python setup.py install
You can now check the file env/lib/python2.7/site-packages/numpy/__config__.py to make sure it found the right libs, mine looks like this:
lapack_info={'libraries': ['lapack'], 'library_dirs': ['/usr/lib'], 'language': 'f77'} atlas_threads_info={'libraries': ['openblas'], 'library_dirs': ['/usr/local/lib'], 'language': 'c', 'define_macros': [('ATLAS_WITHOUT_LAPACK', None)], 'include_dirs': ['/usr/local/include']} blas_opt_info={'libraries': ['openblas'], 'library_dirs': ['/usr/local/lib'], 'language': 'c', 'define_macros': [('ATLAS_INFO', '"\\"None\\""')], 'include_dirs': ['/usr/local/include']}
4. Install SciPy
If NumPy installs cleanly, SciPy can simple be installed with pip:
pip install scipy
5. Test!
Using these scripts you can test your NumPy and SciPy installation. Be activating/deactivating the virtualenv, you can test with/without OpenBLAS. If you have several CPU cores, you can see that with OpenBLAS up to 4 CPUs should also be used.
Without OpenBLAS I get:
NumPy dot: 0.901498508453 sec SciPy cholesky: 0.11981959343 sec svd: 3.64697360992 sec
with OpenBLAS:
NumPy dot: 0.0569217920303 sec SciPy cholesky: 0.0204758167267 sec svd: 0.81153883934 sec