RでGPU を使う

MikuHatsune2016-04-29

RでGPUを使う時がきたようだ。
しかし、使える環境を整備するだけで1日潰れた。
 
OS はubuntu 14.04
メモリは 32GB
CPU は Intel(R) Xeon(R) CPU E5-1620 v3 @ 3.50GHz
GPUGeForce GTX 750 Ti が2枚
 
NVIDIA の準備
GTX 750 Ti のドライバーは361だが、apt-get でなれれば下でとってくる。

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update

CUDA ToolKit を入れる
こちらを参考にCUDA 7.5 にしておいた。
ダウンロードして

sudo dpkg -i cuda-repo-ubuntu1404_7.5-18_amd64.deb
sudo aptitude update
sudo aptitude install -y cuda
sudo reboot

# 再起動後
/usr/local/cuda-7.5/bin/cuda-install-samples .
cd NVIDIA_CUDA-7.5_Samples/1_Utilities/deviceQuery/
make
./deviceQuery

 
これでGPU を使う準備はできた。ここからCaffeやChainer などGPU ツールも使うことがたぶんできる。
RでGPU を使うためのR パッケージをインストールするが、こちらTask viewer のHPC一覧ではgputools, HiPLARM, rpud, magma, gcbd, OpenCL, WideLM, cudaBayesreg, permGPU, gmatrix, gpuR がある。
太字はがんばればインストールできたパッケージ、その他は依存関係をいろいろ入れてもできなかったパッケージ。
 
gputools
結局これになりそう。
普通にインストールしていたら、下のように言われてしまい、R.h がない。

classification.cu:24:14: error: R.h: No such file or directory
make: *** [classification.o] Error 1
ERROR: compilation failed for package ‘gputools’
* removing ‘/usr/local/lib64/R/library/gputools’

The downloaded source packages are in/tmp/RtmpD9AnXS/downloaded_packages’
Updating HTML index of packages in '.Library'
Making packages.html  ... done
Warning message:
In install.packages("gputools") :
  installation of package ‘gputools’ had non-zero exit status

こちらを参考に下記を実行すると、うまく行く。

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

やってみる。
行列積なのでO(n^2)のオーダーで時間がかかる。
あまり速くならない。3倍速くらい。
しかも途中で device memory allocation failed って言われるから小休止が必要。

library(gputools)
gpu.matmult <- function(n) {
    A <- matrix(runif(n * n), n ,n)
    B <- matrix(runif(n * n), n ,n)
    tic <- Sys.time()
    C <- A %*% B
    toc <- Sys.time()
    comp.time1 <- toc - tic
    cat("CPU: ", comp.time1, "\n")
    tic <- Sys.time()
    C <- gpuMatMult(A, B)
    toc <- Sys.time()
    comp.time2 <- toc - tic
    cat("GPU: ", comp.time2, "\n")
    return(c(comp.time1, comp.time2))
}

N <- c(5, 10, 50, 100, 500, 1000, 2000, 3000, 5000)

com <- mapply(gpu.matmult, N)

cols <- c("black", "blue")
matplot(N, t(com), type="l", lwd=2, lty=1, xlab="No. N", ylab="Computation time [sec]", col=cols, log="xy")
legend("topleft", legend=c("CPU", "GPU"), lty=1, lwd=2, col=cols)


 
rpud
RでGPU使ってみたでイチオシの
rpudをやってみる。
CRAN からはないっぽいのでソースを落としてきてインストールする。
依存関係として

install.packages(c("coda", "SparseM"))

としておけばわりと簡単にインストールできる。
というわけでやってみたら

rpuDist(m) : No active license is found.

ファッ!?!?
お金がいるらしい。
 
OpenCL
依存パッケージをいれていたらインストールできた。
R内でCpp 的に書ける様子。ガチ勢。
 
permGPU
Bioconductor のBiobase をいれたらインストールできた。
mRNA の検定がt.test やwilcoxon.test などできるらしい。が、他の使い方はよくわからない。