Компиляция numpy с интеграцией OpenBLAS

Я пытаюсь установить numpy с OpenBLAS, однако я в недоумении относительно того, как site.cfg файл должен быть записан.

когда установки была выполнена установка без ошибок, однако наблюдается снижение производительности при увеличении количества потоков, используемых OpenBLAS от 1 (контролируется переменной среды OMP_NUM_THREADS).

Я не уверен, что интеграция OpenBLAS была идеальной. Может ли один обеспечить для достижения того же.

С. П.: интеграция OpenBLAS в других инструментах, как Феано, который основан на Python, обеспечивает существенное повышение производительности при увеличении количества потоков на одной машине.

2 ответов


я только что собрал numpy внутри virtualenv С OpenBLAS интеграция, и, похоже, работает нормально.

это был мой процесс:

  1. Compile OpenBLAS:

    $ git clone https://github.com/xianyi/OpenBLAS
    $ cd OpenBLAS && make FC=gfortran
    $ sudo make PREFIX=/opt/OpenBLAS install
    

    если у вас нет прав администратора, вы можете установить PREFIX= в папку, где у вас есть права на запись (просто измените соответствующие шаги ниже соответственно).

  2. убедитесь, что каталог, содержащий 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
    
  3. возьмите numpy исходный код:

    $ git clone https://github.com/numpy/numpy
    $ cd numpy
    
  4. скопировать site.cfg.example to site.cfg и редактировать, копировать:

    $ cp site.cfg.example site.cfg
    $ nano site.cfg
    

    раскомментируйте эти строки:

    ....
    [openblas]
    libraries = openblas
    library_dirs = /opt/OpenBLAS/lib
    include_dirs = /opt/OpenBLAS/include
    ....
    
  5. Проверьте конфигурацию, сборку ,установку (необязательно внутри 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 .
    
  6. дополнительно: вы можете использовать этот скрипт для проверки производительности для различных подсчетов потоков.

    $ 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