More Related Content

Slideshows for you(20)

RでGPU使ってみた

  1. RでGPU使ってみた Tokyo.R #19 和田 計也 サイバー系
  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