R 的 GPU 運算- gpuR

利用 gpu 加速運算,是機器學習領域最近發展的風潮,也可以說是機器學習在近年得以發展的基礎。小編對模型進行 simulation 時,往往也需要花費大量的運算時間,最近進行的研究,即使透過平行運算 Parallel 在8核心全開的加速情況下,也需要兩個星期以上的運算時間。所以除了回去重新改寫程式讓計算更有效率,另外便是開始尋找 R 是否也有支援 gpu 運算的套件,結果發現 gpuR 這個套件,安裝過程簡單,並且能有效降低運算時間,介紹給大家使用。這篇在介紹如何安裝、示範如何使用,及加速的時間。

R 套件: gpuR

gpuR 其中強大的部分為不局限於特別的 gpu 品牌。許多支援 gpu 運算的套件,因為引用 CUDA,所以綁定只能使用 NVIDIA。而 gpuR 引用 OpenCL 讓其他廠牌的 gpu 也得以使用該套件。gpuR 沿用 R 的矩陣運算,將矩陣傳換成 gpuMatrix 的格式,再進行運算透過 gpu 加速。

安裝

  1. 安裝該顯卡廠商的 OpenCL SDK。(NVIDIA, AMD)
  2. 下載 OpenCL headrs
  3. 安裝 Rtools
  4. 設定系統環境變數 OPENCL_INCOPENCL_LIB32/OPENCL_LIB64 分別為 OpenCL headers 與OpenCL library(OpenCL.dll)

完成上述步驟後,就可以和安裝一般套件一樣在 R console 安裝套件

install.packages('gpuR')

R 實作

安裝完 gpuR 後,在 R 中使用 gpu 的方式也相當簡單。可以直接宣告 gpu 的 vector, matrix,或將已經存在的 vector, matrix 轉換成 gpu 格式。轉換成 gpu 格式之後的運算就是 gpu 的矩陣運算。

library(pryr)
library(gpuR)

# verify you have volid GPUs
detectGPUs()

# gpuVector and gpuMatrix two ways to create gpu vector and matrix

A <- seq.int(from=0, to=999)
gpuA <- gpuVector(A)
gpuB <- gpuMatrix(rnorm(16), nrow=4, ncol=4)

接著我們試著創造 1000*1000 的兩個矩陣,對兩個矩陣做 inner product,重複動作100次,計算 cpu, gpu 所需時間。

# CPU version
ptm <- proc.time()
for(i in 1:100){
  ORDER = 1000
  A = matrix(rnorm(ORDER^2), nrow=ORDER)
  B = matrix(rnorm(ORDER^2), nrow=ORDER)
  A %*% B
}
proc.time() - ptm

# GPU version
ptm <- proc.time()
for(i in 1:100){
  ORDER = 1000
  A = matrix(rnorm(ORDER^2), nrow=ORDER)
  B = matrix(rnorm(ORDER^2), nrow=ORDER)
  gpuA = gpuMatrix(A, type="double")
  gpuB = gpuMatrix(B, type="double")
  gpuA %*% gpuB
}
proc.time() - ptm

在小編的電腦,cpu 運行的時間是 61.34 秒,gpu 運行的時間是 30.86 秒。使用 gpu 運算有效降低 50% 的計算時間。

結論

透過 gpu 運算能有效地降低計算的時間,而且使用方式也不複雜,也不指定 N 家的顯卡,推薦給大家使用。最後因為明天是情人節了,想跟各位 R user 分享一點關於 R 與數學浪漫的故事,在 R console 執行下面程式碼就會得到浪漫的結果喔。

x <- seq(-2,2,0.001)
x <- as.complex(x)
y <- (sqrt(cos(x))*cos(200*x)+sqrt(abs(x))-0.7)*(4-x*x)^0.01
plot(x,y,type = "l", col= "red", main = "Happy Valentine")

8 comments

  1. 請問有更詳細的說明嗎??我下載opencl只是一些檔案,不知道如何使用,如何設定系統環境變數 OPENCL_INC 和 OPENCL_LIB32/OPENCL_LIB64 分別為 OpenCL headers 與OpenCL library(OpenCL.dll)??麻煩您了

    1. 你用什麼OS? 我是使用 Win10。
      所以我設定的習慣是搜尋 “環境變數",然後會出現系統內容的視窗,點選 “環境變數",在系統變數下方點選新增。
      變數名稱: OPENCL_INC; 變數值: OpenCL headers 的路徑。
      變數名稱: OPENCL_LIB64; 變數值: OpenCL library(OpenCL.dll) 的路徑。(如果你的作業系統是 32位元的就是 OPENCL_LIB32)
      設定變數環境會因為作業系統的關係有點不太一樣。有問題也歡迎提問喔。

  2. 您好,我也没找到OpenCL headrs,在英伟达的官网上只找到了OpenCL Multi Threads,OpenCL Simple Multi-GPU请问这个是和您描述的是一个东西么?

    1. 我是這樣設定的,會因為每個存放的路徑不一樣有所改變,希望可以幫到你的忙。
      變數名稱(N): OPENCL_INC, 變數值(V): C:\khronos_headers
      變數名稱(N): OPENCL_LIB64, 變數值(V): C:\Program Files\NVIDIA Corporation\OpenCL

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s