Contenu connexe
Similaire à RでGPU使ってみた (20)
RでGPU使ってみた
- 2. サイバー系
はじめに
※この発表は個人の
見解であり、所属する
組織の公式見解では
ありません。
2011/11/19 1
- 3. サイバー系
アジェンダ
1. 自己紹介
2. GPUの話
3. R上で動くGPU演算をしてくれるパッケージ紹介
4. ベンチマーク結果
2011/11/19 2
- 4. サイバー系
自己紹介
和田 計也(@wdkz)
静岡県袋井市出身
サイバー系企業でデータマイニングエンジニア職
創立記念日が3月18日
社長の出身地が福井県鯖江市
前職はバイオベンチャー
バイオマーカ探索してた
学生時代は枯草菌の研究
2011/11/19 3
- 5. サイバー系
唐突ですが
R遅!!ですね。
あまりの遅さに気を失いかけたことありませんか?
そこで
GPUですよ
2011/11/19 4
- 6. サイバー系
GPU
GPUとは?
Graphics Processing Unitの略
3Dグラフィックスの表示に必要な計算処理(3D座標から2D座標へ
の座標変換など)を行う半導体チップ
(最新のは)448コア
2011/11/19 5
- 7. サイバー系
GPU
東工大のスパコン、TSUBAME2.0にもGPUが使われています!
2011/11/19 6
- 8. サイバー系
GPGPU
General-purpose computing on graphics processing
units; GPUによる汎目的計算
CUDA
今日はこれ(一般的だから)
ATI Stream
OpenCL
2011/11/19 7
- 9. サイバー系
ちょっと待て
でもお高い
んでしょ?
2011/11/19 8
- 10. サイバー系
高い…
Amazonで(専用の)GPUカードだけ買うと
しても28万くらいする..
GPUカード搭載のサーバマシンだと90万弱もする..
2011/11/19 9
- 11. サイバー系
じゃあどうするの?
こんなのとかでも一応動く。
Amazonだと5000円くらいから
一応問題点
・デスクトップマシンもってない
・それなりのスペックでベンチマークしないと
過小評価しちゃって二度と日の目を見ないかもしれんし。
それなりのスペック・・・①GPUカードに搭載されてるメモリ量
②IO速度
③倍精度浮動小数点計算
2011/11/19 10
- 12. サイバー系
結局GPUはどうすればいいの?
AWS(Amazon Web Service)で可能です
これ
2011/11/19 11
- 13. サイバー系
AWS Management Consoleから始める
とりあえず試すだけなので「Spot Instances」でいいや
よくわからん
からこっち
使ってみた
SAS美
2011/11/19 12
- 14. サイバー系
AWS Management Consoleから始めるSAS美
1時間0.665ドルからってかいてあるから、Max Priceのとこに
「0.665」っていれてContinueボタン押しとく
2011/11/19 13
- 15. サイバー系
3.1 Rのビルド
まあ、あれだ。いろいろやるとこんな感じ↓で使えるように
なった。
詳しくは@KenTamagawa さんをフォロー
するか本読んでね♪
2011/11/19 14
- 16. サイバー系
AWS上のAmazon Linux AMIでRをコンパイル
sudo yum install gccsudo
sudo yum install gcc-gfortran 何か絶望的にいろいろ入ってない
sudo yum install gcc-c++
sudo yum install readline-devel
sudo yum install make
wget ftp://ftp.u-aizu.ac.jp/pub/lang/R/CRAN/src/base/R-2/R-2.14.0.tar.gz
tar -xvf R-2.14.0.tar.gz
cd R-2.14.0 ←このオプションつけとかないと後でGPU関連の
パッケージがインストールできない。
./configure --enable-R-shlib
make
sudo make install
2011/11/19 15
- 17. サイバー系
AWS上のAmazon Linux AMIでGPU関連のを入れる
yum install libGLU-devel libXi-devel libXmu-devel freeglut-devel kernel-devel
必要なライブラリをいれて
wget
http://developer.download.nvidia.com/compute/cuda/4_0/drivers/devdriver_4.0
_linux_64_270.41.19.run Developer Drivers for Linux
sudo ./devdriver_4.0_linux_64_270.41.19.run を入れて
wget http://developer.download.nvidia.com/compute/cuda/4_0/toolkit/cudatoolkit
_4.0.17_linux_64_rhel6.0.run
CUDAを入れて
sudo sh cudatoolkit_4.0.17_linux_64_rhel6.0.run (Amazon Linux AMIのベースlinuxが何かよく
わからんかったけどredhat 6.0のでいけたわ~)
wget
http://developer.download.nvidia.com/compute/cuda/4_0/sdk/gpucomputingsdk_
4.0.17_linux.run
./gpucomputingsdk_4.0.17_linux.run
GPU Computing SDKを入れる
cd NVIDIA_GPU_Computing_SDK/C
sudo make
*ここら辺のはもともとインストール済みっていう噂なんだけど,
全部入れ直してみた。
2011/11/19 16
- 18. サイバー系
動作確認する・Win
cd NVIDIA_GPU_Computing_SDK/C
./bin/linux/release/deviceQuery
ここまでで、CUDAが動く環境
が整った。次にR上でCUDAが
利用することを考える
2011/11/19 17
- 19. サイバー系
RでGPUを使えるパッケージ
Gputool
http://brainarray.mbni.med.umich.edu/brainarray/rgpgpu/
使える関数多い
Rpud
http://www.r-tutor.com/content/download
Gputoolより高速だった
svmはe1071パッケージのsvmに準拠
いろんなカーネルトリック使える
こっち使ってみた
2011/11/19 18
- 20. サイバー系
Rpudをインストール
export CUDA_HOME=“/usr/local/cuda”
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${CUDA_HOME}/lib64“
export PATH=${CUDA_HOME}/bin:${PATH} 環境変数を設定して
export R_LIBS_USER="${HOME}/lib/R“
R
必要なパッケージSparseMを
>install.packages("SparseM")
インストールして
>q(“no”)
wget http://www.r-tutor.com/sites/default/files/rpud/rpud_0.1.1.tar.gz
R CMD INSTALL rpud_0.1.1.tar.gz Rpudをいれて
wget http://www.r-tutor.com/sites/default/files/rpud/rpudplus_0.1.1.tar.gz
tar xvf rpudplus_0.1.1.tar.gz Rpudplusをいれる
cd rpudplus_0.1.1
./install.sh RPUSVMってのもあるので
お好きな人はどうぞ
2011/11/19 19
- 21. サイバー系
(参考資料)gputoolsのインストール
今回は使わなかったけど…
前々々ページに記載してあるCUDAインストールまで完了しているとする
R
> install.packages(“gputools”)’
お手軽♪
2011/11/19 20
- 22. サイバー系
Rpudパッケージについて
基本的に以下の4つの手法しか(まだ)実装されていません
基本的に普通の関数と同様の引数で使えますので悩みません
CPUで計算 GPUで計算
(rpud)
相関 cor rpuCor
距離 dist rpuDist
階層クラスタリング hclust rpuHclust
SVM(トレーニング) e1071::svm rpuSvm
SVM(予測) e1071::predict.svm predict.rpuSvm
2011/11/19 21
- 23. サイバー系
Rpudをちょっと使ってみる
R
>library(rpud) #これでrpudもrpudplusも両方読み込まれる
>A <- runif(100000000); B <- runif(100000000)
>system.time(cor (A, B), method=“pearson”)
まずは通常のCPUで(ピアソンの)相関計数計算
># user system elapsed
># 1.858 0.003 1.860
>system.time(gpuCor(A, B, method="pearson"))
># user system elapsed
次にGPUで(ピアソンの)相関計数計算
># 1.858 0.002 1.860
2011/11/19
← Kendall以外はCPUで処理されてた
22
- 24. サイバー系
Rpudをちょっと使ってみる・2
R
>library(rpud) #これでrpudもrpudplusも両方読み込まれる
>A <- runif(100000000); B <- runif(100000000)
>system.time(cor (A, B), method=“kendall”)
まずは通常のCPUで(ケンドールの順位)相関計数計算
># user system elapsed
># 199.025 0.000 198.926
>system.time(gpuCor(A, B, method=“kendall"))
># user system elapsed
次にGPUで(ケンドールの順位)相関計数計算
># 4.262 2.183 6.581
速っ!!
2011/11/19 23
- 25. サイバー系
ベンチマークのマシン構成
CPUマシン
Intel Xeon L5520@2.27GHz(L2 8M), 4Cores (8Threads) x 2
なんだけど、シングルスレッドしか使わなかった
32Gbyte メモリ
CPUマシン
Intel Xeon X5570@2.93GHz(L2 8M), 4Cores (8Threads) x 2
24Gbyte メモリ
Tesla M2050 x 2
1.15GHz GPU (448 Cores)
3Gbyte グローバルメモリ
48Kbyte / blockの共有メモリ
2011/11/19 24
- 26. サイバー系
ベンチマーク①
>var.nums <- c(1000,5000,10000,50000,1e+5,5e+5,1e+6,5e+6)
>for(i in 1:length(var.nums)){
A <- runif(var.nums[i]); B <- runif(var.nums[i])
+#CPUで計算
+System.time(cor(A, B), method=“kendall”)
+
+#GPUで計算
+System.time(rpuCor(A, B), method=“kendall”)
} ケンドールの順位相関係数計算時間
30000
25000
長いベクトル同士の相関係数 20000
を算出。戻り値は長さ1のベクトル
処理時間(秒)
約40倍高速化
15000
CPU
GPU
10000
5000
0
0 1000000 2000000 3000000 4000000 5000000 6000000
変数の数
2011/11/19 25
- 27. サイバー系
ベンチマーク②
>var.nums <- c(1000,5000,10000,50000)
>for(i in 1:length(var.nums)){
A <- matrix(runif(var.nums[i]*100), var.num(i), 100)
B <- matrix(runif(var.nums[i]*100), var.num[i], 100)
+#CPUで計算
+System.time(dist(A, B), method=“euclidean”)
+
+#GPUで計算
+System.time(rpuDist(A, B), method=“euclidean”) ユークリッド距離計算時間
} 300
250
長い行 x 100列のマトリックス同士
200
の距離を算出。
処理時間(秒)
戻り値はdistオブジェクト 150 約7~8倍高速化 CPU
(結構大きい) GPU
100
50
0
0 5000 10000 15000 20000 25000 30000 35000
行数(列数は100に固定)
2011/11/19 26
- 28. サイバー系
ベンチマーク③
>var.nums <- c(1000,5000,10000,50000)
>for(i in 1:length(var.nums)){
A <- matrix(runif(var.nums[i]*100), var.num(i), 100)
B <- matrix(runif(var.nums[i]*100), var.num[i], 100)
+#CPUで計算
d <- dist(A, B)
+System.time(hclust(d), method=“complete”)
+
+#GPUで計算
+System.time(rpuHclust(d), method=“complete”) 完全連結法階層クラスタリング計算時間
} 8000
7000
長い行 x 100列のマトリックス同士 6000
の距離を算出後階層クラスタリング。5000
処理時間(秒)
戻り値はhclustオブジェクト 約200~300倍高速化
4000
CPU
3000 GPU
2000
1000
0
0 5000 10000 15000 20000 25000 30000 35000
行数(列数は100に固定)
2011/11/19 27
- 29. サイバー系
ベンチマーク④
>var.nums <- c(1000,5000,10000,50000)
>for(i in 1:length(var.nums)){
A <- matrix(runif(var.nums[i]*100), var.num(i), 100)
+#CPUで計算
+System.time(svm(y=A[,1], x=A[,-1], scale=FALSE,
type="eps-regression"))
+
+#GPUで計算
+System.time(rpusvm(y=A[,1], x=A[,-1], scale=FALSE, ガウシアンカーネル利用SVM計算時間
type="eps-regression")) 3000
}
2500
CPU
長い行 x 100列のマトリックスを GPU
生成して、1列目を目的変数に 2000
処理時間(秒)
それ以外を説明変数としてsvmで 約5~20倍高速化
1500
モデルを構築。パラメータは
チューニングしていなくて 1000
デフォルト値を使用
500
0
0 50000 100000 150000 200000 250000
行数(列数は100に固定)
2011/11/19 28
- 30. サイバー系
明細
27時間使って1500円くらい
2011/11/19 29
- 31. サイバー系
(参考) gputoolsパッケージ
項目 説明
gpuCor 各種相関係数の計算
gpuCrossprod 行列のクロス積
gpuDist ベクトル間距離計算
gpuDistClust ベクトル間の距離と階層型クラスタリング計算
gpuFastICA 独立成分分析
gpuGlm 一般化線形モデル
gpuGranger ベクトルの階層型クラスタリングの実行
gpuLm 線形モデル
gpuMatMult 実行マトリックス乗算
gpuMi 相互情報をベースにした B スプライン
gpuQr マトリックスの QR 分解の推定
gpuSolve マトリックスベクトル式の解の推定
gpuSvd 特異値分解
gpuSvmPredict サポートベクターマシンスタイルの2値分類器
gpuSvmTrain データセットのサポートベクターマシンのトレイニング
gpuTcrossprod 転置行列のクロス積
gpuTtest T 検定推定
2011/11/19 30
- 32. サイバー系
最後に
これはなかなか使えるな。
メモリ使用量は少ないんだけどCPU時間がやたら長い処理に向く
SVMとか階層クラスタリングとか
ただし
Rpud(Rpudplus)もgputoolsも商用利用するには
作者からライセンスを購入して下さい。
2011/11/19 31