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

2021-09-24 19:20 更新

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

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

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

gitpod

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

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

本地構(gòu)建

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

先決條件

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

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

基本安裝

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

pip install numpy

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

python setup.py build-ext --inplace

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

測(cè)試

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

$ python runtests.py -v -m full

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

并行構(gòu)建

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

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

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

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

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

選擇 Fortran 編譯器

編譯器是自動(dòng)檢測(cè)的。使用特定編譯器可以使用 --fcompiler,例如選擇 gfortran:

python setup.py build --fcompiler=gnu95

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

python setup.py build --help-fcompiler

如何檢查 BLAS/LAPACK 庫(kù)的 ABI

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

加速 BLAS/LAPACK 庫(kù)

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

BLAS

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

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

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

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

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

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

或者,可以使用!^否定所有項(xiàng)目:

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

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

LAPACK

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

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

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

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

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

或者,可以使用!^否定所有項(xiàng)目:

NPY_LAPACK_ORDER='^lapack' python setup.py build

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

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

禁用 ATLAS 和其他加速庫(kù)

可以通過(guò)以下方式禁用 ATLAS 和 NumPy 中其他加速庫(kù)的使用:

NPY_BLAS_ORDER= NPY_LAPACK_ORDER= python setup.py build

或者:

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

64位 BLAS 和 LAPACK

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

NPY_USE_BLAS_ILP64=1

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

  1. 帶有64_符號(hào)后綴 (?openblas64_) 的OpenBLAS ILP64
  2. 沒(méi)有符號(hào)后綴的 OpenBLAS ILP64 (?openblas_ilp64)

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

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

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)