numba安装与使用
一、numba是什么
Numba是一個針對Python的開源JIT編譯器,由Anaconda公司主導開發,可以對Python原生代碼進行CPU和GPU加速。Numba對NumPy數組和函數非常友好。解釋器可以參考第四章內容。
CUDA C編程開發成本高,所以一般會用python先嘗試加速模型訓練。numba包就是python提供的GPU編程開發包。只管調用就對了。
除此之外還有很多,比方說等價于numpy的cupy,用于矩陣運算,pycuda之類的,tensorflow,pytorch等等。
參考這篇文章:numba與cupy
二、numba下載與安裝
使用conda安裝Numba:
$ conda install numba
或者使用pip安裝:
$ pip install numba
三、numba的使用
使用方法很簡單,想寫好真不容易!!!
from numba import jit
import numpy as npa = np.arange(10)
b = np.arange(1,11)@jit
def test():return a+btest()
我們只需要在原來的代碼上添加一行@jit,即可將一個函數編譯成機器碼,其他地方都不需要更改。@符號裝飾了原來的代碼,所以稱類似寫法為裝飾器。
這里裝飾的函數調用的API是有限制的!!!!比如pandas是更高層次的封裝,Numba其實不能理解它里面做了什么,所以無法對其加速。一些大家經常用的機器學習框架,如scikit-learn,tensorflow,pytorch等,已經做了大量的優化,不適合再使用Numba做加速。
此外,Numba不支持:try…except 異常處理,with 語句,類定義class,yield from
Numba的@jit裝飾器就像自動駕駛,用戶不需要關注到底是如何優化的,Numba去嘗試進行優化,如果發現不支持,那么Numba會繼續用Python原來的方法去執行該函數,即圖 Python解釋器工作原理中左側部分。這種模式被稱為object模式。
Numba真正牛逼之處在于其nopython模式。將裝飾器改為@jit(nopython=True)或者@njit,Numba會假設你已經對所加速的函數非常了解,強制使用加速的方式,不會進入object模式,如編譯不成功,則直接拋出異常。nopython的名字會有點歧義,我們可以理解為不使用很慢的Python,強制進入圖 Python解釋器工作原理中右側部。簡而言之,無腦nonpython模式就對了!!!!
注意點一
Numba庫提供的是一種懶編譯(Lazy Compilation)技術,即在運行過程中第一次發現代碼中有@jit,才將該代碼塊編譯。用到的時候才編譯,看起來比較懶,所以叫懶編譯。使用Numba時,總時間 = 編譯時間 + 運行時間。相比所能節省的計算時間,編譯的時間開銷很小,所以物有所值。對于一個需要多次調用的Numba函數,只需要編譯一次,后面再調用時就不需要編譯了。
注意點二
原生Python速度慢的另一個重要原因是變量類型不確定。聲明一個變量的語法很簡單,如a = 1,但沒有指定a到底是一個整數和一個浮點小數。Python解釋器要進行大量的類型推斷,會非常耗時。同樣,引入Numba后,Numba也要推斷輸入輸出的類型,才能轉化為機器碼。針對這個問題,Numba給出了名為Eager Compilation的優化方式。
from numba import jit, int32@jit("int32(int32, int32)", nopython=True)
def f2(x, y):return x + y
@jit(int32(int32, int32))告知Numba你的函數在使用什么樣的輸入和輸出,括號內是輸入,括號左側是輸出。這樣不會加快執行速度,但是會加快編譯速度,可以更快將函數編譯到機器碼上。
具體用法參考皮皮魯的科技星球
調用cuda,不需要選擇njit修飾器,用cuda.jit即可
from numba import cuda
@cuda.jit
def gpu_add(a, b, result, N):idxWithinGrid = cuda.threadIdx.x + cuda.blockIdx.x * cuda.blockDim.x gridStride = cuda.gridDim.x * cuda.blockDim.xfor i in range(idxWithinGrid, N, gridStride):result[i] = a[i] + b[i]
四、numba的原理
python慢的原因主要是因為解釋器。解決辦法有倆個,一種解決辦法是使用C/C++語言重寫Python函數,但是這要求程序員對C/C++語言熟悉,且調試速度慢,不適合絕大多數Python程序員。另外一種非常方便快捷的解決辦法就是使用Just-In-Time(JIT)技術。
Just-In-Time(JIT)技術為解釋語言提供了一種優化,它能克服上述效率問題,極大提升代碼執行速度,同時保留Python語言的易用性。使用JIT技術時,JIT編譯器將Python源代碼編譯成機器直接可以執行的機器語言,并可以直接在CPU等硬件上運行。這樣就跳過了原來的虛擬機,執行速度幾乎與用C語言編程速度并無二致。
總結
以上是生活随笔為你收集整理的numba安装与使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WZK的排名(jzoj 1995)
- 下一篇: 【bfs】WZK旅游(jzoj 1996