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