如何將Numpy加速700倍?用 CuPy 呀

做爲 Python 語言的一個擴展程序庫,Numpy 支持大量的維度數組與矩陣運算,爲 Python 社區帶來了不少幫助。藉助於 Numpy,數據科學家、機器學習實踐者和統計學家可以以一種簡單高效的方式處理大量的矩陣數據。那麼 Numpy 速度還能提高嗎?本文介紹瞭如何利用 CuPy 庫來加速 Numpy 運算速度。

選自towardsdatascience,做者:George Seif,機器之心編譯,參與:杜偉、張倩。
數組

就其自身來講,Numpy 的速度已經較 Python 有了很大的提高。當你發現 Python 代碼運行較慢,尤爲出現大量的 for-loops 循環時,一般能夠將數據處理移入 Numpy 並實現其向量化最高速度處理。bash

但有一點,上述 Numpy 加速只是在 CPU 上實現的。因爲消費級 CPU 一般只有 8 個核心或更少,因此並行處理數量以及能夠實現的加速是有限的。app

這就催生了新的加速工具——CuPy 庫。

何爲 CuPy?機器學習

CuPy 是一個藉助 CUDA GPU 庫在英偉達 GPU 上實現 Numpy 數組的庫。基於 Numpy 數組的實現,GPU 自身具備的多個 CUDA 核心能夠促成更好的並行加速。

CuPy 接口是 Numpy 的一個鏡像,而且在大多狀況下,它能夠直接替換 Numpy 使用。只要用兼容的 CuPy 代碼替換 Numpy 代碼,用戶就能夠實現 GPU 加速。工具

CuPy 支持 Numpy 的大多數數組運算,包括索引、廣播、數組數學以及各類矩陣變換。

若是遇到一些不支持的特殊狀況,用戶也能夠編寫自定義 Python 代碼,這些代碼會利用到 CUDA 和 GPU 加速。整個過程只須要 C++格式的一小段代碼,而後 CuPy 就能夠自動進行 GPU 轉換,這與使用 Cython 很是類似。oop

在開始使用 CuPy 以前,用戶能夠經過 pip 安裝 CuPy 庫:
pip install cupy複製代碼

使用 CuPy 在 GPU 上運行
學習

爲符合相應基準測試,PC 配置以下:測試

  • i7–8700k CPUui

  • 1080 Ti GPU編碼

  • 32 GB of DDR4 3000MHz RAM

  • CUDA 9.0

CuPy 安裝以後,用戶能夠像導入 Numpy 同樣導入 CuPy:
import numpy as npimport cupy as cpimport time複製代碼
在接下來的編碼中,Numpy 和 CuPy 之間的切換就像用 CuPy 的 cp 替換 Numpy 的 np 同樣簡單。以下代碼爲 Numpy 和 CuPy 建立了一個具備 10 億 1』s 的 3D 數組。爲了測量建立數組的速度,用戶可使用 Python 的原生 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 倍的加速。

但 CuPy 能作到的還不止於此。

好比在數組中作一些數學運算。此次將整個數組乘以 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)複製代碼
果不其然,CuPy 再次賽過 Numpy。Numpy 用了 0.507 秒,而 CuPy 僅用了 0.000710 秒,速度整整提高了 714.1 倍。

如今嘗試使用更多數組並執行如下三種運算:

  1. 數組乘以 5

  2. 數組自己相乘

  3. 數組添加到其自身

### 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)複製代碼
結果顯示,Numpy 在 CPU 上執行整個運算過程用了 1.49 秒,而 CuPy 在 GPU 上僅用了 0.0922 秒,速度提高了 16.16 倍。

數組大小(數據點)達到 1000 萬,運算速度大幅度提高

使用 CuPy 可以在 GPU 上實現 Numpy 和矩陣運算的多倍加速。值得注意的是,用戶所能實現的加速高度依賴於自身正在處理的數組大小。下表顯示了不一樣數組大小(數據點)的加速差別:

數據點一旦達到 1000 萬,速度將會猛然提高;超過 1 億,速度提高極爲明顯。Numpy 在數據點低於 1000 萬時實際運行更快。此外,GPU 內存越大,處理的數據也就更多。因此用戶應當注意,GPU 內存是否足以應對 CuPy 所須要處理的數據。

相關文章
相關標籤/搜索