利用 gpu 加速運算,是機器學習領域最近發展的風潮,也可以說是機器學習在近年得以發展的基礎。小編對模型進行 simulation 時,往往也需要花費大量的運算時間,最近進行的研究,即使透過平行運算 Parallel 在8核心全開的加速情況下,也需要兩個星期以上的運算時間。所以除了回去重新改寫程式讓計算更有效率,另外便是開始尋找 R 是否也有支援 gpu 運算的套件,結果發現 gpuR 這個套件,安裝過程簡單,並且能有效降低運算時間,介紹給大家使用。這篇在介紹如何安裝、示範如何使用,及加速的時間。
R 套件: gpuR
gpuR 其中強大的部分為不局限於特別的 gpu 品牌。許多支援 gpu 運算的套件,因為引用 CUDA,所以綁定只能使用 NVIDIA。而 gpuR 引用 OpenCL 讓其他廠牌的 gpu 也得以使用該套件。gpuR 沿用 R 的矩陣運算,將矩陣傳換成 gpuMatrix 的格式,再進行運算透過 gpu 加速。
安裝
- 安裝該顯卡廠商的 OpenCL SDK。(NVIDIA, AMD)
- 下載 OpenCL headrs
- 安裝 Rtools
- 設定系統環境變數 OPENCL_INC 和 OPENCL_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")
請問有更詳細的說明嗎??我下載opencl只是一些檔案,不知道如何使用,如何設定系統環境變數 OPENCL_INC 和 OPENCL_LIB32/OPENCL_LIB64 分別為 OpenCL headers 與OpenCL library(OpenCL.dll)??麻煩您了
讚讚
你用什麼OS? 我是使用 Win10。
所以我設定的習慣是搜尋 “環境變數",然後會出現系統內容的視窗,點選 “環境變數",在系統變數下方點選新增。
變數名稱: OPENCL_INC; 變數值: OpenCL headers 的路徑。
變數名稱: OPENCL_LIB64; 變數值: OpenCL library(OpenCL.dll) 的路徑。(如果你的作業系統是 32位元的就是 OPENCL_LIB32)
設定變數環境會因為作業系統的關係有點不太一樣。有問題也歡迎提問喔。
讚讚
您好,我也没找到OpenCL headrs,在英伟达的官网上只找到了OpenCL Multi Threads,OpenCL Simple Multi-GPU请问这个是和您描述的是一个东西么?
讚讚
看來 Khronos 做了些改變,想引用 OpenCL header 從這裡下載就可以了
讚讚
https://github.com/KhronosGroup/OpenCL-Headers
讚讚
您好,下载了OpenCL headrs之后还需要做什么呢
讚讚
我的意思是OpenCL library的路径我不太明白在哪里,我的是win10
讚讚
我是這樣設定的,會因為每個存放的路徑不一樣有所改變,希望可以幫到你的忙。
變數名稱(N): OPENCL_INC, 變數值(V): C:\khronos_headers
變數名稱(N): OPENCL_LIB64, 變數值(V): C:\Program Files\NVIDIA Corporation\OpenCL
讚讚