做爲 Python 語言的一個擴展程序庫,Numpy 支持大量的維度數組與矩陣運算,爲 Python 社區帶來了不少幫助。藉助於 Numpy,數據科學家、機器學習實踐者和統計學家可以以一種簡單高效的方式處理大量的矩陣數據。那麼 Numpy 速度還能提高嗎?本文介紹瞭如何利用 CuPy 庫來加速 Numpy 運算速度。
選自towardsdatascience,做者:George Seif,機器之心編譯,參與:杜偉、張倩。
數組
就其自身來講,Numpy 的速度已經較 Python 有了很大的提高。當你發現 Python 代碼運行較慢,尤爲出現大量的 for-loops 循環時,一般能夠將數據處理移入 Numpy 並實現其向量化最高速度處理。bash
但有一點,上述 Numpy 加速只是在 CPU 上實現的。因爲消費級 CPU 一般只有 8 個核心或更少,因此並行處理數量以及能夠實現的加速是有限的。app
何爲 CuPy?機器學習
CuPy 接口是 Numpy 的一個鏡像,而且在大多狀況下,它能夠直接替換 Numpy 使用。只要用兼容的 CuPy 代碼替換 Numpy 代碼,用戶就能夠實現 GPU 加速。工具
若是遇到一些不支持的特殊狀況,用戶也能夠編寫自定義 Python 代碼,這些代碼會利用到 CUDA 和 GPU 加速。整個過程只須要 C++格式的一小段代碼,而後 CuPy 就能夠自動進行 GPU 轉換,這與使用 Cython 很是類似。oop
pip install cupy複製代碼
使用 CuPy 在 GPU 上運行
學習
爲符合相應基準測試,PC 配置以下:測試
i7–8700k CPUui
1080 Ti GPU編碼
32 GB of DDR4 3000MHz RAM
CUDA 9.0
import numpy as npimport cupy as cpimport time複製代碼
### Numpy and CPUs = time.time()*x_cpu = np.ones((1000,1000,1000))*e = time.time()print(e - s)### CuPy and GPUs = time.time()*x_gpu = cp.ones((1000,1000,1000))*e = time.time()print(e - s)複製代碼
使人難以置信的是,即便以上只是建立了一個數組,CuPy 的速度依然快得多。Numpy 建立一個具備 10 億 1』s 的數組用了 1.68 秒,而 CuPy 僅用了 0.16 秒,實現了 10.5 倍的加速。
好比在數組中作一些數學運算。此次將整個數組乘以 5,並再次檢查 Numpy 和 CuPy 的速度。
### Numpy and CPUs = time.time()*x_cpu *= 5*e = time.time()print(e - s)### CuPy and GPUs = time.time()*x_gpu *= 5*e = time.time()print(e - s)複製代碼
如今嘗試使用更多數組並執行如下三種運算:
數組乘以 5
數組自己相乘
數組添加到其自身
### Numpy and CPUs = time.time()*x_cpu *= 5x_cpu *= x_cpux_cpu += x_cpu*e = time.time()print(e - s)### CuPy and GPUs = time.time()*x_gpu *= 5x_gpu *= x_gpux_gpu += x_gpu*e = time.time()print(e - s)複製代碼
數組大小(數據點)達到 1000 萬,運算速度大幅度提高