布?xì)v史全解讀:從 0.57 到 0.2 的功能演進(jìn)、棄用策略與依賴升級路線圖)
Numba 發(fā)布?xì)v史全解讀從 0.57 到 0.2 的功能演進(jìn)、棄用策略與依賴升級路線圖【免費下載鏈接】numbaNumPy aware dynamic Python compiler using LLVM項目地址: https://gitcode.com/gh_mirrors/nu/numbaNumba 是一款基于 LLVM 的 NumPy 感知的動態(tài) Python 編譯器當(dāng)前倉庫項目描述即 “NumPy aware dynamic Python compiler using LLVM”其官方發(fā)布說明沉淀了大量關(guān)于 Python/NumPy 功能覆蓋、CUDA 目標(biāo)演進(jìn)、編譯器內(nèi)核改造與依賴升級的權(quán)威信息。本文以倉庫中的 docs/source/release-notes.rst 為骨架完整梳理從 0.57.12023 年 6 月回溯至 0.2 的版本脈絡(luò)幫助你理解 Numba 的架構(gòu)演變、棄用時間線以及如何據(jù)其規(guī)劃升級路徑。一、先讀懂文檔結(jié)構(gòu)兩份 release notes 的分工在倉庫中Numba 的發(fā)布說明由兩個入口共同組成docs/source/release-notes-overview.rst文檔目錄入口分為兩部分。Towncrier generated notes小節(jié)通過 toctree 以倒序:reversed:聚合 docs/source/release/ 目錄下的*.rst文件即 0.58.0 及之后各版本的發(fā)布說明由 towncrier 工具從碎片化 changelog 片段自動生成Non-Towncrier generated notes小節(jié)則直接引用本篇文章的主體 docs/source/release-notes.rst。docs/source/release-notes.rst手工維護(hù)的發(fā)布說明按時間倒序覆蓋 0.57.1 至 0.2 的全部版本是目前倉庫中信息密度最高、跨度最大的一份版本史資料。這種「歷史手工維護(hù) 新版本 towncrier 生成」的雙軌結(jié)構(gòu)本身就是一個值得注意的工程實踐從 0.58 起社區(qū)用 towncrier.toml docs/upcoming_changes/ 的片段式 changelog 取代了整篇手寫使每個 PR 只需新增一個小片段即可自動匯入發(fā)布說明同時保留歷史文檔原樣不動的可追溯性。二、版本支持矩陣Python / NumPy / LLVM 的三線演進(jìn)通讀全部發(fā)布說明可以發(fā)現(xiàn)Numba 每個版本最重要的信息往往是「支持什么、放棄什么」。以下是文檔中明確記載的關(guān)鍵升級節(jié)點Python 版本線版本Python 變更0.57.0正式支持Python 3.11最低版本提升至3.80.55.0支持Python 3.100.53.0支持Python 3.90.49.0移除全部 Python 2 相關(guān)代碼最低版本提升至3.60.47.0最后一個支持 Python 2 / 3.5 的主版本遵循 NumPy NEP 29 棄用節(jié)奏0.39.0第一個支持 Python 3.7 的版本值得注意的是0.56.0 明確提示「這是最后一個支持 Python 3.7 的版本」0.57 直接跳至 3.8 基線并完成 3.11 支持對應(yīng) PR #8545、#8590、#8639 等一批 Python 3.11 兼容性修復(fù)涉及字節(jié)碼 opcode 拼寫變化、CALL_FUNCTION_EX處理、tracing 支持等。NumPy 版本線0.57.0支持NumPy 1.24最低版本提升至1.210.55.2維護(hù)性支持NumPy 1.22與 Apple M10.55.0支持NumPy 1.21因 NumPy CVE-2021-33430 繞過常規(guī)流程加速發(fā)布0.54.0支持NumPy 1.20運行時最低版本提升至 1.17編譯仍兼容 1.110.52.0支持NumPy 1.190.50.0支持NumPy 1.180.44.1 / 0.43.1支持NumPy 1.17 / 1.160.22.0支持NumPy 1.10。LLVM 版本線經(jīng) llvmlite 傳遞文檔中可檢索到的升級記錄0.57 起LLVM 14全平臺支持PR #8535、#8809→ 0.54 起 LLVM 11 → 0.51 起 LLVM 10 → 0.50 起 LLVM 9 → 0.44 起 LLVM 8ppc64le 因 bug 停留在 7.x→ 0.42 起 LLVM 7 → 0.38 起 LLVM 6 → 0.36.1 起 LLVM 5 → 0.32 起 LLVM 4 → 0.31 起 LLVM 3.9.1 → 0.29 起 LLVM 3.8。這條線的含義是Numba 的代碼生成能力與上層 vectorization含 SVML支持完全由 LLVM 版本驅(qū)動升級 LLVM 往往伴隨自動向量化機(jī)會的增加如 0.38 明確記載「LLVM 6.0 提升通用向量化」。平臺與打包0.57.0最后一個由 Numba 團(tuán)隊發(fā)布 Windows 32 位包的版本0.56.0最后一個提供 linux-32 包的版本0.53.0BSD 系統(tǒng)非官方支持0.52 起0.39.0新增ppc64le架構(gòu)支持0.57.0setuptools變?yōu)榭蛇x運行時依賴TBB 線程層要求2021.6 或更新0.54 起 TBB 僅支持 2021 系列ABI 破壞性變更。三、Python 語言支持增強(qiáng)從基本語法到語言特性發(fā)布說明中「Python language support enhancements」板塊記錄了 Numba 對 Python 語義的逐步逼近。以信息量最大的 0.57.0 為例異常類支持非編譯期常量的參數(shù)PR #8134內(nèi)建hasattr/getattr支持編譯期常量屬性PR #7884、#8442內(nèi)建str/repr按 Python 語義實現(xiàn)自定義__str__/__repr__可關(guān)聯(lián)到類型上正常工作PR #8442str.startswith支持start/end關(guān)鍵字參數(shù)PR #8557Unicode__getitem__改為返回視圖、避免分配min/max支持布爾類型PR #8677支持dict(iterable)構(gòu)造器PR #8334。更早版本的關(guān)鍵語言特性包括0.54.0 的基礎(chǔ) f-string 支持、dict 推導(dǎo)式、內(nèi)建sum()0.55.0 的實驗性isinstance支持通過部分字面量傳播 pass 實現(xiàn)PR #72440.47.0 的基礎(chǔ)try/except支持、閉包/lambda作為函數(shù)參數(shù)、numba.literal_unroll異構(gòu)元組/常量列表迭代0.34.0 的列表推導(dǎo)式與閉包支持。0.52.0 則補(bǔ)齊了 Python 3.10 下大型內(nèi)聯(lián)字典與超多關(guān)鍵字參數(shù)的調(diào)用問題并支持operator.mul作用于列表、字面量 slice如slice(1, 10, 2)的返回。這些條目共同說明 Numba 的「語言子集」一直在向 CPython 語義收斂且每次語言特性落地都伴隨numba/cpython/下對應(yīng)實現(xiàn)模塊的擴(kuò)充如 numba/cpython/unicode.py、numba/cpython/builtins.py。四、NumPy 功能覆蓋的持續(xù)擴(kuò)張NumPy 支持是 Numba 的核心價值之一發(fā)布說明中每版都有大量新增函數(shù)清單。0.57.0numpy.random.Generator全面落地這是 0.57 最大的 NumPy 特性集絕大多數(shù)常用分布已支持文檔明確列出的方法包括beta、chisquare、exponential、f、gamma、geometric、integers、laplace、logistic、lognormal、logseries、negative_binomial、noncentral_chisquare、noncentral_f、normal、pareto、permutation、poisson、power、random、rayleigh、shuffle、standard_cauchy、standard_exponential、standard_gamma、standard_normal、standard_t、triangular、uniform、wald、weibull、zipf。實現(xiàn)位于 numba/np/random/對應(yīng) PR #8038、#8040、#8041、#8042 的 BitGenerator 支持系列以及 #8520 的非中心卡方/非中心 F/logseries。0.56.0 已先期支持Generator實例的傳入、使用與返回當(dāng)前僅random分布。同期 0.57 還新增ndarray 的nbytes屬性PR #8662、嵌套數(shù)組類型PR #8120、datetime/timedelta到int的轉(zhuǎn)換PR #8024、ufunc 生成中的F-order 迭代提升 F 序數(shù)組組合性能PR #7622以及np.argpartition、np.isclose、np.nan_to_num、np.new_axis、np.union1dPR #5544、#7067、#8623、#8513、#8732。0.56.0 / 0.55.0 / 0.54.0 的代表性新增0.56.0np.broadcast_shapes、np.broadcast_arrays、min/max支持np.timedelta64/np.datetime64、np.sort支持沿最后一軸的多維排序、np.clip的a_min/a_max接受數(shù)組、np.empty/np.ones等分配函數(shù)支持enum.IntEnum形狀成員、np.random.noncentral_chisquare0.55.0np.broadcast_to、np.float_power、np.cbrt、np.logspace、np.take_along_axis、np.average、np.argmin支持axis、ndarray.astype支持字面量字符串類型0.54.0np.clip、np.iscomplex/np.iscomplexobj/np.isneginf/np.isposinf/np.isreal/np.isrealobj/np.isscalar、np.random.dirichlet、np.rot90、np.swapaxes、np.argmax支持axis、0d 數(shù)組作標(biāo)量用于__setitem__。更早期的里程碑包括 0.52.0 的np.asfarray、record 數(shù)組子類型化、np.split/np.array_split、NumPy 1.19、dtype 字符串字面量0.47.0 的np.gcd/np.lcm、np.linalg系列、帶key的sorted/list.sort()0.45.0 引入實驗性numba.typed.List0.43.0 引入靜態(tài)類型化字典typing Dict。這些實現(xiàn)大多集中在 numba/np/arraymath.py、numba/np/linalg.py 與 numba/np/npdatetime.py。五、編譯器內(nèi)核與 NRT 運行時性能與安全的結(jié)構(gòu)性改進(jìn)發(fā)布說明中「Highlights of core changes」「Performance」板塊揭示了 Numba 內(nèi)部的長期工程主線——把編譯器從「能用」推向「高效且可擴(kuò)展」。NRTNumba Runtime演進(jìn)0.57.0NRT 內(nèi)部統(tǒng)計計數(shù)器默認(rèn)關(guān)閉消除原子鎖競爭、調(diào)試緩存行填充默認(rèn)關(guān)閉、NRT 延遲到首次編譯時才初始化改善導(dǎo)入速度、所有分配調(diào)用默認(rèn)走 checked 層PR #8200、#8235、#84380.46.0NRT C-API 重構(gòu)0.52.0Intel 資助的LLVM 級引用計數(shù)剪枝 pass減少原子鎖壓力并讓優(yōu)化器做得更多0.33.0消除循環(huán)體內(nèi)冗余引用計數(shù)操作受影響程序提速 2–10 倍。相關(guān)實現(xiàn)可參考 numba/core/runtime/nrt.py 與 numba/core/runtime/ 目錄。擴(kuò)展 API 的大規(guī)模遷移0.57.0 記載了一次重要的內(nèi)部重構(gòu)把大量 Python/NumPy 函數(shù)的內(nèi)置實現(xiàn)從低層擴(kuò)展 API 遷移到高層擴(kuò)展 APInumba.extending例如用overload取代overload_gluePR #8234、#8431、#8649 等 20 個函數(shù)并刪除了numba.core.overload_glue模塊。同時overload*與intrinsic的默認(rèn)target改為generic使擴(kuò)展默認(rèn)同時被 CPU 與 CUDA 目標(biāo)接受PR #8554types.float64[:, ::1]這類對 Numba 類型的__getitem__現(xiàn)在可在編譯代碼中使用PR #8819Numba 類型支持__repr__PR #8685。更高層的 API 演進(jìn)還包括 0.54.0 的overload_classmethod、0.51.0 的StructRef按引用傳遞的可變結(jié)構(gòu)擴(kuò)展類型、0.46.0 的入口點entrypoints擴(kuò)展注冊機(jī)制以及 0.38.0 的自定義編譯管線custom pipeline與numba.extending.get_cython_function_address。這些接口的權(quán)威文檔見 docs/source/extending/ 與 numba/extending.py。IR 與編譯管線0.49.0引入基于ir.Del的自由靜態(tài)單賦值SSA形式的 NIR并把代碼庫按功能重組成numba.core等子模塊提供 shim 過渡0.50.0 移除0.52.0開啟 SLPsuperword-level parallelism向量化并調(diào)優(yōu)優(yōu)化管線新增inspect_cfg增強(qiáng)、LLVM pass 計時0.53.00.46.0編譯器管線重構(gòu)為更易擴(kuò)展的形態(tài)配合自定義 pass 文檔0.55.0新增NUMBA_CAPTURED_ERRORSnew_style錯誤處理模式——凡不繼承numba.errors.NumbaException的異常一律視為硬錯誤并立即展開棧大幅改善overload編寫時的調(diào)試體驗。六、并行加速器ParallelAccelerator與 parforsNumba 的自動并行化技術(shù)自 0.34.0 引入parallelTrue與顯式prange此后持續(xù)增強(qiáng)0.57.0parfor gufunc 不再執(zhí)行診斷 passPR #89820.56.0新增numba.set_parallel_chunksize/numba.get_parallel_chunksize并支持 context manager 調(diào)整numba.get_thread_id的線程 ID 定義變得可預(yù)測且在已知范圍內(nèi)stencil的串行/并行性能均有提升0.53.0支持 Fortran 序F-order數(shù)組0.40.0并行循環(huán)允許數(shù)組作為歸約變量0.38.0修復(fù)parallelTrue相關(guān) bug 使向量化機(jī)會增加。配套的并行化實現(xiàn)與文檔位于 numba/parfors/、docs/source/user/parallel.rst。調(diào)試環(huán)境變量NUMBA_DEBUG_ARRAY_OPT_STATS0.36.1 起可輸出哪些算子/調(diào)用被轉(zhuǎn)換為并行 for 循環(huán)。七、CUDA 目標(biāo)從基礎(chǔ)支持到完整擴(kuò)展 APICUDA 是 Numba 除 CPU 外的第二大目標(biāo)發(fā)布說明中幾乎每版都有獨立的 CUDA 板塊。0.57.0CUDA 大版本工具鏈支持CUDA 11.8 與 12提供 11.x 的 Minor Version CompatibilityMVC打包改用 NVIDIA 官方 CUDA Toolkit conda 包PR #7255、#8180硬件支持Hopper、Ada Lovelace、AGX Orinfloat16算術(shù)運算完整支持新增is_fp16_supported()方法與supports_float16設(shè)備屬性PR #7885、#8001、#8010、#8634高層擴(kuò)展 API 在 CUDA 目標(biāo)完全可用支持多簽名急切編譯、廣義 ufunc 多輸出與返回類型指定kernel 內(nèi)可調(diào)用有限集合的 NumPy ufunc三角函數(shù)PR #8294開啟 lineinfo 不再改變生成代碼PR #8594修復(fù) CUDA ufunc 中虛假的 device-to-host 傳輸PR #9005。0.56.0 與 0.55.x0.56.0設(shè)備函數(shù)自遞歸、向量類型float4、int2等、擴(kuò)展類型共享/局部數(shù)組、鏈接 CUDA C/C 設(shè)備函數(shù)、CC 8.6/8.7 PTX 生成、float16比較運算性能上消除 launch 配置時的 context 查詢、launch 配置 LRU 緩存、kernel 磁盤緩存0.55.x支持 NVIDIA CUDA Python bindings、16 位浮點及基礎(chǔ)運算 intrinsic、Stream.async_done提供流對象0.55.1 宣布棄用 CC 5.3 與 CUDA Toolkit 10.20.56 移除。更早的里程碑0.54.0lineinfo輸出供 Nsight Compute 等使用、Windows 上的 IPC、tuple 傳入 CUDA ufunc、warp-aggregated intrinsicsactivemask()、lanemask_lt()、overload在 CUDA 目標(biāo)支持0.53.0CUDA 11.2NVVM IR 1.6 / LLVM IR 7.0.1、cuda.is_supported_version()、CUDA Array Interface v3含 streams、Cooperative GroupsGrid Groups / Grid Sync、tuple/namedtuple 傳參macOS 上的 CUDA 支持進(jìn)入棄用狀態(tài)0.52.0Unified Memory、kernel launch 開銷降低、libdevice 全函數(shù)接入、更多原子操作0.33.0基于 xoroshiro128 的 GPU 隨機(jī)數(shù)生成器cuda.jitkernel 可直接調(diào)用jit/njitCPU 函數(shù)并自動編譯為設(shè)備函數(shù)。相關(guān)代碼位于 numba/cuda/文檔見 docs/source/cuda/。八、棄用與破壞性變更時間線升級必讀發(fā)布說明中反復(fù)強(qiáng)調(diào)的一條主線是棄用策略。以下是文檔明確記載的時間線object mode 回退fallback棄用0.57.0 起正式推進(jìn)并給出了具體時間表PR #8702——未來無關(guān)鍵字參數(shù)的jit將與njit等同建議從現(xiàn)在起顯式使用njit或jit(nopythonTrue)generated_jit棄用0.57.0numba.extending.overload是其超集替代品numba.pyccpending deprecation0.57.0CUDA 移除0.53.0 移除argtypes/restypes/bind關(guān)鍵字參數(shù)與Device.COMPUTE_CAPABILITY、to_host方法0.56.0 移除 CC 5.3 與 CTK 10.2 支持、棄用inspect_ptx()改用compile_ptx()與設(shè)備函數(shù)急切編譯target關(guān)鍵字棄用0.51.0jitclass從頂層命名空間遷至numba.experimental0.49–0.52 完成 shim 移除ROCm 目標(biāo)轉(zhuǎn)為 unmaintained0.54.0單獨遷出倉庫兼容性compatibility模式移除0.52.0該模式源自 40 個版本前、用于 0.11→0.12 過渡Python 2 / 3.5 支持終止0.47.0 后、內(nèi)部模塊重排的 shim 于 0.50.0 移除。關(guān)于棄用細(xì)節(jié)的官方匯總見 docs/source/reference/deprecation.rst。九、調(diào)試、緩存與工程質(zhì)量發(fā)布說明同樣記錄了大量「體驗類」改進(jìn)值得使用者關(guān)注調(diào)試0.31.0 起debugTrue生成 GDB 兼容調(diào)試信息0.52.0 起函數(shù)名 mangling 與 Python 函數(shù)名完全一致可對 Python 名直接打斷點并提供 GDB pretty-printing 支持模塊0.56.0 新增NUMBA_EXTEND_VARIABLE_LIFETIMES環(huán)境變量將變量生命周期延伸到基本塊末尾模擬 C/C/Fortran 調(diào)試體驗與_dbg_optnone裝飾器參數(shù)完全關(guān)閉 LLVM 優(yōu)化 pass緩存0.22.0 起 JIT 緩存存儲編譯后的目標(biāo)代碼0.45.0 起parallelTrue函數(shù)可緩存0.51.0 起 objmode 塊可緩存0.56.0 起 CUDA kernel 支持磁盤緩存0.51.0 起全部 pickle 操作改用 vendored cloudpicklenumba/cloudpickle/可觀測性numba -s系統(tǒng)信息工具0.30.0、chrome tracing 輸出0.56.0、編譯器事件系統(tǒng)0.53.0、inspect_llvm()/inspect_asm()/inspect_cfg()CI 與測試0.41.0 起 Azure Pipelines、flake8 檢查0.41、typeguard0.53、Python 3.11 矩陣0.57等。十、版本速查表與升級建議版本發(fā)布時間核心亮點最低依賴0.57.12023-06CUDA ufunc 修復(fù)、parfor 診斷調(diào)整、緩存修復(fù)Python 3.8 / NumPy 1.21 / LLVM 140.57.02023-05Python 3.11、NumPy 1.24、Generator 全面支持、CUDA 12/MVC、NRT 加固、objmode 棄用啟動Python 3.8 / NumPy 1.21 / LLVM 140.56.42022-11CUDA.view()回歸修復(fù)—0.56.02022-07最后一個支持 Python 3.7 的版本、chunksize 控制、CUDA C/C 鏈接、磁盤緩存LLVM 110.55.02022-01Python 3.10、NumPy 1.21、isinstance、新錯誤處理模式LLVM 110.54.02021-08f-string、dict 推導(dǎo)式、overload_classmethod、CUDAoverloadLLVM 11、Python 3.70.53.02021-03Python 3.9、動態(tài) gufunc、Cooperative GroupsLLVM 100.52.02020-11LLVM 級 refcount 剪枝、SLP 向量化、Unified MemoryLLVM 100.49.02020-04移除 Python 2、SSA 化 IR、內(nèi)部模塊重組LLVM 9、Python 3.60.34.02017ParallelAcceleratorparallelTrue/prange發(fā)布—0.122014編譯器大重構(gòu)、njit誕生—給升級者的建議若你仍在使用jit無參形式或generated_jit應(yīng)依據(jù) 0.57.0 的棄用聲明盡早遷移到njit與numba.extending.overloadCUDA 用戶需確認(rèn)本機(jī) CUDA Toolkit 版本0.57 要求 11.8 以獲得最佳支持且支持 11.x MVC 與 CUDA 12Python 3.8 是當(dāng)前倉庫0.57 系的最低 Python 基線。后續(xù) 0.58 版本的變更細(xì)節(jié)可在 docs/source/release/ 目錄下按版本查閱 towncrier 生成的說明?!久赓M下載鏈接】numbaNumPy aware dynamic Python compiler using LLVM項目地址: https://gitcode.com/gh_mirrors/nu/numba創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考