Компиляция numpy с интеграцией OpenBLAS
Я пытаюсь установить numpy
с OpenBLAS
, однако я в недоумении относительно того, как site.cfg
файл должен быть записан.
когда установки была выполнена установка без ошибок, однако наблюдается снижение производительности при увеличении количества потоков, используемых OpenBLAS от 1 (контролируется переменной среды OMP_NUM_THREADS).
Я не уверен, что интеграция OpenBLAS была идеальной. Может ли один обеспечить для достижения того же.
С. П.: интеграция OpenBLAS в других инструментах, как Феано, который основан на Python, обеспечивает существенное повышение производительности при увеличении количества потоков на одной машине.
2 ответов
я только что собрал numpy
внутри virtualenv
С OpenBLAS
интеграция, и, похоже, работает нормально.
это был мой процесс:
-
Compile
OpenBLAS
:$ git clone https://github.com/xianyi/OpenBLAS $ cd OpenBLAS && make FC=gfortran $ sudo make PREFIX=/opt/OpenBLAS install
если у вас нет прав администратора, вы можете установить
PREFIX=
в папку, где у вас есть права на запись (просто измените соответствующие шаги ниже соответственно). -
убедитесь, что каталог, содержащий
libopenblas.so
в путь поиска в общей библиотеке.-
чтобы сделать это локально, вы можете отредактировать свой
~/.bashrc
файл, содержащий строкуexport LD_LIBRARY_PATH=/opt/OpenBLAS/lib:$LD_LIBRARY_PATH
на
LD_LIBRARY_PATH
переменная окружения будет обновляться при запуске нового терминального сеанса (используйте$ source ~/.bashrc
для принудительного обновления в том же сеансе). -
другой вариант, который будет работать для нескольких пользователей-создать на
/etc/ld.so.conf.d/
содержит строку/opt/OpenBLAS/lib
, например:$ sudo sh -c "echo '/opt/OpenBLAS/lib' > /etc/ld.so.conf.d/openblas.conf"
как только вы закончите с любым вариантом, запустите
$ sudo ldconfig
-
-
возьмите
numpy
исходный код:$ git clone https://github.com/numpy/numpy $ cd numpy
-
скопировать
site.cfg.example
tosite.cfg
и редактировать, копировать:$ cp site.cfg.example site.cfg $ nano site.cfg
раскомментируйте эти строки:
.... [openblas] libraries = openblas library_dirs = /opt/OpenBLAS/lib include_dirs = /opt/OpenBLAS/include ....
-
Проверьте конфигурацию, сборку ,установку (необязательно внутри
virtualenv
)$ python setup.py config
выход должен выглядеть что-то вроде этого:--31-->
... openblas_info: FOUND: libraries = ['openblas', 'openblas'] library_dirs = ['/opt/OpenBLAS/lib'] language = c define_macros = [('HAVE_CBLAS', None)] FOUND: libraries = ['openblas', 'openblas'] library_dirs = ['/opt/OpenBLAS/lib'] language = c define_macros = [('HAVE_CBLAS', None)] ...
установить с
pip
is желательно с использованиемpython setup.py install
Сpip
будет отслеживать метаданные пакета и позволит вам легко удалить или обновить numpy в будущем.$ pip install .
-
дополнительно: вы можете использовать этот скрипт для проверки производительности для различных подсчетов потоков.
$ OMP_NUM_THREADS=1 python build/test_numpy.py version: 1.10.0.dev0+8e026a2 maxint: 9223372036854775807 BLAS info: * libraries ['openblas', 'openblas'] * library_dirs ['/opt/OpenBLAS/lib'] * define_macros [('HAVE_CBLAS', None)] * language c dot: 0.099796795845 sec $ OMP_NUM_THREADS=8 python build/test_numpy.py version: 1.10.0.dev0+8e026a2 maxint: 9223372036854775807 BLAS info: * libraries ['openblas', 'openblas'] * library_dirs ['/opt/OpenBLAS/lib'] * define_macros [('HAVE_CBLAS', None)] * language c dot: 0.0439578056335 sec
кажется, что заметное улучшение в производительность для более высоких потоков. Однако я не тестировал это очень систематически, и вполне вероятно, что для меньших матриц дополнительные накладные расходы перевесят преимущество производительности от более высокого количества потоков.
на всякий случай, если вы используете ubuntu или mint, вы можете легко связать openblas numpy, установив numpy и openblas через apt-get as
sudo apt-get install numpy libopenblas-dev
на новом docker ubuntu я протестировал следующий скрипт, скопированный из сообщения в блоге "установка Numpy и OpenBLAS"
import numpy as np
import numpy.random as npr
import time
# --- Test 1
N = 1
n = 1000
A = npr.randn(n,n)
B = npr.randn(n,n)
t = time.time()
for i in range(N):
C = np.dot(A, B)
td = time.time() - t
print("dotted two (%d,%d) matrices in %0.1f ms" % (n, n, 1e3*td/N))
# --- Test 2
N = 100
n = 4000
A = npr.randn(n)
B = npr.randn(n)
t = time.time()
for i in range(N):
C = np.dot(A, B)
td = time.time() - t
print("dotted two (%d) vectors in %0.2f us" % (n, 1e6*td/N))
# --- Test 3
m,n = (2000,1000)
A = npr.randn(m,n)
t = time.time()
[U,s,V] = np.linalg.svd(A, full_matrices=False)
td = time.time() - t
print("SVD of (%d,%d) matrix in %0.3f s" % (m, n, td))
# --- Test 4
n = 1500
A = npr.randn(n,n)
t = time.time()
w, v = np.linalg.eig(A)
td = time.time() - t
print("Eigendecomp of (%d,%d) matrix in %0.3f s" % (n, n, td))
без openblas результат:
dotted two (1000,1000) matrices in 563.8 ms
dotted two (4000) vectors in 5.16 us
SVD of (2000,1000) matrix in 6.084 s
Eigendecomp of (1500,1500) matrix in 14.605 s
после того, как я установил openblas с apt install openblas-dev
, Я проверил numpy связь с
import numpy as np
np.__config__.show()
информация
atlas_threads_info:
NOT AVAILABLE
openblas_info:
NOT AVAILABLE
atlas_blas_info:
NOT AVAILABLE
atlas_3_10_threads_info:
NOT AVAILABLE
blas_info:
library_dirs = ['/usr/lib']
libraries = ['blas', 'blas']
language = c
define_macros = [('HAVE_CBLAS', None)]
mkl_info:
NOT AVAILABLE
atlas_3_10_blas_threads_info:
NOT AVAILABLE
atlas_3_10_blas_info:
NOT AVAILABLE
openblas_lapack_info:
NOT AVAILABLE
lapack_opt_info:
library_dirs = ['/usr/lib']
libraries = ['lapack', 'lapack', 'blas', 'blas']
language = c
define_macros = [('NO_ATLAS_INFO', 1), ('HAVE_CBLAS', None)]
blas_opt_info:
library_dirs = ['/usr/lib']
libraries = ['blas', 'blas']
language = c
define_macros = [('NO_ATLAS_INFO', 1), ('HAVE_CBLAS', None)]
atlas_info:
NOT AVAILABLE
blas_mkl_info:
NOT AVAILABLE
lapack_mkl_info:
NOT AVAILABLE
atlas_3_10_info:
NOT AVAILABLE
lapack_info:
library_dirs = ['/usr/lib']
libraries = ['lapack', 'lapack']
language = f77
atlas_blas_threads_info:
NOT AVAILABLE
он не показывает связь с openblas. Однако новый результат скрипта показывает, что numpy должен был использовать openblas:
dotted two (1000,1000) matrices in 15.2 ms
dotted two (4000) vectors in 2.64 us
SVD of (2000,1000) matrix in 0.469 s
Eigendecomp of (1500,1500) matrix in 2.794 s