R-hpc-1 TokyoR#11

6,012 views

Published on

R-hpc-1 TokyoR#11

  1. 1. RにおけるHPC~並列計算編~ Tokyo.R#11 2011/1/29 @sfchaos 1
  2. 2. アジェンダ1. 自己紹介2. HPCとは3. 並列計算の例4. まとめ 2
  3. 3. 1. 自己紹介■ TwitterID: @sfchaos■ 職業:コンサルタント  数年間,金融工学のモデル構築・データ解析  最近,大規模データ解析に着手(Hadoop, Mahout)■ 学生時代の専攻は物理・応用数学(非線形力学系・カオス) 3
  4. 4. 2. HPCとは■ High Performance Computing(高性能計算)■ 単位時間内に多くの計算をすること(Wikipedia) 4
  5. 5. ■ High Performance Computing(高性能計算)■ 単位時間内に多くの計算をすること(Wikipedia) はやい! おおい! うまい! 5
  6. 6. ■ High Performance Computing(高性能計算)■ 単位時間内に多くの計算をすること(Wikipedia) はやい! 計算速度 おおい! 処理するデータの量 うまい! 技巧的なテクニックを 使って (ただしRでは素晴らし いパッケージ群を使え る) 6
  7. 7. 2.1 HPCを行うメリット■ 複数のCPUを用いて計算することにより,計算時間を削減できる 50 計算時間 3.5分の1 !! 40 30 20 10 0 CPU1個 CPU2個 CPU4個 デリバティブの価格の モンテカルロシミュレーション (金融工学) 7
  8. 8. ■ 大規模なデータを管理,分析できる!■ 例えば,アメリカの旅客機の発着データ  データサイズは約12GB(約1億2,300億フィールド × 29フィールド)■ Rの標準機能だけを用いてこのようなデータを扱うのはほとんど不可能■ そこで,専用のパッケージが開発されている 8
  9. 9. 2.2 なぜHPCが必要?■ 確かにRは便利な統計ツールだけど・・・ Average Yearly Sunspots 1750 1800 1850 1900 1950 150 spots 100 50 0 150 spots 100 50 0 1750 1800 1850 1900 1950 Year きれいなグラフ 豊富なパッケージ群 9
  10. 10. ■ 以下のような問題点がある  インタプリタなのでそれほど速くない  マルチCPUのコンピュータ環境でも基本的に1CPUで計算する  基本的にオンメモリで計算する  32ビット符号付き整数を用いているため,ベクトル,行列,リストなど の要素数は最大2^31 - 1 このようなRのデメリットを補うためにHPCが必要 10
  11. 11. 2.3 HPCのジャンルと今回のターゲット■ CRANのTaskViewの”HighPerformanceComputing”を見 ると,たくさん書いてあるが・・・ 明示的な 内部的な 乱数 並列化 並列化 グリッドの利用 GPUの 多量メモリと 応用 実メモリ以上の 利用 データ コンパイルコードへの リソース管理と やさしい プロファイラ バッチ インタフェース スケジューリング 11
  12. 12. ■ CRANのTaskViewの”HighPerformanceComputing”を見 ると,たくさん書いてありますが・・・ 明示的な 内部的な 乱数 並列化 並列化 グリッドの利用 GPUの 多量メモリと 応用 実メモリ以上の 利用 データ コンパイルコードへの リソース管理と やさしい プロファイラ バッチ インタフェース スケジューリング とりあえず,今回は並列化(の一部)を眺めてみます 12
  13. 13. 3. 並列計算の例■ 並列計算とは  ジョブを分割して,複数のCPUで処理すること  みんなで分担して仕事をすれば捗るよ,というノリ■ 今回は  snowパッケージ  foreachパッケージ を用いた例について紹介します(パッケージそのものの紹介や使い方は スコープ外). 13
  14. 14. 3.1 snowパッケージの使用例■ デリバティブの価格評価のためのモンテカルロシミュレーション(金融工 学)■ ノックアウトオプションの価格をモンテカルロ・シミュレーションにより求め る. 14
  15. 15. 180 160 140 120株価 満期に得られる 100 金額を計算する 80 乱数を発生させて 株価の時系列シナリオを 発生させる 60 15
  16. 16. 180 乱数を発生させて 160 株価の時系列シナリオを 生成する 満期に得られる 金額を計算する 140 120株価 満期に得られる 100 金額を計算する 80 乱数を発生させて 株価の時系列シナリオを 発生させる 60 16
  17. 17. 180 乱数を発生させて 160 株価の時系列シナリオを 生成する 満期に得られる 金額を計算する 140 独立な処理 120株価 (並列で処理可能) 満期に得られる 100 金額を計算する 80 乱数を発生させて 株価の時系列シナリオを 発生させる 60 17
  18. 18. 株価 60 80 100 120 140 160 180time 18
  19. 19. pricing.by.mc <- function(S0=100, K=100, B=90, r=0.06, sigma=0.10, T=1, M=52, N=4e5, type="knockout"){ # S0:原資産の現在価格 # K :権利公使価格 # T :満期 # M :時間方向のステップ数 # N :モンテカルロ・シミュレーション試行回数 # ノックアウトオプションはダウン・アンド・アウトのみを考慮 delta.t <- T/M # 時間方向の刻み幅 z <- matrix(rnorm(M * N), nrow=M) t <- replicate(N, 1:M)/M S <- S0 * exp((r - sigma^2/2) * t + sigma * sqrt(t) * apply(z, 2, cumsum)) if (type=="european") { mean(pmax(S[M,]-K, 0)) } else if (type=="knockout") { y <- apply(S-B, 2, function(x) if(any(x < 0)) 0 else max(x[M] - K, 0)) mean(y) }} 19
  20. 20. > system.time(print(mean(unlist(clusterCall(cl, pricing.by.mc)))))[1] 20.95214   ユーザ  システム 経過 snowパッケージを用いて 4CPUで並列処理 0.010 0.000 15.658> system.time(print(pricing.by.mc(N=1.2e6, type="knockout")))[1] 20.89554  ユーザ  システム 経過 51.350 3.580 55.039 1CPUのみ使用 50 計算時間 3.5分の1 !! 40 30 20 10 0 CPU1個 CPU2個 CPU4個 20
  21. 21. 3.2 foreachパッケージを用いた例■ RandomForest(集団学習)■ 人工的に生成したデータを用いて,RandomForestのツリー生成を行う.■ foreachパッケージを用いて,並列化する. 21
  22. 22. > library(foreach)> library(doSNOW)> library(randomForest)> # doSNOWパッケージを用いて並列化するための設定> cl ← makeSOCKcluster(4)> registerDoSNOW(cl)> # 人工的なデータを生成> x <- matrix(runif(20000), 4000)> y <- gl(2, 2000)> # 並列化を行わない場合> system.time(rf.simple <- randomForest(x, y, ntree=1000)) ユーザ システム 経過 5.380 0.070 5.456> # foreach,doSNOWを用いて並列化した場合> system.time(rf.fe <- foreach(ntree=rep(250, 4), .combine=combine,.packages="randomForest") %dopar% randomForest(x, y, ntree=ntree)) ユーザ システム 経過 1.32 0.19  3.11 22
  23. 23. 4. まとめ■ HPCとは「うまい」やり方を使って「はやく」「おおく」計算することです.■ HPCにはいくつかのやり方がありますが,今回はsnowパッケージと foreachパッケージを用いて,並列処理の効果を確認しました. 23
  24. 24. 参考文献■ 「Rを使ったハイパフォーマンスコンピューティング入門」,  統計数理研究所公開講座,2011年1月24日.■ “Introduction to High-Performance Computing with R”, Dirk Eddelbuettel, useR!2010.■ “Using The foreach Package”, Steve Weston, 2009/10/5. 24

×