2015年11月2日

R 套件 gputools 0.28 與 CUDA 7.5

CUDA 是 Nvidia 顯示卡的程式語言,可以用 C 或 Python 撰寫出 GPU 運算的程式

gputools 是 R 底下的一個套件,可以將 CUDA 引入 R 中作計算,目前是 0.28 版

買了這張顯卡本來是要幫我的論文計算碎形維度的,但直到我都算完了套件還沒有裝好

昨天終於突破困境把 R 的 gputools 給裝起來了

過程中大概需要突破數個重大關卡...


1. 先裝CUDA

參考Installing CUDA Toolkit 7.5 on Ubuntu 14.04 Linux這篇文章的裝法,我簡述過程

1.1下載CUDA 到 https://developer.nvidia.com/cuda-downloads 下載最新版的工具
1.2 我選 Linux  x86_64  Ubuntu  14.04  deb(local)
並下載 1.9GB 的檔案,下載完後用命令安裝該檔案

sudo dpkg -i cuda-repo-ubuntu1404_7.5-18_amd64.deb 
sudo apt-get update
sudo apt-get install cuda

跑完之後算是安裝完成CUDA了,這時建議重新開機,讓 CUDA 的驅動載入

1.3 還要設定環境變數
到 ~/.bashrc 底下新增 幾行路徑
vim ~/.bashrc

到最底下加入

export CUDA_HOME=/usr/local/cuda-7.5 
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64 

PATH=${CUDA_HOME}/bin:${PATH} 
export PATH


然後存檔,重開機(或使用 source .bashrc)
這樣CUDA才算是裝完了,如果要測試可以安裝範例來跑看看,在原本的文章中有

2. 安裝 gputools

CRAN - Package gputools 下載 gputools,我這時是 0.28 版,八成也不會再更新了

下載這個 Package source: gputools_0.28.tar.gz

下載之後你可以直接安裝,如果過了就沒問題,但問題我就是不過

直接安裝可以鍵入

sudo R CMD INSTALL gputools_0.28.tar.gz

我的會出現編譯錯誤,這時請把該檔案解壓縮,修改 src 資料夾底下的 Makefile
我把編譯指令 NVCC 中的 -gencode arch=compute_10,code=sm_10 刪除
錯誤變成 13,因此也把 -gencode arch=compute_13,code=sm_13 刪除

重新打包tar檔

sudo R CMD build gputools
sudo R CMD INSTALL gputools_0.28.tar.gz

可以編譯,但仍有錯誤,檢查
src 資料夾底下的 config.mk
發現 $(CUDA_HOME)/include 沒有這個檔案(CUDA HOME 在 /usr/lib/R/)
真正的檔案在 /usr/share/R/include
所以建立軟連結

cd /usr/lib/R/
sudo ln -s /usr/share/R/include include

再次安裝

sudo R CMD INSTALL gputools_0.28.tar.gz

發現會編譯完成,但再檢查套件載入時,無法載入共用文件 libcublas.so.7.5 檔
這是讓我卡最久的地方,先找出該檔案在哪

sudo updatedb
locate  libcublas.so.7.5 

我的在
/usr/local/cuda-7.5/targets/x86_64-linux/lib/libcublas.so.7.5
這個問題不是因為你的環境變數沒設定好,是 R 的環境變數沒設定好
所以打開 R ,執行

Sys.getenv("LD_LIBRARY_PATH")

簡單看一下他顯示什麼
然後離開 R ,去修改R內部的LD_LIBURARY_PATH

cd /usr/lib/R/etc/
sudo vim ldpaths 

插入 :/usr/local/cuda-7.5/targets/x86_64-linux/lib 在適當的地方,注意要有冒號

其實直接插在第三行應該也可以,儲存後離開,這時打開 R 
Sys.getenv("LD_LIBRARY_PATH")
應該可以看到顯示 /usr/local/cuda-7.5/targets/x86_64-linux/lib/ 這個路徑了

最後請再安裝 gputools 再給他一次機會

sudo R CMD INSTALL gputools_0.28.tar.gz

應該就會過了

3.測試 gputools

我參考了R and GPU 這個網站的範例 
進入 R

#載入套件
library("gputools")

#撰寫函數,測試矩陣乘法
gpu.matmult <- font="" function="" n="">
    A <- font="" matrix="" n="" runif="">
    B <- font="" matrix="" n="" runif="">
    tic <- font="" sys.time="">
    C <- a="" b="" font="">
    toc <- font="" sys.time="">
    comp.time <- -="" font="" tic="" toc="">
    cat("CPU: ", comp.time, "\n")
    tic <- font="" sys.time="">
    C <- b="" font="" gpumatmult="">
    toc <- font="" sys.time="">
    comp.time <- -="" font="" tic="" toc="">
    cat("GPU: ", comp.time, "\n")
}

#呼叫函數
gpu.matmult(1)
gpu.matmult(10)
gpu.matmult(100)
gpu.matmult(1000)
gpu.matmult(2000)

應該可以看到 CPU 和 GPU 在運算時間的差異,矩陣越大 GPU 越有優勢
但注意別輸入超過 10000 ,我的顯卡記憶體不足,最後會溢位

後記

gputools 這個套件有些時間沒有修正了,沒有跟上 CUDA 的速度,因此有些路徑可能會有錯,希望這篇可以幫到有需要的朋友們,開心的使用 GPU 進行運算。

1 則留言: