จะตรวจสอบการเชื่อมโยง BLAS / LAPACK ใน NumPy และ SciPy ได้อย่างไร?


126

ฉันกำลังสร้างสภาพแวดล้อมที่น่าเบื่อ / scipy ของฉันโดยอาศัย blas และ lapack มากหรือน้อยตามสิ่งนี้ใช้เวลาเดินผ่าน

เมื่อฉันทำเสร็จแล้วฉันจะตรวจสอบได้อย่างไรว่าฟังก์ชัน 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 สาธารณะ อย่างไรก็ตามคุณชนะรอบนี้davost
Cecil Curry

2
ดังนั้นความจริงที่lapack_opt_infoปรากฏขึ้นหมายความว่า numpy เชื่อมโยงกับ lapack?
DanHickstein

42
คุณตีความผลลัพธ์อย่างไร?
Edward Newell

18
@CecilCurry คุณสามารถใช้ได้numpy.show_config()ซึ่งน่าจะเป็นฟังก์ชัน API สาธารณะโดยอาศัยการไม่มีขีดล่างเริ่มต้น แต่ไม่ได้จัดทำเป็นเอกสารทางออนไลน์และไม่มี docstring จึงไม่แปลกใจเลยที่หายากมาก หวังว่าพวกเขาจะแก้ไขได้
Praveen

8
ฉันจะทราบได้อย่างไรว่าแพ็กเกจใดถูกใช้จริงเมื่อแสดงแพ็กเกจหลายแพ็กเกจ
Jonasson

28

สิ่งที่คุณกำลังค้นหามีดังนี้: ข้อมูลระบบ

ฉันรวบรวม numpy / scipy ด้วย atlas และฉันสามารถตรวจสอบสิ่งนี้ด้วย:

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

ตรวจสอบเอกสารสำหรับคำสั่งเพิ่มเติม


35
ดูเหมือนจะไม่ได้แสดงว่าปัจจุบัน numpy ใช้ ATLAS หรือไม่เพียงว่า ATLAS จะเชื่อมโยงกับระหว่างการคอมไพล์ numpy ครั้งต่อไปหรือไม่ ฉันรวบรวม numpy ก่อน ATLAS มันทำงานช้ามากจนกว่าฉันจะคอมไพล์ numpy ใหม่ (สิ่งที่แน่นอน) แต่ทั้งก่อนและหลังการคอมไพล์ numpy recompilation sysinfo.get_info ('atlas') แสดงผลลัพธ์เดียวกัน จะตรวจสอบสถานะปัจจุบันได้อย่างไร?
dmytro

4
วิธีตีความผลลัพธ์?
Eric O Lebigot

2
คุณอาจติดตั้ง 'blas' แทน 'atlas' (สิ่งนี้จะเกิดขึ้นหากคุณติดตั้ง openblas บนเดเบียนที่ใช้ distros)
Malcolm

4
คำตอบของdavostน่าจะได้รับการยอมรับแทนคำตอบนี้ซึ่งไม่สามารถตอบคำถามที่อยู่ในมือได้ เนื่องจากคำตอบนี้เผยให้เห็นกลไกที่น่าสนใจในการใช้งานในการแก้คำถามอื่น ๆที่เกี่ยวข้องขอขอบคุณทุกคน!
Cecil Curry

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.solibblas.so


1
จะเป็นอย่างไรถ้าไม่มีไฟล์numpy/core/_dotblas.so? (ดูความคิดเห็นด้านล่างคำตอบของ Talonmies)
Woltan

1
ต้องมี.soไฟล์อยู่ในนั้น เพียงค้นหาในไดเรกทอรี NumPy (พูดโดยใช้find /path/to/numpy -name "*.so") คู่ของเหล่านั้น ( _dotblas.so, lapack_lite.soภายใต้ของ Ubuntu precompiled หนึ่งตัวอย่างเช่น) ทำให้การใช้หน่าย / LAPACK
ริคาร์โด้Cárdenes

6
_dotblas.soไม่มีอยู่ใน numpy v1.10 และใหม่กว่าอีกต่อไปแต่คุณสามารถตรวจสอบการเชื่อมโยงของmultiarray.soแทนได้
ali_m

ควรกล่าวถึงว่าโซลูชันนี้มีทั้งแบบเฉพาะสำหรับ Linux และเปราะบาง คุณแค่ต้องการเข้าถึงnumpy.__config__วัตถุที่ยอมรับในรันไทม์แทน (ดูคำตอบที่ยอดเยี่ยมของdavost )
Cecil Curry

มันเป็นเฉพาะ Linux และฉันยอมรับว่าวิธีการ @davost ดีกว่า ฉันไม่เข้าใจว่าทำไมคำตอบของฉันถึงได้รับการโหวต
Ricardo Cárdenes

8

คุณสามารถใช้เครื่องมือการพึ่งพาตัวโหลดลิงค์เพื่อดูส่วนประกอบเบ็ดระดับ C ของบิลด์ของคุณและดูว่ามีการอ้างอิงภายนอกกับ blas และ lapack ที่คุณเลือกหรือไม่ ตอนนี้ฉันไม่ได้อยู่ใกล้กล่อง 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ในotoolระบบ gnu / Linux และคุณควรได้รับคำตอบที่ต้องการ


1
จะเป็นอย่างไรถ้าไม่มีไฟล์numpy/core/_dotblas.so? (ดูความคิดเห็นด้านล่างคำตอบของ Ricardos)
Woltan

@ Woltan: มีบางอย่างเสียอย่างร้ายแรงหรือคุณกำลังมองหาผิดที่ ในทุกการติดตั้ง Linux และ OS X numpy ที่ฉันเคยเห็นจะมีสิ่ง_dotblas.soที่เป็นตัวห่ออินเทอร์เฟซสำหรับบลาสที่ใช้ในการสร้างการกระจาย บน windows จะเรียกใช้_dotblas.pydแต่ฟังก์ชันเหมือนกัน
กรงเล็บ

3
ดูเหมือนว่า_dotblas.soจะสร้างขึ้นเฉพาะเมื่อคุณใช้[atlas]ส่วนในsite.cfg(และไลบรารี BLAS ที่เปิดใช้งาน CBLAS) ดังนั้นคุณควรใช้สิ่งนั้นแม้ว่าคุณจะไม่ได้ใช้ ATLAS ก็ตาม (ยกเว้นเมื่อคุณใช้ Intel MKL ซึ่งมีส่วนเฉพาะ)
Kenneth Hoste

อันที่จริงเมื่อไม่มี BLAS ให้ใช้งานเมื่อสร้าง NumPy ก็จะสร้างรูทีนผลิตภัณฑ์ดอทของตัวเอง คำสั่งเหล่านี้สามารถมีขนาดสองคำสั่งช้ากว่า 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 ทั้งหมดจะถูกติดตั้งและคุณสามารถดูได้โดยคลิกที่แท็บสภาพแวดล้อมทางด้านซ้ายของหน้าแรกของเนวิเกเตอร์ หน้า (ค้นหาแต่ละไดเรกทอรีตามลำดับอัลฟา) การติดตั้งอนาคอนดาเต็มรูปแบบ (ซึ่งต่างจากมินิคอนดาหรือแพ็กเกจส่วนบุคคล) จะดูแลการติดตั้งแพ็กเกจที่จำเป็นจำนวนมากที่จำเป็นสำหรับวิทยาศาสตร์ข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.