Как я могу заставить NumPy использовать OpenBlas в Ubuntu?

У меня установлены как BLAS, так и OpenBLAS:

$ dpkg -l \*blas\* | grep ^i
ii  libblas-dev                                           1.2.20110419-7                                      amd64        Basic Linear Algebra Subroutines 3, static library
ii  libblas3                                              1.2.20110419-7                                      amd64        Basic Linear Algebra Reference implementations, shared library
ii  libopenblas-base                                      0.2.8-6ubuntu1                                      amd64        Optimized BLAS (linear algebra) library based on GotoBLAS2
ii  libopenblas-dev                                       0.2.8-6ubuntu1                                      amd64        Optimized BLAS (linear algebra) library based on GotoBLAS2

Тем не менее, NumPy по-прежнему говорит, что OpenBLAS недоступен:

>> np.__config__.show()
blas_info:
    libraries = ['blas']
    library_dirs = ['/usr/lib']
    language = f77
lapack_info:
    libraries = ['lapack']
    library_dirs = ['/usr/lib']
    language = f77
atlas_threads_info:
  NOT AVAILABLE
blas_opt_info:
    libraries = ['blas']
    library_dirs = ['/usr/lib']
    language = f77
    define_macros = [('NO_ATLAS_INFO', 1)]
atlas_blas_threads_info:
  NOT AVAILABLE
openblas_info:
  NOT AVAILABLE
lapack_opt_info:
    libraries = ['lapack', 'blas']
    library_dirs = ['/usr/lib']
    language = f77
    define_macros = [('NO_ATLAS_INFO', 1)]
atlas_info:
  NOT AVAILABLE
lapack_mkl_info:
  NOT AVAILABLE
blas_mkl_info:
  NOT AVAILABLE
atlas_blas_info:
  NOT AVAILABLE
mkl_info:
  NOT AVAILABLE

Как я могу это исправить?

Я не думаю, что я могу просто удалить libblas3, потому что многое зависит от этого, в том числе libblas-devна котором даже libopenblas-dev зависит.

Я старался

$ sudo apt-get install --reinstall python-numpy

но это не помогло

Это особенно удивительно, потому что все *.so файлы в numpy ссылка на OpenBLAS:

$ ldd `find /usr/lib/python2.7/dist-packages/numpy -name \*\.so` | grep libblas
        libblas.so.3 => /usr/lib/libblas.so.3 (0x00007fba2ac96000)
        libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f04f7f54000)
        libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f9a941a9000)

$ ls -l /usr/lib/libblas.so.3 /etc/alternatives/libblas.so.3
lrwxrwxrwx 1 root root 35 Oct 22  2014 /etc/alternatives/libblas.so.3 -> /usr/lib/openblas-base/libblas.so.3
lrwxrwxrwx 1 root root 30 Oct  6  2014 /usr/lib/libblas.so.3 -> /etc/alternatives/libblas.so.3

2 ответа

Решение

На основе ldd вывод, NumPy уже должен быть связан с OpenBLAS. Он просто не знает этого, потому что он связан через /usr/lib/libblas*, который он видит как общий BLAS.

На Ubuntu 16.10 вы можете просто

$ apt install libopenblas-base

и активируйте предпочитаемую реализацию BLAS, используя

$ update-alternatives --config libblas.so.3

Я сделал это и побежал

import numpy as np
a1 = np.random.rand(10000, 10000)
a2 = np.random.rand(10000, 10000)
np.dot(a1, a2)

с libblas (2m38s, загрузка только одного ядра) и libopenblas (0m18s, загрузка нескольких ядер)

РЕДАКТИРОВАТЬ: Это было с Python и NumPy установлены через официальные репозитории Ubuntu, а не с PIP.

Другие вопросы по тегам