Как проверить связь BLAS / LAPACK в NumPy и SciPy?

126

Я создаю свою numpy / scipy среду на основе blas и lapack, более или менее на основе этой прогулки.

Когда я закончу, как я могу проверить, действительно ли мои функции numpy / scipy используют ранее созданные функции blas / lapack?

Woltan
источник

Ответы:

293

Метод numpy.show_config()(или numpy.__config__.show()) выводит информацию о связях, собранную во время сборки. Мой результат выглядит так. Думаю, это означает, что я использую BLAS / LAPACK, который поставляется с Mac OS.

>>> import numpy as np
>>> np.show_config()

lapack_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3']
    define_macros = [('NO_ATLAS_INFO', 3)]
blas_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers']
    define_macros = [('NO_ATLAS_INFO', 3)]
davost
источник
4
Учитывая его широкую полезность, numpy.__config__действительно должен быть общедоступный API. Тем не менее, вы выиграли этот раунд, давост .
Сесил Карри
2
Итак, сам факт, что lapack_opt_infoпоказан, означает, что numpy связан с lapack?
DanHickstein
42
Как вы интерпретируете результат?
Эдвард Ньюэлл
18
@CecilCurry Вы можете использовать numpy.show_config(), который, вероятно, является общедоступной функцией API в силу отсутствия начальных подчеркиваний. Но он не документирован в Интернете и не имеет документации, поэтому неудивительно, что его так сложно найти. Надеюсь, они это исправят.
Praveen
8
как узнать, какой пакет на самом деле используется, когда отображается несколько пакетов?
Jonasson
28

Вы ищете это: системная информация

Я скомпилировал numpy / scipy с помощью атласа, и я могу проверить это с помощью:

import numpy.distutils.system_info as sysinfo
sysinfo.get_info('atlas')

Проверьте документацию для получения дополнительных команд.

rabra
источник
35
Похоже, это не показывает, использует ли numpy в настоящее время ATLAS, просто будет ли ATLAS связан во время следующей компиляции numpy. Я скомпилировал numpy до ATLAS. Он работал очень медленно, пока я не перекомпилировал numpy (конечно), но и до, и после перекомпиляции numpy sysinfo.get_info ('atlas') показывал тот же результат. Как проверить текущее состояние дел?
dmytro
4
Как интерпретировать вывод?
Эрик О Лебигот
2
У вас может быть установлен 'blas' вместо 'atlas' (это происходит, если вы устанавливаете openblas в дистрибутивах на основе debian).
Малькольм
4
Ответ Давоста, вероятно, должен был быть принят вместо этого ответа, который не отвечает на поставленный вопрос. Поскольку этот ответ действительно раскрывает интересный механизм, который можно использовать для решения других связанных вопросов, тем не менее сердечно благодарим!
Сесил Карри
2
@rabra sysinfo.get_info('atlas')ничего мне не sysinfo.get_info('blas')вернул, а вернул {'include_dirs': ['/usr/local/include', '/usr/include', '/opt/local/include', '/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/include'], 'libraries': ['blas', 'blas'], 'library_dirs': ['/usr/lib']} и sysinfo.get_info('lapack')вернул {'language': 'f77', 'libraries': ['lapack', 'lapack'], 'library_dirs': ['/usr/lib']} Что это значит?
SebMa
11

Поскольку он использует динамически загружаемые версии, вы можете просто сделать это:

$ ldd anyoftheCmodules.so

где anyoftheCmodules.soможет быть, например, numpy/core/_dotblas.soссылка на libblas.so.

Рикардо Карденес
источник
1
Что делать, если файла нет numpy/core/_dotblas.so? (см. комментарий под ответом талонми)
Woltan
1
Там должно быть только несколько .soфайлов. Просто выполните поиск в каталоге NumPy (скажем, используя find /path/to/numpy -name "*.so"). Некоторые из них (например _dotblas.so, lapack_lite.soв предварительно скомпилированном Ubuntu) используют BLAS / LAPACK
Рикардо Карденес
6
_dotblas.soбольше не существует в numpy v1.10 и новее , но multiarray.soвместо этого вы можете проверить связь
ali_m
Следует отметить, что это решение является специфичным для Linux и хрупким. numpy.__config__Вместо этого вы действительно хотите получить доступ к каноническому объекту во время выполнения. (См. Отличный ответ Давоста .)
Сесил Карри
Это действительно специфично для Linux, и я согласен, что метод @davost лучше. Я не понимаю, почему за мой ответ продолжают голосовать.
Рикардо Карденес
8

Вы можете использовать инструмент зависимости загрузчика ссылок, чтобы посмотреть на компоненты хуков C уровня вашей сборки и увидеть, есть ли у них внешние зависимости от выбранных вами blas и lapack. Я сейчас не рядом с Linux-боксом, но на машине с OS X вы можете сделать это внутри каталога site-packages, в котором находятся установки:

$ otool -L numpy/core/_dotblas.so 
numpy/core/_dotblas.so:
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
    /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 268.0.1)

$ otool -L scipy/linalg/flapack.so 
scipy/linalg/flapack.so (architecture i386):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
    /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 242.0.0)
scipy/linalg/flapack.so (architecture ppc):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)

$ otool -L scipy/linalg/fblas.so 
scipy/linalg/fblas.so (architecture i386):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
    /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 242.0.0)
scipy/linalg/fblas.so (architecture ppc):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)

замените вместо lddв otoolсистеме GNU / Linux, и вы получите нужные ответы.

talonmies
источник
1
Что делать, если файла нет numpy/core/_dotblas.so? (см. комментарий под ответом Рикардоса)
Woltan
@Woltan: либо что-то серьезно сломано, либо вы ищете не в том месте. На каждой установке Linux и OS X numpy, которую я когда-либо видел, будет _dotblas.soоболочка интерфейса для любого blas, использованного для создания дистрибутива. В окнах он будет вызываться _dotblas.pyd, но функция останется прежней.
talonmies
3
Кажется, что _dotblas.soон построен только в том случае, если вы используете [atlas]раздел site.cfg(и библиотеку BLAS с поддержкой CBLAS). Таким образом, вы должны использовать это, даже если вы не используете ATLAS (за исключением случаев, когда вы используете Intel MKL, в котором есть специальный раздел).
Кеннет Хост
Действительно, когда при построении NumPy нет BLAS, он создает свои собственные процедуры скалярного произведения. Они могут быть на два порядка медленнее, чем ATLAS.
Fred Foo
5
_dotblas.soбольше не существует в numpy v1.10 и новее , но multiarray.soвместо этого вы можете проверить связь
ali_m
6

Вы можете отобразить связь BLAS, LAPACK, MKL, используя show_config():

import numpy as np
np.show_config()

Что для меня дает результат:

mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
blas_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
blas_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
lapack_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
lapack_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
Монтана
источник
1
Как вы интерпретируете ('HAVE_CBLAS', None)]?
seralouk
@serafeim См. ссылку . По сути, это означает, что HAVE_CBLASон определяется, но не имеет значения (подумайте о C :) #define HAVE_CBLAS. Ему не нужно значение, так как оно используется только как флаг. Я бы интерпретировал это как HAVE_CBLAS=True. Если бы у вас не было CBLAS, у вас вообще не было бы кортежа.
MT
Я просто хочу знать, связан ли мой numpy с blas, чтобы вычисления линейной алгебры были достаточно быстрыми. Я получаю это: imgur.com/a/SsrDqg5 . Как вы это интерпретируете?
seralouk
@makis numpy связан с openblas
MT
0

Если вы установили anaconda-navigator (на www.anaconda.com/anaconda/install/ для linux, Windows или macOS) - будут установлены blas, scipy и numpy, и вы сможете увидеть их, щелкнув вкладку среды в левой части главного экрана навигатора. страницу (ищите каждый каталог в альфа-порядке). Установка полной анаконды (в отличие от miniconda или отдельных пакетов) позаботится об установке многих основных пакетов, необходимых для науки о данных.

Дэн Т
источник