Làm cách nào để kiểm tra liên kết BLAS / LAPACK trong NumPy và SciPy?


126

Tôi đang xây dựng môi trường numpy / scipy của mình dựa trên blas và lapack ít nhiều dựa trên bước đi này .

Khi tôi hoàn thành, làm thế nào tôi có thể kiểm tra xem các hàm numpy / scipy của tôi có thực sự sử dụng các chức năng blas / lapack được xây dựng trước đó không?

Câu trả lời:


293

Phương thức numpy.show_config()(hoặc numpy.__config__.show()) xuất thông tin về liên kết được thu thập tại thời điểm xây dựng. Đầu ra của tôi trông như thế này. Tôi nghĩ rằng nó có nghĩa là tôi đang sử dụng BLAS / LAPACK đi kèm với 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
Do tính hữu dụng rộng rãi của nó, numpy.__config__nên thực sự là một API công khai. Tuy nhiên, bạn giành chiến thắng trong vòng này, davost .
Cecil Curry

2
Vì vậy, thực tế chỉ lapack_opt_infođược hiển thị có nghĩa là numpy được liên kết với lapack?
DanHickstein

42
Làm thế nào để bạn giải thích đầu ra?
Edward Newell

18
@CecilCurry Bạn có thể sử dụng numpy.show_config(), đây có thể là một hàm API công khai nhờ vào việc không bắt đầu dấu gạch dưới. Nhưng nó không được ghi lại trực tuyến và không có chuỗi, vì vậy không có gì ngạc nhiên khi nó rất khó tìm. Hy vọng họ sẽ khắc phục điều đó.
Praveen

8
Làm thế nào để tôi tìm ra gói nào thực sự được sử dụng khi nhiều gói được hiển thị?
Jonasson

28

Những gì bạn đang tìm kiếm là đây: thông tin hệ thống

Tôi đã biên dịch numpy / scipy với atlas và tôi có thể kiểm tra điều này với:

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

Kiểm tra tài liệu để biết thêm các lệnh.


35
Điều này dường như không cho thấy liệu numpy hiện có sử dụng ATLAS hay không, chỉ là liệu ATLAS sẽ được liên kết với trong quá trình biên dịch numpy tiếp theo hay không. Tôi đã biên soạn numpy trước ATLAS. Nó hoạt động rất chậm cho đến khi tôi biên dịch lại numpy (điều chắc chắn), nhưng cả trước và sau khi biên dịch lại sumpinfo.get_info ('atlas') đều hiển thị cùng một đầu ra. Làm thế nào để kiểm tra tình trạng hiện tại?
dmytro

4
Làm thế nào để giải thích đầu ra?
Eric O Lebigot

2
Bạn có thể đã cài đặt 'blas' thay vì 'atlas' (điều này xảy ra nếu bạn cài đặt openblas trên các distro dựa trên debian).
Malcolm

4
Câu trả lời của davost có lẽ đã được chấp nhận thay cho câu trả lời này, nhưng không giải quyết được câu hỏi trong tầm tay. Vì câu trả lời này không phát hiện ra máy móc thú vị trong việc sử dụng để giải quyết các câu hỏi liên quan khác , một lời cảm ơn nồng nhiệt như nhau!
Cecil Curry

2
@rabra sysinfo.get_info('atlas')không trả lại gì cho tôi nhưng sysinfo.get_info('blas')trả lại {'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')trả lại {'language': 'f77', 'libraries': ['lapack', 'lapack'], 'library_dirs': ['/usr/lib']} Có nghĩa là gì?
SebMa

11

Vì nó sử dụng các phiên bản được tải động, bạn có thể thực hiện việc này:

$ ldd anyoftheCmodules.so

nơi anyoftheCmodules.socó thể, ví dụ, numpy/core/_dotblas.soliên kết đến libblas.so.


1
Nếu không có tập tin numpy/core/_dotblas.sothì sao? (xem bình luận bên dưới câu trả lời của Talonmies)
Woltan

1
Phải có một số .sotập tin trong đó. Chỉ cần tìm kiếm trong thư mục NumPy (giả sử sử dụng find /path/to/numpy -name "*.so"). Một cặp vợ chồng của những người ( _dotblas.so, lapack_lite.sodưới một biên dịch sẵn của Ubuntu, ví dụ) làm cho sử dụng BLAS / LAPACK
Ricardo Cárdenes

6
_dotblas.sokhông còn tồn tại trong numpy v1.10 và mới hơn , nhưng bạn có thể kiểm tra liên kết multiarray.sothay thế
ali_m

Cần phải đề cập rằng giải pháp này là cả dành riêng cho Linux dễ vỡ. Bạn thực sự, thực sự chỉ muốn truy cập vào numpy.__config__đối tượng kinh điển trong thời gian chạy thay thế. (Xem câu trả lời xuất sắc của davost .)
Cecil Curry

Thực sự, nó đặc trưng cho Linux và tôi đồng ý rằng phương pháp @davost là tốt hơn. Tôi không hiểu tại sao câu trả lời của tôi tiếp tục được nêu lên.
Ricardo Cárdenes

8

Bạn có thể sử dụng công cụ phụ thuộc trình tải liên kết để xem xét các thành phần hook cấp độ C trong bản dựng của bạn và xem liệu chúng có phụ thuộc bên ngoài vào blas và lapack của bạn không. Tôi không ở gần một hộp linux ngay bây giờ, nhưng trên máy OS X, bạn có thể thực hiện việc này trong thư mục gói trang chứa các cài đặt:

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

thay thế lddở vị trí của otoolmột gnu / hệ thống Linux và bạn sẽ nhận được câu trả lời mà bạn cần.


1
Nếu không có tập tin numpy/core/_dotblas.sothì sao? (xem bình luận bên dưới câu trả lời của Ricardos)
Woltan

@Woltan: hoặc một cái gì đó bị hỏng nghiêm trọng, hoặc bạn đang tìm sai chỗ. Trên mỗi bản cài đặt Linux và OS X numpy mà tôi từng thấy, sẽ có một _dotblas.sotrình bao bọc giao diện cho bất kỳ blas nào đã được sử dụng để xây dựng bản phân phối. Trên cửa sổ nó sẽ được gọi _dotblas.pyd, nhưng chức năng là như nhau.
Talonmies

3
Có vẻ như _dotblas.sochỉ được tạo nếu bạn đang sử dụng một [atlas]phần trong site.cfg(và thư viện BLAS hỗ trợ CBLAS). Vì vậy, bạn nên sử dụng nó, ngay cả khi bạn không sử dụng ATLAS (trừ khi bạn đang sử dụng Intel MKL, có phần dành riêng).
Kenneth Hoste

Thật vậy, khi không có BLAS khả dụng khi NumPy được xây dựng, nó sẽ xây dựng các thói quen sản phẩm chấm của riêng mình. Đây có thể là hai đơn đặt hàng có cường độ chậm hơn ATLAS.
Fred Foo

5
_dotblas.sokhông còn tồn tại trong numpy v1.10 và mới hơn , nhưng bạn có thể kiểm tra liên kết multiarray.sothay thế
ali_m

6

Bạn có thể hiển thị liên kết BLAS, LAPACK, MKL bằng cách sử dụng show_config():

import numpy as np
np.show_config()

Mà cho tôi đầu ra:

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
Làm thế nào để bạn giải thích ('HAVE_CBLAS', None)]?
seralouk

@serafeim Xem link . Về cơ bản, điều đó có nghĩa HAVE_CBLASlà đang được xác định nhưng không có giá trị (nghĩ C #define HAVE_CBLAS:). Nó không cần một giá trị vì nó chỉ được sử dụng như một cờ. Tôi sẽ giải thích nó như là HAVE_CBLAS=True. Nếu bạn không có CBLAS, bạn sẽ không có bộ dữ liệu nào cả.
MT

Tôi chỉ muốn biết nếu numpy của tôi được liên kết với blas để tính toán đại số tuyến tính đủ nhanh. Tôi nhận được điều này: imgur.com/a/SsrDqg5 . Làm thế nào để bạn giải thích điều này?
seralouk

@makis numpy được liên kết với openblas
MT

0

Nếu bạn đã cài đặt anaconda-navigator (tại www.anaconda.com/anaconda/install/ cho linux, Windows hoặc macOS) - blas, scipy và numpy đều sẽ được cài đặt và bạn có thể thấy chúng bằng cách nhấp vào tab môi trường ở bên trái của nhà điều hướng trang (tìm từng thư mục theo thứ tự alpha). Cài đặt đầy đủ anaconda (trái ngược với miniconda hoặc các gói riêng lẻ) sẽ đảm nhiệm việc cài đặt nhiều gói thiết yếu cần thiết cho khoa học dữ liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.