0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

適用于Python代碼的開源式即時(shí)編譯器NUMBA介紹

NVIDIA英偉達(dá) ? 來源:NVIDIA英偉達(dá) ? 作者:NVIDIA英偉達(dá) ? 2022-07-08 09:15 ? 次閱讀

Numba 是一個(gè)適用于 Python 代碼的開源式即時(shí)編譯器。借助該編譯器,開發(fā)者可以使用標(biāo)準(zhǔn) Python 函數(shù)在 CPUGPU 上加速數(shù)值函數(shù)。

什么是 NUMBA?

為了提高執(zhí)行速度,Numba 會(huì)在執(zhí)行前立即將 Python 字節(jié)代碼轉(zhuǎn)換為機(jī)器代碼。

Numba 可用于使用可調(diào)用的 Python 對(duì)象(稱為修飾器)來優(yōu)化 CPU 和 GPU 功能。修飾器是一個(gè)函數(shù),它將另一個(gè)函數(shù)作為輸入,進(jìn)行修改,并將修改后的函數(shù)返回給用戶。這種模組化可減少編程時(shí)間,并提高 Python 的可擴(kuò)展性。

Numba 還可與 NumPy 結(jié)合使用,后者是一個(gè)復(fù)雜數(shù)學(xué)運(yùn)算的開源 Python 庫(kù),專為處理統(tǒng)計(jì)數(shù)據(jù)而設(shè)計(jì)。調(diào)用修飾器時(shí),Numa 將 Python 和/或 NumPy 代碼的子集轉(zhuǎn)換為針對(duì)環(huán)境自動(dòng)優(yōu)化的字節(jié)碼。它使用 LLVM,這是一個(gè)面向 API 的開源庫(kù),用于以編程方式創(chuàng)建機(jī)器原生代碼。Numba 針對(duì)各種 CPU 和 GPU 配置,提供了多種快速并行化 Python 代碼的選項(xiàng),有時(shí)僅需一條命令即可。與 NumPy 結(jié)合使用時(shí),Numba 會(huì)為不同的數(shù)組數(shù)據(jù)類型和布局生成專用代碼,進(jìn)而優(yōu)化性能。

為何選擇 NUMBA?

Python 是一種廣泛應(yīng)用于數(shù)據(jù)科學(xué)的高效動(dòng)態(tài)編程語(yǔ)言。由于其采用簡(jiǎn)潔明了的語(yǔ)法,并具有標(biāo)準(zhǔn)數(shù)據(jù)結(jié)構(gòu)、全面的標(biāo)準(zhǔn)庫(kù)、高水準(zhǔn)的文檔、龐大的庫(kù)和工具生態(tài)系統(tǒng)以及大型開放社區(qū),因此深受歡迎。不過,也許最重要的原因是,Python 等動(dòng)態(tài)型態(tài)解釋語(yǔ)言能夠帶來超高效率。

但是,對(duì)于 Python 來說,這既是最大的優(yōu)勢(shì),也是最大的劣勢(shì)?!八撵`活性和無類型的高級(jí)語(yǔ)法可能會(huì)導(dǎo)致數(shù)據(jù)和計(jì)算密集型程序的性能不佳,因?yàn)檫\(yùn)行本地編譯代碼要比運(yùn)行動(dòng)態(tài)解釋代碼快很多倍。因此,注重效率的 Python 程序員通常會(huì)使用 C 語(yǔ)言重寫最內(nèi)層的循環(huán),然后從 Python 調(diào)用已編譯的 C 語(yǔ)言函數(shù)。許多項(xiàng)目都力求簡(jiǎn)化這種優(yōu)化(例如 Cython),但它們通常需要學(xué)習(xí)新的語(yǔ)法。雖然 Cython 顯著提高了性能,但可能需要對(duì) Python 代碼進(jìn)行艱巨的手動(dòng)修改工作。

Numba 被視作 Cython 的替代方案,并且要簡(jiǎn)單得多。它最大的吸引力在于無需學(xué)習(xí)新的語(yǔ)法,也無需替換 Python 解釋器、運(yùn)行單獨(dú)的編譯步驟或安裝 C/C++ 編譯器。只需將@jit Numba 修飾器應(yīng)用于 Python 函數(shù)即可。這樣,在運(yùn)行時(shí)即可進(jìn)行編譯(即“即時(shí)”或 JIT 編譯)。Numba 能夠動(dòng)態(tài)編譯代碼,這意味著,您還可以享受 Python 帶來的靈活性。此外,Python 程序中由 Numba 編譯的數(shù)值算法,可以接近使用編譯后的 C 語(yǔ)言或 FORTRAN 語(yǔ)言編寫的程序的速度;并且與原生 Python 解釋器執(zhí)行的相同程序相比,運(yùn)行速度最多快 100 倍。這是一項(xiàng)重要進(jìn)步,推動(dòng)了高效編程與高性能計(jì)算的完美結(jié)合。

07b24ae2-fdf5-11ec-ba43-dac502259ad0.png

Numba 執(zhí)行圖

Numba 專為面向數(shù)組的計(jì)算任務(wù)而設(shè)計(jì),與應(yīng)用廣泛的 NumPy 庫(kù)類似。在面向數(shù)組的計(jì)算任務(wù)中,數(shù)據(jù)并行性與 GPU 等加速器自然契合。Numba 理解 NumPy 數(shù)組類型,并將其用于生成高效的編譯代碼,以在 GPU 或多核 CPU 上執(zhí)行。所需的編程工作非常簡(jiǎn)單,只需添加一個(gè) @vectorize 函數(shù)修飾器,指示 Numba 在運(yùn)行時(shí)生成編譯的向量化函數(shù)版本。這樣,它便可用于在 GPU 上并行處理數(shù)據(jù)數(shù)組了。

除了為 CPU 或 GPU 即時(shí)編譯 NumPy 數(shù)組代碼外,Numba 還公開了“CUDA Python”:這是適用于 NVIDIA GPU 的 NVIDIA CUDA編程模型,采用 Python 語(yǔ)法編寫。加速 Python 后,它可以從膠水語(yǔ)言擴(kuò)展至可高效執(zhí)行數(shù)字代碼的完整編程環(huán)境。

Numba 與 Python 數(shù)據(jù)科學(xué)生態(tài)系統(tǒng)中其他工具的結(jié)合使用,改變了 GPU 計(jì)算的體驗(yàn)。Jupyter Notebook 提供基于瀏覽器的文檔創(chuàng)建環(huán)境,允許結(jié)合使用 Markdown 文本、可執(zhí)行代碼以及繪圖和圖像的圖形輸出。Jupyter 在教學(xué)、記錄科學(xué)分析和交互式原型設(shè)計(jì)領(lǐng)域深受歡迎。

Numba 已在 200 多種不同的平臺(tái)配置下進(jìn)行了測(cè)試。它基于 IntelAMD x86、POWER8/9、ARM CPU 以及 NVIDIA 和 AMD GPU 上的 Windows、Apple Macintosh、Linux 操作系統(tǒng)運(yùn)行,大多數(shù)系統(tǒng)均可使用預(yù)編譯的二進(jìn)制文件。

用例

科學(xué)計(jì)算

數(shù)組處理應(yīng)用廣泛,從地理信息系統(tǒng)到計(jì)算復(fù)雜的幾何形狀,無一不及。電信公司使用數(shù)組來優(yōu)化無線網(wǎng)絡(luò)的設(shè)計(jì),而醫(yī)療健康研究人員則使用數(shù)組分析包含內(nèi)臟器官信息的波形。數(shù)組還可用于減少語(yǔ)言處理、天文成像和雷達(dá)/聲納中的外部噪聲。

有了 Python 等語(yǔ)言,開發(fā)者無需進(jìn)行大量數(shù)學(xué)訓(xùn)練,即可使用這些領(lǐng)域的應(yīng)用程序。但是,Python 在數(shù)值密集型計(jì)算中存在性能缺陷,這會(huì)嚴(yán)重影響某些應(yīng)用程序的處理速度。Numba 是其中一個(gè)解決方案。許多人都認(rèn)為它易于使用,因此對(duì)于沒有 C 語(yǔ)言等比較復(fù)雜語(yǔ)言經(jīng)驗(yàn)的學(xué)生和開發(fā)者來說,意義重大。

NUMBA 對(duì)數(shù)據(jù)科學(xué)家的重要意義

在數(shù)據(jù)科學(xué)中,迭代開發(fā)是一種非常實(shí)用的省時(shí)方案,因?yàn)殚_發(fā)者能夠通過觀察結(jié)果來不斷地改進(jìn)程序。Python 等解釋語(yǔ)言在這種情景中尤為有用。但是,Python 在高度數(shù)學(xué)運(yùn)算中存在性能限制,這可能會(huì)造成瓶頸,從而減緩整體處理速度并限制開發(fā)者的工作效率。

Numba 為開發(fā)者提供了一種調(diào)用編譯器函數(shù)的簡(jiǎn)單方法,顯著提升了大型計(jì)算和數(shù)組的性能,從而解決了這一問題。Numba 簡(jiǎn)單易學(xué),并使數(shù)據(jù)科學(xué)家無需執(zhí)行使用編譯語(yǔ)言編寫子程序這一復(fù)雜任務(wù),從而加快速度。

NUMBA 為何可在 GPU 上表現(xiàn)更突出

在架構(gòu)方面,CPU 僅由幾個(gè)具有大緩存內(nèi)存的核心組成,一次只可以處理幾個(gè)軟件線程。相比之下,GPU 由數(shù)百個(gè)核心組成,可以同時(shí)處理數(shù)千個(gè)線程。

07d8cee2-fdf5-11ec-ba43-dac502259ad0.jpg

Numba 通過以下方式支持 CUDA GPU 編程:在 CUDA 執(zhí)行模型后,直接將受限的 Python 代碼子集編譯到 CUDA 內(nèi)核函數(shù)和設(shè)備函數(shù)中。使用 Numba 編寫的內(nèi)核看起來可以直接訪問 NumPy 數(shù)組,而這些數(shù)組在 CPU 和 GPU 之間自動(dòng)傳輸。這為 Python 開發(fā)者提供了一個(gè)輕松進(jìn)行 GPU 加速計(jì)算的方法,而且無需學(xué)習(xí)新語(yǔ)法或語(yǔ)言,即可學(xué)會(huì)如何應(yīng)用日益復(fù)雜的 CUDA 編碼。借助 CUDA Python 和 Numba,您可以一舉兩得:使用 Python 實(shí)現(xiàn)快速迭代開發(fā),同時(shí)達(dá)到針對(duì) CPU 和 NVIDIA GPU 的編譯語(yǔ)言的速度。

我們使用配備 NVIDIA P100 GPU 和 Intel Xeon E5-2698 v3 CPU 的服務(wù)器進(jìn)行了一次測(cè)試,結(jié)果顯示,使用 Numba 編譯的 CUDA Python Mandelbrot 代碼比只使用 Python 快了近 1700 倍。與 CPU 上的單線程 Python 代碼相比,性能提升是多個(gè)因素的共同作用,包括編譯、并行化和 GPU 加速。但是,它說明單是添加一個(gè) GPU 即可實(shí)現(xiàn)加速。

NVIDIA GPU 加速的端到端數(shù)據(jù)科學(xué)

基于 CUDA-X AI 創(chuàng)建的 NVIDIA RAPIDS開源軟件庫(kù)套件使您完全能夠在 GPU 上執(zhí)行端到端數(shù)據(jù)科學(xué)和分析流程。此套件依靠 NVIDIA CUDA 基元進(jìn)行低級(jí)別計(jì)算優(yōu)化,但通過用戶友好型 Python 接口實(shí)現(xiàn)了 GPU 并行化和高帶寬顯存速度。

借助 RAPIDS GPU DataFrame,數(shù)據(jù)可以通過一個(gè)類似 Pandas 的接口加載到 GPU 上,然后用于各種連接的機(jī)器學(xué)習(xí)和圖形分析算法,而無需離開 GPU。這種級(jí)別的互操作性可通過 Apache Arrow 等庫(kù)實(shí)現(xiàn),并有助于實(shí)現(xiàn)端到端流程(從數(shù)據(jù)準(zhǔn)備到機(jī)器學(xué)習(xí)再到深度學(xué)習(xí))的加速。

07f8c85a-fdf5-11ec-ba43-dac502259ad0.png

RAPIDS 支持在許多熱門數(shù)據(jù)科學(xué)庫(kù)之間共享設(shè)備內(nèi)存。這樣可將數(shù)據(jù)保留在 GPU 上,并省去了來回復(fù)制主機(jī)內(nèi)存的高昂成本。

0855baf6-fdf5-11ec-ba43-dac502259ad0.png

RAPIDS 團(tuán)隊(duì)正在開發(fā)和參與許多開源項(xiàng)目,并與眾多開源項(xiàng)目(包括 Apache Arrow、Numba、XGBoost、Apache Spark、scikit-learn 等)密切協(xié)作,確保 GPU 加速數(shù)據(jù)科學(xué)生態(tài)系統(tǒng)中的所有組件順暢地協(xié)同工作。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10698

    瀏覽量

    209327
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    4793

    瀏覽量

    102421
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1602

    瀏覽量

    48894
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84068

原文標(biāo)題:NVIDIA 大講堂 | 什么是 NUMBA ?

文章出處:【微信號(hào):NVIDIA_China,微信公眾號(hào):NVIDIA英偉達(dá)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    適用于可擴(kuò)展系統(tǒng)的高效、無代碼、無傳感BLDC電機(jī)驅(qū)動(dòng)

    電子發(fā)燒友網(wǎng)站提供《適用于可擴(kuò)展系統(tǒng)的高效、無代碼、無傳感BLDC電機(jī)驅(qū)動(dòng).pdf》資料免費(fèi)下載
    發(fā)表于 08-29 11:11 ?0次下載
    <b class='flag-5'>適用于</b>可擴(kuò)展系統(tǒng)的高效、無<b class='flag-5'>代碼</b>、無傳感<b class='flag-5'>器</b>BLDC電機(jī)驅(qū)動(dòng)<b class='flag-5'>器</b>

    AI編譯器技術(shù)剖析

    隨著人工智能技術(shù)的飛速發(fā)展,AI編譯器作為一種新興的編譯技術(shù)逐漸進(jìn)入人們的視野。AI編譯器不僅具備傳統(tǒng)編譯器的功能,如將高級(jí)語(yǔ)言編寫的源代碼
    的頭像 發(fā)表于 07-17 18:28 ?1196次閱讀

    人工智能編譯器與傳統(tǒng)編譯器的區(qū)別

    人工智能編譯器(AI編譯器)與傳統(tǒng)編譯器在多個(gè)方面存在顯著的差異。這些差異主要體現(xiàn)在設(shè)計(jì)目標(biāo)、功能特性、優(yōu)化策略、適用范圍以及技術(shù)復(fù)雜性等方面。以下是對(duì)兩者區(qū)別的詳細(xì)探討,旨在全面解析
    的頭像 發(fā)表于 07-17 18:19 ?1255次閱讀

    Meta發(fā)布基于Code Llama的LLM編譯器

    近日,科技巨頭Meta在其X平臺(tái)上正式宣布推出了一款革命性的LLM編譯器,這一模型家族基于Meta Code Llama構(gòu)建,并融合了先進(jìn)的代碼優(yōu)化和編譯器功能。LLM編譯器的推出,標(biāo)
    的頭像 發(fā)表于 06-29 17:54 ?1304次閱讀

    SEGGER編譯器優(yōu)化和安全技術(shù)介紹 支持最新C和C++語(yǔ)言

    代碼生成,SEGGER編譯器生成非常小的代碼,非常適合內(nèi)存受限的環(huán)境,而不會(huì)犧牲執(zhí)行速度。 2)?速度優(yōu)化:在最高優(yōu)化級(jí)別,SEGGER編譯器生成盡可能快的
    的頭像 發(fā)表于 06-04 15:31 ?1141次閱讀
    SEGGER<b class='flag-5'>編譯器</b>優(yōu)化和安全技術(shù)<b class='flag-5'>介紹</b> 支持最新C和C++語(yǔ)言

    C語(yǔ)言:嵌入開發(fā)中的關(guān)鍵編譯器角色

    嵌入程序開發(fā)跟硬件密切相關(guān),需要使用C語(yǔ)言來讀寫底層寄存、存取數(shù)據(jù)、控制硬件等,C語(yǔ)言和硬件之間由編譯器來聯(lián)系,一些C標(biāo)準(zhǔn)不支持的硬件特性操作,由編譯器提供。
    發(fā)表于 04-26 14:53 ?405次閱讀
    C語(yǔ)言:嵌入<b class='flag-5'>式</b>開發(fā)中的關(guān)鍵<b class='flag-5'>編譯器</b>角色

    微軟正式發(fā)布適用于Windows的Sudo

    微軟已在 Windows 11 Insider Preview Build 26052 中發(fā)布適用于 Windows 的 Sudo,并將其在 MIT 協(xié)議下進(jìn)行開源
    的頭像 發(fā)表于 03-19 09:20 ?652次閱讀
    微軟正式發(fā)布<b class='flag-5'>適用于</b>Windows的Sudo

    Triton編譯器的原理和性能

    Triton是一種用于編寫高效自定義深度學(xué)習(xí)原語(yǔ)的語(yǔ)言和編譯器。Triton的目的是提供一個(gè)開源環(huán)境,以比CUDA更高的生產(chǎn)力編寫快速代碼,但也比其他現(xiàn)有DSL具有更大的靈活性。Tri
    的頭像 發(fā)表于 12-16 11:22 ?2207次閱讀
    Triton<b class='flag-5'>編譯器</b>的原理和性能

    python軟件怎么運(yùn)行代碼

    Python是一種高級(jí)編程語(yǔ)言,它被廣泛用于開發(fā)各種類型的應(yīng)用程序,從簡(jiǎn)單的腳本到復(fù)雜的網(wǎng)絡(luò)應(yīng)用和機(jī)器學(xué)習(xí)模型。要運(yùn)行Python代碼,您需要一個(gè)P
    的頭像 發(fā)表于 11-28 16:02 ?742次閱讀

    編譯器的優(yōu)化選項(xiàng)

    一個(gè)程序首先要保證正確性,在保證正確性的基礎(chǔ)上,性能也是一個(gè)重要的考量。要編寫高性能的程序,第一,必須選擇合適的算法和數(shù)據(jù)結(jié)構(gòu);第二,應(yīng)該編寫編譯器能夠有效優(yōu)化以轉(zhuǎn)換成高效可執(zhí)行代碼的源代碼,要做到
    的頭像 發(fā)表于 11-24 15:37 ?746次閱讀
    <b class='flag-5'>編譯器</b>的優(yōu)化選項(xiàng)

    python如何換行而不運(yùn)行代碼

    和可讀性。 在Python中,可以使用兩個(gè)主要的方法進(jìn)行換行:使用反斜杠()和使用圓括號(hào)(())。 第一種方式是使用反斜杠()來表示換行。在Python中,反斜杠是一個(gè)轉(zhuǎn)義字符,它可以用于將一行
    的頭像 發(fā)表于 11-24 09:50 ?2726次閱讀

    python怎樣運(yùn)行代碼

    討論Python代碼的運(yùn)行方式,包括解釋、交互環(huán)境和命令行。 Python代碼可以通過兩種主
    的頭像 發(fā)表于 11-22 10:31 ?985次閱讀

    嵌入javascript編譯器的設(shè)計(jì)與實(shí)現(xiàn)

    電子發(fā)燒友網(wǎng)站提供《嵌入javascript編譯器的設(shè)計(jì)與實(shí)現(xiàn).pdf》資料免費(fèi)下載
    發(fā)表于 10-30 11:29 ?0次下載
    嵌入<b class='flag-5'>式</b>javascript<b class='flag-5'>編譯器</b>的設(shè)計(jì)與實(shí)現(xiàn)

    新版編譯器的設(shè)計(jì)思路和優(yōu)化方法

    小程序編譯器在小程序開發(fā)、預(yù)覽、發(fā)布各個(gè)階段都需要使用,因此編譯器性能會(huì)直接影響到開發(fā)者開發(fā)效率,也會(huì)影響到開發(fā)者工具的使用體驗(yàn)。 由于舊版的編譯器(基于 webpack4)在構(gòu)建大型項(xiàng)目時(shí)會(huì)很慢,內(nèi)存占用也高,一直被開發(fā)者吐槽
    發(fā)表于 10-13 11:21 ?253次閱讀
    新版<b class='flag-5'>編譯器</b>的設(shè)計(jì)思路和優(yōu)化方法

    嵌入開發(fā)中的C語(yǔ)言編譯器設(shè)置

    編譯器的語(yǔ)義檢查很弱小,甚至還會(huì)“掩蓋”錯(cuò)誤?,F(xiàn)代的編譯器設(shè)計(jì)是件浩瀚的工程,為了讓編譯器設(shè)計(jì)簡(jiǎn)單一些,目前幾乎所有編譯器的語(yǔ)義檢查都比較弱小。為了獲得更快的執(zhí)行效率,C語(yǔ)言被設(shè)計(jì)的足
    發(fā)表于 10-11 12:43 ?568次閱讀