NumPy ve SciPy'de BLAS / LAPACK bağlantısı nasıl kontrol edilir?


126

Ben hissiz / scipy ortamımı, bu yürüyüşe dayanarak aşağı yukarı blas ve lapack'e dayalı olarak inşa ediyorum .

Bitirdiğimde, numpy / scipy işlevlerimin gerçekten önceden oluşturulmuş blas / lapack işlevlerini kullandığını nasıl kontrol edebilirim?

Yanıtlar:


293

Yöntem numpy.show_config()(veya numpy.__config__.show()), derleme sırasında toplanan bağlantı hakkında bilgi verir. Çıktım şuna benziyor. Sanırım bu, Mac OS ile birlikte gelen BLAS / LAPACK kullandığım anlamına geliyor.

>>> 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
Yaygın kullanışlılığı göz önüne alındığında, numpy.__config__gerçekten halka açık bir API olmalıdır. Yine de bu turu sen kazandın, Davost .
Cecil Curry

2
Yani lapack_opt_infogösterilen tek gerçek, uyuşukluğun lapack ile bağlantılı olduğu anlamına mı geliyor?
DanHickstein

42
Çıktıyı nasıl yorumluyorsunuz?
Edward Newell

18
@CecilCurry Kullanabilirsiniz, numpy.show_config()altçizgilerin başlangıç ​​olmaması nedeniyle muhtemelen genel bir API işlevi. Ancak çevrimiçi olarak belgelenmemiş ve belge dizgisi yok, bu yüzden bulmanın bu kadar zor olması şaşırtıcı değil. Umarım bunu düzeltirler.
Praveen

8
Birden çok paket görüntülendiğinde gerçekte hangi paketin kullanıldığını nasıl öğrenebilirim?
Jonasson

28

Aradığınız şey şudur: sistem bilgisi

Uyuşuk / scipy'yi atlas ile derledim ve bunu şu şekilde kontrol edebilirim:

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

Daha fazla komut için belgelere bakın.


35
Bu, numpy'nin şu anda ATLAS'ı kullanıp kullanmadığını, sadece bir sonraki numpy derlemesi sırasında ATLAS'ın bağlanıp bağlanmayacağını göstermiyor gibi görünüyor. ATLAS'tan önce uyuşmuş derlemiştim. Ben numpy'yi (kesin şey) yeniden derleyene kadar çok yavaş çalıştı, ancak hem önce hem de sonra sysinfo.get_info ('atlas') aynı çıktıyı gösterdi. Mevcut durum nasıl kontrol edilir?
dmytro

4
Çıktı nasıl yorumlanır?
Eric O Lebigot

2
"Atlas" yerine "blas" kurulu olabilir (bu, debian tabanlı dağıtımlara openblas yüklerseniz olur).
Malcolm

4
davost'un cevabı muhtemelen bu cevabın yerine kabul edilmiş olmalıydı ki bu da eldeki soruyu cevaplamada başarısız oldu. Bu yanıt, diğer ilgili soruları çözmede ilginç kullanım mekanizmalarını ortaya çıkardığı için , yine de içten teşekkürler!
Cecil Curry

2
@rabra sysinfo.get_info('atlas')benim için hiçbir şey geri döndü ama sysinfo.get_info('blas')döndü {'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']} ve sysinfo.get_info('lapack')dönen {'language': 'f77', 'libraries': ['lapack', 'lapack'], 'library_dirs': ['/usr/lib']} Ne anlama geliyor?
SebMa

11

Dinamik olarak yüklenen sürümleri kullandığından, bunu yapabilirsiniz:

$ ldd anyoftheCmodules.so

nerede anyoftheCmodules.soolabilir, örneğin numpy/core/_dotblas.so, hangi bağlantıya bağlanır libblas.so.


1
Ya dosya yoksa numpy/core/_dotblas.so? (talonmies cevap aşağıda yorumunu bakınız)
Woltan

1
İçeride birkaç .sodosya olmalı . NumPy dizini içinde arama yapın (diyelim, kullanarak find /path/to/numpy -name "*.so"). (O bir çift _dotblas.so, lapack_lite.soörneğin Ubuntu'nun önceden derlenmiş birinin altında,) BLAS / LAPACK make kullanımı
Ricardo Cárdenes

6
_dotblas.soartık numpy v1.10 ve daha yeni sürümlerde mevcut değil, ancak multiarray.sobunun yerine bağlantısını kontrol edebilirsiniz
ali_m

Çözüm, Linux özgü hem de belirtmek gerekir ve kırılgan. Bunun yerine gerçekten, gerçekten kanonik numpy.__config__nesneye çalışma zamanında erişmek istiyorsunuz . ( Davost'un mükemmel cevabına bakın .)
Cecil Curry

Aslında, Linux'a özgüdür ve @davost yönteminin daha iyi olduğuna katılıyorum. Cevabımın neden sürekli yükseltildiğini anlamıyorum.
Ricardo Cárdenes

8

Yapınızın C düzeyi kanca bileşenlerine bakmak için bağlantı yükleyici bağımlılık aracını kullanabilir ve bunların blas ve seçiminiz için harici bağımlılıkları olup olmadığını görebilirsiniz. Şu anda bir Linux kutusunun yakınında değilim, ancak bir OS X makinesinde bunu kurulumları tutan site paketleri dizini içinde yapabilirsiniz:

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

yerine lddyerine otoolbir gnu / Linux sisteminde ve ihtiyacınız olan yanıtları almalısınız.


1
Ya dosya yoksa numpy/core/_dotblas.so? (Ricardos cevabının altındaki yoruma bakın)
Woltan

@Woltan: Ya bir şey ciddi şekilde bozuldu ya da yanlış yere bakıyorsunuz. Şimdiye kadar gördüğüm her Linux ve OS X numpy kurulumunda _dotblas.so, dağıtımı oluşturmak için kullanılan blas'ın arayüz sarmalayıcısı olacak. Windows'ta çağrılacaktır _dotblas.pyd, ancak işlev aynıdır.
talonmies

3
Görünüşe göre _dotblas.so, yalnızca [atlas]içinde bir bölüm site.cfg(ve CBLAS etkin bir BLAS kitaplığı) kullanıyorsanız oluşturulmuş gibi görünüyor . Öyleyse, ATLAS kullanmasanız bile bunu kullanmalısınız (Intel MKL'yi kullanmanız dışında, özel bir bölümü vardır).
Kenneth Hoste

Gerçekte, NumPy inşa edildiğinde BLAS mevcut olmadığında, kendi iç-ürün rutinlerini oluşturur. Bunlar, ATLAS'tan iki kat daha yavaş olabilir.
Fred Foo

5
_dotblas.soartık numpy v1.10 ve daha yeni sürümlerde mevcut değil, ancak multiarray.sobunun yerine bağlantısını kontrol edebilirsiniz
ali_m

6

BLAS, LAPACK, MKL bağlantısını aşağıdakileri kullanarak görüntüleyebilirsiniz show_config():

import numpy as np
np.show_config()

Benim için çıktı veren:

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
Nasıl yorumluyorsunuz ('HAVE_CBLAS', None)]?
seralouk

@serafeim Bağlantıya bakınız . Esasen HAVE_CBLAStanımlandığı anlamına gelir, ancak değeri yoktur (düşünün C :) #define HAVE_CBLAS. Sadece bayrak olarak kullanıldığından bir değere ihtiyaç duymaz. Olarak yorumlardım HAVE_CBLAS=True. CBLAS'ınız olmasaydı, orada tuple hiç olmazdı.
MT

Doğrusal cebir hesaplamasının yeterince hızlı olması için uyuşturucumun blas ile bağlantılı olup olmadığını bilmek istiyorum. Bunu anlıyorum : imgur.com/a/SsrDqg5 . Bunu nasıl yorumluyorsun?
seralouk

@makis numpy openblas ile bağlantılı
MT

0

Anaconda-navigator'ı kurduysanız (linux, Windows veya macOS için www.anaconda.com/anaconda/install/ adresinde) - blas, scipy ve numpy yüklenecek ve bunları gezginin ana sayfasının sol tarafındaki ortamlar sekmesine tıklayarak görebilirsiniz. sayfası (her dizini alfa sırasına göre arayın). Tam anaconda'yı kurmak (miniconda veya bireysel paketlerin aksine), veri bilimi için gereken temel paketlerin çoğunun kurulmasını sağlayacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.