Як перевірити зв'язок BLAS / LAPACK в NumPy та SciPy?


126

Я будую своє середовище нуме / вуха на балаш і лапак більш-менш на основі цієї прогулянки.

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

Відповіді:


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)]

4
Враховуючи широку корисність, numpy.__config__він справді повинен бути публічним API. Тим не менш, ви виграєте цей раунд, Давосто .
Сесіль Карі

2
Отже, сам факт, що lapack_opt_infoпоказаний, означає, що нумею пов’язано з лапаком?
DanHickstein

42
Як ви інтерпретуєте вихід?
Едвард Ньюелл

18
@CecilCurry Ви можете використовувати numpy.show_config(), що, ймовірно, є функцією загальнодоступного API через відсутність початкових підкреслень. Але це не задокументовано в Інтернеті і не має докстрингу, тому не дивно, що його так важко знайти. Сподіваємось, вони це виправлять.
Правен

8
як я дізнаюся, який пакет використовується фактично, коли відображається кілька пакетів?
Йонассон

28

Що ви шукаєте: це системна інформація

Я склав numpy / scipy з атласу, і я можу перевірити це за допомогою:

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

Перевірте документацію на наявність додаткових команд.


35
Це, здається, не показує, чи numpy використовує ATLAS в даний час, а чи буде ATLAS пов'язаний проти наступної компіляції numpy. У мене перед ATLAS був складений нуме. Він працював дуже повільно, поки я не перекомпілював numpy (впевнений), але і перед, і після numpi рекомпіляції 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? (див. коментар нижче відповіді талонії)
Волтан

1
Там має бути лише декілька .soфайлів. Просто шукайте всередині каталогу NumPy (скажімо, використовуючи find /path/to/numpy -name "*.so"). Кілька з них (наприклад _dotblas.so, lapack_lite.soза попередньою
компіляцією

6
_dotblas.soбільше немає в numpy v1.10 та новіших версіях , але ви можете перевірити зв’язок multiarray.soзамість цього
ali_m

Слід зазначити, що це рішення є і специфічним для Linux, і крихким. Ви дійсно, дуже просто хочете отримати доступ до канонічного numpy.__config__об'єкта під час виконання. (Дивіться відмінну відповідь Давоста .)
Сесіль Керрі

Це дійсно специфічно для Linux, і я погоджуюся, що метод @davost є кращим. Я не розумію, чому мою відповідь продовжують отримувати голоси.
Рікардо Карден

8

Ви можете скористатись інструментом залежності завантажувача посилань, щоб подивитися на компоненти гака на рівні С на вашій збірці та побачити, чи мають вони зовнішні залежності від ваших благ та лапак вибору. Наразі я не поруч з вікном linux, але на машині OS X ви можете це зробити всередині каталогу сайтів-пакунків, який містить установки:

$ 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замість системи otoolgnu / Linux, і ви повинні отримати відповіді, які вам потрібні.


1
Що робити, якщо файлу немає numpy/core/_dotblas.so? (див. коментар нижче відповіді Рікардоса)
Волтан

@Woltan: або щось серйозно зламане, або ти дивишся в неправильному місці. У будь-якій установці Linux та OS X, яку я коли-небудь бачив, з'явиться _dotblas.soоболонка інтерфейсу для тих, що використовувались для побудови дистрибутива. У Windows це буде називатися _dotblas.pyd, але функція однакова.
талонії

3
Схоже, _dotblas.soвін побудований лише у тому випадку, якщо ви використовуєте [atlas]розділ у site.cfg(та бібліотеці BLAS з підтримкою CBLAS). Отже, ви повинні використовувати це, навіть якщо ви не використовуєте ATLAS (за винятком випадків, коли ви використовуєте Intel MKL, у якому є виділений розділ).
Кеннет Хосте

Дійсно, коли під час створення NumPy немає BLAS, він створює власні підпрограми з крапковим продуктом. Це може бути на два порядки повільніше, ніж ATLAS.
Фред Фоо

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

Хочу просто знати, чи пов’язаний мій нумп з блаш, щоб лінійні обчислення алгебри були досить швидкими. Я отримую це: imgur.com/a/SsrDqg5 . Як ви трактуєте це?
seralouk

@makis numpy пов'язаний з openblas
MT

0

Якщо ви встановили анаконда-навігатор (за адресою www.anaconda.com/anaconda/install/ для Linux, Windows чи macOS) - бланки, scipy та numpy будуть встановлені, і ви можете їх побачити, натиснувши вкладку середовища ліворуч від домашньої сторінки навігатора. сторінка (шукайте кожен каталог у альфа-порядку). Встановлення повної анаконди (на відміну від мініконди або окремих пакетів) допоможе встановити багато важливих пакетів, необхідних для наукових даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.