NumPy 從源代碼構(gòu)建

2021-09-24 19:20 更新

有兩種構(gòu)建 NumPy 的選項:

  • 使用 Gitpod 構(gòu)建
  • 從源本地構(gòu)建。

你的選擇將會取決于你的操作系統(tǒng)以及對命令行的熟練程度。

gitpod

Gitpod 是一個開源平臺,可以在你的瀏覽器中自動創(chuàng)建正確的開發(fā)環(huán)境,減少安裝本地開發(fā)環(huán)境和處理不兼容依賴項的需要。

如果你是 Windows 用戶,對于命令行的使用不熟悉或者是第一次構(gòu)建 NumPy,使用 Gitpod 來構(gòu)建通常會更快。下面是使用 Gitpod 構(gòu)建 NumPy 的深入說明。

本地構(gòu)建

在你的機(jī)器上本地構(gòu)建,可以為你提供更加精細(xì)的控制。如果你是熟悉命令行使用的 MacOS 或者 Linux 用戶,則可以按照下面的說明繼續(xù)在本地構(gòu)建 NumPy。

先決條件

構(gòu)建 NumPy 前需要具備以下內(nèi)容:

  1. Python 3.6.X 或者更新的版本
    請注意:還需要安裝 Python 開發(fā)頭文件,例如:在 Debian/Ubuntu 上就需要安裝 Python3 和 Python3-dev。
    在 Windows 和 MacOS 上,這個通常不是問題。
  2. 編譯器
    雖然構(gòu)建 NumPy 不需要 FORTRAN 77 編譯器,但是運(yùn)行 numpy.f2py 測試需要它。如果未自動檢測到編譯器,則會跳過這些測試。
    請注意:NumPy 主要使用 GUN 編譯器開發(fā),并在 MSVC 和 Clang 編譯器上進(jìn)行測試。來自 Intel、Absoft、Sun、NAG、Compaq、Portlang、Lahey、HP、IBM等其他供應(yīng)商的編譯器僅是以社區(qū)反饋的形式提供支持,可能無法開箱即用。建議使用 GCC 4.x(或者更高版本)的便宜。在 ARM64(aarch64)上,建議使用 GCC 8.x(或者更高版本)。
  3. 線性代數(shù)庫
    NumPy 不需要安裝任何外部線性代數(shù)庫。但是,如果這些可用,NumPy 的安裝腳本可以檢測到它們并使用它們進(jìn)行構(gòu)建??梢允褂迷S多不同的 LAPACK 庫設(shè)置,包括優(yōu)化的 LAPACK 庫,例如 OpenBLAS 或 MKL。這些庫的選擇和位置以及包含路徑和其他此類構(gòu)建選項可以在site.cfg位于 NumPy 根存儲庫或.numpy-site.cfg主目錄中的文件中指定。有關(guān)site.cfg.example文檔,請參閱NumPy 存儲庫或 sdist 中包含的示例文件,以及從環(huán)境變量指定搜索優(yōu)先級的下方。
  4. CPython
    要構(gòu)建 NumPy,你還需要最新版本的 Cython。

基本安裝

要安裝 NumPy,請運(yùn)行:

pip install numpy

要執(zhí)行可以從源文件夾運(yùn)行的就地構(gòu)建,請運(yùn)行:

python setup.py build-ext --inplace

注意:有關(guān)在 NumPy 本身上進(jìn)行開發(fā)工作的構(gòu)建說明,請參閱 設(shè)置和使用開發(fā)環(huán)境

測試

測試是為了確保你的構(gòu)建是否一切正常,請查看是否所有的測試都能夠通過:

$ python runtests.py -v -m full

有關(guān)測試的詳細(xì)信息,請參閱測試構(gòu)建。

并行構(gòu)建

可以使用以下方法進(jìn)行構(gòu)建:

python setup.py build -j 4 install --prefix $HOME/.local

將會在 4 個 CPU 上編譯 numpy 并將其安裝到指定的前綴中。要執(zhí)行并行就地構(gòu)建,請運(yùn)行:

python setup.py build-ext --inplace -j 4

還可以通過環(huán)境變量指定構(gòu)建作業(yè)的數(shù)量 NPY_NUM_BUILD_JOBS。

選擇 Fortran 編譯器

編譯器是自動檢測的。使用特定編譯器可以使用 --fcompiler,例如選擇 gfortran:

python setup.py build --fcompiler=gnu95

有更多的相關(guān)信息,可以通過以下命令參閱:

python setup.py build --help-fcompiler

如何檢查 BLAS/LAPACK 庫的 ABI

檢查用于構(gòu)建庫的編譯器的一種相對簡單且可靠的方法是在庫上使用 ldd。如果 libg2c.so 是一個依賴項,這意味著已經(jīng)使用了 g77(注意:構(gòu)建NumPy不再支持g77)。如果 libgfortran.so 是依賴項,則已經(jīng)使用 gfortran。如果兩者都是依賴項,則意味著兩者都已經(jīng)使用,這幾乎是一個非常不好的方法。

加速 BLAS/LAPACK 庫

NumPy 搜索優(yōu)化的線性代數(shù)庫,例如 BLAS 和 LAPACK。搜索這些庫有特定的順序,如下文和site.cfg.example文件中所述:

BLAS

請注意:正確優(yōu)化的NumPy構(gòu)建需要BLASh和CBLAS接口。 庫的默認(rèn)順序是:

  1. MKL
  2. BLIS
  3. 開放式BLAS
  4. ATLAS
  5. BLAS(NetLIB)

可以通過定義環(huán)境變量來繞過對 BLAS 庫的檢測,該變量NPY_BLAS_LIBS應(yīng)包含您要使用的確切鏈接器標(biāo)志(假設(shè)接口為 Fortran 77)。還定義?NPY_CBLAS_LIBS(如果 CBLAS 包含在您的 BLAS 庫中,則為空)以觸發(fā) CBLAS 的使用并避免用于矩陣計算的緩慢回退代碼。

如果您希望針對 OpenBLAS 進(jìn)行構(gòu)建,但也有 BLIS 可用,則可以通過環(huán)境變量預(yù)定義搜索順序,該環(huán)境變量?NPY_BLAS_ORDER是上述名稱的逗號分隔列表,用于確定要搜索的內(nèi)容,例如:

NPY_BLAS_ORDER=ATLAS,blis,openblas,MKL python setup.py build

將更喜歡使用 ATLAS,然后是 BLIS,然后是 OpenBLAS,并且作為最后的手段 MKL。如果這些都不存在,構(gòu)建將失?。Q比較小寫)。

或者,可以使用!^否定所有項目:

NPY_BLAS_ORDER='^blas,atlas' python setup.py build

將允許使用任何東西,但NETLIB的BLAS和ATLAS庫,上面列表的順序被保留。 不能混合否定和肯定,也不能有多個否定,這種情況會引發(fā)錯誤。

LAPACK

  1. MKL
  2. 開放式BLAS
  3. libFLAME
  4. ATLAS
  5. LAPACK(NetLIB)

可以通過定義環(huán)境變量來繞過 LAPACK 庫的檢測,該變量NPY_LAPACK_LIBS應(yīng)包含您要使用的確切鏈接器標(biāo)志(假定語言為 Fortran 77)。

如果您希望針對 OpenBLAS 進(jìn)行構(gòu)建,但您也有 MKL 可用,則可以通過環(huán)境變量預(yù)定義搜索順序,該環(huán)境變量?NPY_LAPACK_ORDER是上述名稱的逗號分隔列表,例如:

NPY_LAPACK_ORDER=ATLAS,openblas,MKL python setup.py build

將更喜歡使用 ATLAS,然后是 OpenBLAS,并且作為最后的手段 MKL。如果這些都不存在,構(gòu)建將失?。Q比較小寫)。

或者,可以使用!^否定所有項目:

NPY_LAPACK_ORDER='^lapack' python setup.py build

將允許使用任何東西,但在NETLIB LAPACK庫,上面列表的順序被保留。

不能混合否定和肯定,也不能有多個否定,這種情況會引發(fā)錯誤。

禁用 ATLAS 和其他加速庫

可以通過以下方式禁用 ATLAS 和 NumPy 中其他加速庫的使用:

NPY_BLAS_ORDER= NPY_LAPACK_ORDER= python setup.py build

或者:

BLAS=None LAPACK=None ATLAS=None python setup.py build

64位 BLAS 和 LAPACK

您可以通過設(shè)置環(huán)境變量來告訴 Numpy 使用 64 位 BLAS/LAPACK 庫:

NPY_USE_BLAS_ILP64=1

在構(gòu)建 Numpy 時。支持以下 64 位 BLAS/LAPACK 庫:

  1. 帶有64_符號后綴 (?openblas64_) 的OpenBLAS ILP64
  2. 沒有符號后綴的 OpenBLAS ILP64 (?openblas_ilp64)

它們的優(yōu)先順序由NPY_BLAS_ILP64_ORDERNPY_LAPACK_ILP64_ORDER環(huán)境變量決定?。默認(rèn)值為openblas64_,openblas_ilp64

提供額外的編譯器標(biāo)志

可以通過設(shè)置OPT、?FOPT(對于 Fortran)和CC環(huán)境變量來提供額外的編譯器標(biāo)志。在提供應(yīng)該提高代碼性能的選項時,請確保您還設(shè)置-DNDEBUG為不執(zhí)行調(diào)試代碼。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號