Your SlideShare is downloading. ×
R-hpc-1 TokyoR#11
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

R-hpc-1 TokyoR#11

5,025
views

Published on


0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,025
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
39
Comments
0
Likes
5
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. RにおけるHPC~並列計算編~ Tokyo.R#11 2011/1/29 @sfchaos 1
  • 2. アジェンダ1. 自己紹介2. HPCとは3. 並列計算の例4. まとめ 2
  • 3. 1. 自己紹介■ TwitterID: @sfchaos■ 職業:コンサルタント  数年間,金融工学のモデル構築・データ解析  最近,大規模データ解析に着手(Hadoop, Mahout)■ 学生時代の専攻は物理・応用数学(非線形力学系・カオス) 3
  • 4. 2. HPCとは■ High Performance Computing(高性能計算)■ 単位時間内に多くの計算をすること(Wikipedia) 4
  • 5. ■ High Performance Computing(高性能計算)■ 単位時間内に多くの計算をすること(Wikipedia) はやい! おおい! うまい! 5
  • 6. ■ High Performance Computing(高性能計算)■ 単位時間内に多くの計算をすること(Wikipedia) はやい! 計算速度 おおい! 処理するデータの量 うまい! 技巧的なテクニックを 使って (ただしRでは素晴らし いパッケージ群を使え る) 6
  • 7. 2.1 HPCを行うメリット■ 複数のCPUを用いて計算することにより,計算時間を削減できる 50 計算時間 3.5分の1 !! 40 30 20 10 0 CPU1個 CPU2個 CPU4個 デリバティブの価格の モンテカルロシミュレーション (金融工学) 7
  • 8. ■ 大規模なデータを管理,分析できる!■ 例えば,アメリカの旅客機の発着データ  データサイズは約12GB(約1億2,300億フィールド × 29フィールド)■ Rの標準機能だけを用いてこのようなデータを扱うのはほとんど不可能■ そこで,専用のパッケージが開発されている 8
  • 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. ■ 以下のような問題点がある  インタプリタなのでそれほど速くない  マルチCPUのコンピュータ環境でも基本的に1CPUで計算する  基本的にオンメモリで計算する  32ビット符号付き整数を用いているため,ベクトル,行列,リストなど の要素数は最大2^31 - 1 このようなRのデメリットを補うためにHPCが必要 10
  • 11. 2.3 HPCのジャンルと今回のターゲット■ CRANのTaskViewの”HighPerformanceComputing”を見 ると,たくさん書いてあるが・・・ 明示的な 内部的な 乱数 並列化 並列化 グリッドの利用 GPUの 多量メモリと 応用 実メモリ以上の 利用 データ コンパイルコードへの リソース管理と やさしい プロファイラ バッチ インタフェース スケジューリング 11
  • 12. ■ CRANのTaskViewの”HighPerformanceComputing”を見 ると,たくさん書いてありますが・・・ 明示的な 内部的な 乱数 並列化 並列化 グリッドの利用 GPUの 多量メモリと 応用 実メモリ以上の 利用 データ コンパイルコードへの リソース管理と やさしい プロファイラ バッチ インタフェース スケジューリング とりあえず,今回は並列化(の一部)を眺めてみます 12
  • 13. 3. 並列計算の例■ 並列計算とは  ジョブを分割して,複数のCPUで処理すること  みんなで分担して仕事をすれば捗るよ,というノリ■ 今回は  snowパッケージ  foreachパッケージ を用いた例について紹介します(パッケージそのものの紹介や使い方は スコープ外). 13
  • 14. 3.1 snowパッケージの使用例■ デリバティブの価格評価のためのモンテカルロシミュレーション(金融工 学)■ ノックアウトオプションの価格をモンテカルロ・シミュレーションにより求め る. 14
  • 15. 180 160 140 120株価 満期に得られる 100 金額を計算する 80 乱数を発生させて 株価の時系列シナリオを 発生させる 60 15
  • 16. 180 乱数を発生させて 160 株価の時系列シナリオを 生成する 満期に得られる 金額を計算する 140 120株価 満期に得られる 100 金額を計算する 80 乱数を発生させて 株価の時系列シナリオを 発生させる 60 16
  • 17. 180 乱数を発生させて 160 株価の時系列シナリオを 生成する 満期に得られる 金額を計算する 140 独立な処理 120株価 (並列で処理可能) 満期に得られる 100 金額を計算する 80 乱数を発生させて 株価の時系列シナリオを 発生させる 60 17
  • 18. 株価 60 80 100 120 140 160 180time 18
  • 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. > 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. 3.2 foreachパッケージを用いた例■ RandomForest(集団学習)■ 人工的に生成したデータを用いて,RandomForestのツリー生成を行う.■ foreachパッケージを用いて,並列化する. 21
  • 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. 4. まとめ■ HPCとは「うまい」やり方を使って「はやく」「おおく」計算することです.■ HPCにはいくつかのやり方がありますが,今回はsnowパッケージと foreachパッケージを用いて,並列処理の効果を確認しました. 23
  • 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