Bagaimana cara memeriksa tautan BLAS / LAPACK di NumPy dan SciPy?

126

Saya membangun lingkungan numpy / scipy saya berdasarkan blas dan lapack lebih atau kurang berdasarkan ini berjalan melalui.

Ketika saya selesai, bagaimana saya bisa mengecek, bahwa fungsi numpy / scipy saya benar-benar menggunakan fungsi blas / lapack yang dibangun sebelumnya?

Woltan
sumber

Jawaban:

293

Metode numpy.show_config()(atau numpy.__config__.show()) menampilkan informasi tentang tautan yang dikumpulkan pada waktu pembuatan. Output saya terlihat seperti ini. Saya pikir itu berarti saya menggunakan BLAS / LAPACK yang dikirimkan dengan 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
sumber
4
Mengingat kegunaannya yang tersebar luas, numpy.__config__harus benar-benar menjadi API publik. Meskipun demikian, Anda memenangkan ronde ini, davost .
Cecil Curry
2
Jadi, fakta belaka yang lapack_opt_infoditampilkan berarti numpy dikaitkan dengan Lapack?
DanHickstein
42
Bagaimana Anda menginterpretasikan output?
Edward Newell
18
@CecilCurry Anda dapat menggunakan numpy.show_config(), yang mungkin merupakan fungsi API publik berdasarkan tidak adanya mulai menggarisbawahi. Tapi itu tidak didokumentasikan secara online dan tidak memiliki dokumen, jadi tidak mengherankan bahwa itu sangat sulit ditemukan. Semoga mereka akan memperbaikinya.
Praveen
8
bagaimana cara mengetahui paket mana yang sebenarnya digunakan ketika banyak paket ditampilkan?
Jonasson
28

Yang Anda cari adalah ini: info sistem

Saya mengkompilasi numpy / scipy dengan atlas dan saya dapat memeriksanya dengan:

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

Periksa dokumentasi untuk lebih banyak perintah.

rabra
sumber
35
Ini sepertinya tidak menunjukkan apakah numpy saat ini menggunakan ATLAS, hanya apakah ATLAS akan ditautkan selama kompilasi numpy berikutnya. Saya punya numpy dikompilasi sebelum ATLAS. Ini bekerja sangat lambat sampai saya mengkompilasi numpy (hal yang pasti), tetapi sebelum dan sesudah nompy, sysinfo.get_info ('atlas') menunjukkan hasil yang sama. Bagaimana cara memeriksa keadaan terkini?
dmytro
4
Bagaimana cara menginterpretasikan output?
Eric O Lebigot
2
Anda mungkin sudah menginstal 'blas' alih-alih 'atlas' (ini terjadi jika Anda menginstal openblas pada distro berbasis debian).
Malcolm
4
Jawaban davost mungkin seharusnya diterima sebagai pengganti tanggapan ini, yang gagal menjawab pertanyaan yang ada. Karena tanggapan ini tidak mengungkap mesin yang menarik digunakan dalam menyelesaikan pertanyaan terkait lainnya , terima kasih yang tulus semuanya sama!
Cecil Curry
2
@rabra sysinfo.get_info('atlas')tidak mengembalikan apa pun untuk saya kecuali sysinfo.get_info('blas')kembali {'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']} dan sysinfo.get_info('lapack')kembali {'language': 'f77', 'libraries': ['lapack', 'lapack'], 'library_dirs': ['/usr/lib']} Apa artinya?
SebMa
11

Karena menggunakan versi yang dimuat secara dinamis, Anda bisa melakukan ini:

$ ldd anyoftheCmodules.so

di mana anyoftheCmodules.sobisa, misalnya numpy/core/_dotblas.so, yang terhubung ke libblas.so.

Ricardo Cárdenes
sumber
1
Bagaimana jika tidak ada file numpy/core/_dotblas.so? (lihat komentar di bawah, jawaban talonmies)
Woltan
1
Pasti ada sejumlah .sofile di sana. Cukup cari di dalam direktori NumPy (katakanlah, menggunakan find /path/to/numpy -name "*.so"). Beberapa dari mereka ( _dotblas.so, di lapack_lite.sobawah Ubuntu yang dikompilasi, misalnya) memanfaatkan BLAS / LAPACK
Ricardo Cárdenes
6
_dotblas.sotidak ada lagi di numpy v1.10 dan yang lebih baru , tetapi Anda dapat memeriksa multiarray.so
tautannya
Harus disebutkan bahwa solusi ini spesifik untuk Linux dan rapuh. Anda benar-benar hanya ingin mengakses numpy.__config__objek kanonik saat runtime. (Lihat davost Ini sangat baik jawaban .)
Cecil Curry
Memang, Linux-spesifik, dan saya setuju bahwa metode @davost lebih baik. Saya tidak mengerti mengapa jawaban saya terus terangkat.
Ricardo Cárdenes
8

Anda dapat menggunakan alat ketergantungan tautan pemuat untuk melihat komponen kait level C dari bangunan Anda dan melihat apakah mereka memiliki ketergantungan eksternal pada blas dan pilihan Anda. Saya tidak berada di dekat kotak linux sekarang, tetapi pada mesin OS X Anda dapat melakukan ini di dalam direktori paket situs yang menyimpan instalasi:

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

gantikan ldddi otoolsistem gnu / Linux dan Anda harus mendapatkan jawaban yang Anda butuhkan.

talonmies
sumber
1
Bagaimana jika tidak ada file numpy/core/_dotblas.so? (lihat komentar di bawah, jawaban Ricardos)
Woltan
@Woltan: ada sesuatu yang rusak parah, atau Anda mencari di tempat yang salah. Pada setiap Linux dan OS X numpy install yang pernah saya lihat, akan ada _dotblas.soyang merupakan pembungkus antarmuka untuk blas apa pun yang telah digunakan untuk membangun distribusi. Di windows akan dipanggil _dotblas.pyd, tetapi fungsinya sama.
talonmies
3
Sepertinya _dotblas.sohanya dibangun jika Anda menggunakan [atlas]bagian dalam site.cfg(dan perpustakaan BLAS yang diaktifkan CBLAS). Jadi, Anda harus menggunakannya, bahkan jika Anda tidak menggunakan ATLAS (kecuali ketika Anda menggunakan Intel MKL, yang memiliki bagian khusus).
Kenneth Hoste
Memang, ketika tidak ada BLAS tersedia ketika NumPy dibangun, itu membangun rutinitas dot-produk sendiri. Ini bisa dua urutan besarnya lebih lambat dari ATLAS.
Fred Foo
5
_dotblas.sotidak ada lagi di numpy v1.10 dan yang lebih baru , tetapi Anda dapat memeriksa multiarray.so
tautannya
6

Anda dapat menampilkan BLAS, LAPACK, tautan MKL menggunakan show_config():

import numpy as np
np.show_config()

Yang bagi saya memberikan output:

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']
MT
sumber
1
Bagaimana Anda menginterpretasikan ('HAVE_CBLAS', None)]?
seralouk
@serafeim Lihat tautan . Ini pada dasarnya berarti yang HAVE_CBLASsedang didefinisikan tetapi tidak memiliki nilai (pikirkan C:) #define HAVE_CBLAS. Tidak perlu nilai karena hanya digunakan sebagai bendera. Saya akan menafsirkannya sebagai HAVE_CBLAS=True. Jika Anda tidak memiliki CBLAS, Anda tidak akan memiliki tuple di sana.
MT
Saya hanya ingin tahu apakah numpy saya terhubung ke blas sehingga perhitungan aljabar linier cukup cepat. Saya mendapatkan ini: imgur.com/a/SsrDqg5 . Bagaimana Anda menafsirkan ini?
seralouk
@makis numpy terhubung dengan openblas
MT
0

Jika Anda menginstal anaconda-navigator (di www.anaconda.com/anaconda/install/ untuk linux, Windows atau macOS) - blas, scipy dan numpy semuanya akan diinstal dan Anda dapat melihatnya dengan mengklik tab lingkungan di sisi kiri rumah navigator halaman (cari setiap direktori dalam urutan alfa). Menginstal anaconda penuh (tidak seperti miniconda atau paket individual) akan menangani menginstal banyak paket penting yang diperlukan untuk ilmu data.

Dan T
sumber