Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

  • Скомпилировать 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 для принудительного обновления в рамках одного сеанса).

    • Другим вариантом, который будет работать для нескольких пользователей, является создание файла .conf в /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 в site.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
    

    Результат должен выглядеть примерно так:

    ...
    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 предпочтительнее для использования python setup.py install, так как pip будет отслеживать метаданные пакета и позволяет вам легко удалить или обновить numpy в будущем.

    $ pip install .
    
  • Дополнительно: вы можете использовать этот script для проверки производительности для разных подсчетов потоков.

    $ 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
    

Похоже, что наблюдается заметное улучшение производительности при увеличении количества потоков. Тем не менее, я не тестировал это очень систематически, и, скорее всего, для меньших матриц дополнительные накладные расходы перевешивают преимущество производительности за счет более высокого количества потоков.

Ответ 2

На всякий случай, если вы используете ubuntu или монетный двор, вы можете легко связать numbl с openblas, установив numpy и openblas через apt-get as

sudo apt-get install numpy libopenblas-dev

На новой докере 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

Ответ 3

Здесь более простой подход, чем @ali_m, и он работает на macOS.

  1. Установите компилятор gfortran, если у вас его нет. Например, используя homebrew на macOS:

    $ brew install gcc
    
  2. Компилировать OpenBLAS из источника [установка релиза также должна работать, если вам не нужны невыпущенные исправления ошибок]:

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

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

    OpenBLAS не обязательно должен быть включен в путь компилятора или путь библиотеки компоновщика.

  3. Загрузите https://github.com/numpy/numpy/blob/master/site.cfg.example в ~/.numpy-site.cfg, раскомментируйте эти строки и отредактируйте их, чтобы указать путь PREFIX, который вы использовали на шаге 2:

    [openblas]
    libraries = openblas
    library_dirs = /opt/OpenBLAS/lib
    include_dirs = /opt/OpenBLAS/include
    
  4. pip-install numpy и scipy из источника (желательно в virtualenv) без ручной загрузки их [вы также можете указать версии выпуска]:

    pip install numpy scipy --no-binary numpy,scipy
    

См. Другие ответы для способов тестирования.