24
1 RにおけるHPC ~並列計算編~ Tokyo.R#11 2011/1/29 @sfchaos

R-hpc-1 TokyoR#11

  • Upload
    sfchaos

  • View
    4.980

  • Download
    0

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: R-hpc-1 TokyoR#11

1

RにおけるHPC~並列計算編~

Tokyo.R#112011/1/29@sfchaos

Page 2: R-hpc-1 TokyoR#11

2

アジェンダ

1. 自己紹介

2. HPCとは

3. 並列計算の例

4. まとめ

Page 3: R-hpc-1 TokyoR#11

3

1. 自己紹介

■ TwitterID: @sfchaos

■ 職業:コンサルタント

数年間,金融工学のモデル構築・データ解析

最近,大規模データ解析に着手(Hadoop, Mahout)

■ 学生時代の専攻は物理・応用数学(非線形力学系・カオス)

Page 4: R-hpc-1 TokyoR#11

4

■ High Performance Computing(高性能計算)

■ 単位時間内に多くの計算をすること(Wikipedia)

2. HPCとは

Page 5: R-hpc-1 TokyoR#11

5

■ High Performance Computing(高性能計算)

■ 単位時間内に多くの計算をすること(Wikipedia)

はやい!

おおい!

うまい!

Page 6: R-hpc-1 TokyoR#11

6

■ High Performance Computing(高性能計算)

■ 単位時間内に多くの計算をすること(Wikipedia)

はやい!

おおい!

計算速度

処理するデータの量

うまい! 技巧的なテクニックを使って(ただしRでは素晴らしいパッケージ群を使える)

Page 7: R-hpc-1 TokyoR#11

7

2.1 HPCを行うメリット

■ 複数のCPUを用いて計算することにより,計算時間を削減できる

デリバティブの価格のモンテカルロシミュレーション(金融工学)

計算時間 3.5分の1 !!

010

2030

4050

CPU1個 CPU2個 CPU4個

Page 8: R-hpc-1 TokyoR#11

8

■ 大規模なデータを管理,分析できる!

■ 例えば,アメリカの旅客機の発着データ

データサイズは約12GB(約1億2,300億フィールド × 29フィールド)

■ Rの標準機能だけを用いてこのようなデータを扱うのはほとんど不可能

■ そこで,専用のパッケージが開発されている

Page 9: R-hpc-1 TokyoR#11

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

10

■ 以下のような問題点がある

インタプリタなのでそれほど速くない

マルチCPUのコンピュータ環境でも基本的に1CPUで計算する

基本的にオンメモリで計算する

32ビット符号付き整数を用いているため,ベクトル,行列,リストなど

の要素数は最大2^31 - 1

このようなRのデメリットを補うためにHPCが必要

Page 11: R-hpc-1 TokyoR#11

11

2.3 HPCのジャンルと今回のターゲット

■ CRANのTaskViewの”HighPerformanceComputing”を見

ると,たくさん書いてあるが・・・

明示的な並列化

内部的な並列化 グリッドの利用 乱数

リソース管理とバッチ

スケジューリング

応用GPUの利用

多量メモリと実メモリ以上の

データ

コンパイルコードへのやさしい

インタフェースプロファイラ

Page 12: R-hpc-1 TokyoR#11

12

■ CRANのTaskViewの”HighPerformanceComputing”を見

ると,たくさん書いてありますが・・・

明示的な並列化

内部的な並列化 グリッドの利用 乱数

リソース管理とバッチ

スケジューリング

応用GPUの利用

多量メモリと実メモリ以上の

データ

コンパイルコードへのやさしい

インタフェースプロファイラ

とりあえず,今回は並列化(の一部)を眺めてみます

Page 13: R-hpc-1 TokyoR#11

13

3. 並列計算の例

■ 並列計算とは

ジョブを分割して,複数のCPUで処理すること

みんなで分担して仕事をすれば捗るよ,というノリ

■ 今回は

snowパッケージ

foreachパッケージ

を用いた例について紹介します(パッケージそのものの紹介や使い方は

スコープ外).

Page 14: R-hpc-1 TokyoR#11

14

3.1 snowパッケージの使用例

■ デリバティブの価格評価のためのモンテカルロシミュレーション(金融工

学)■ ノックアウトオプションの価格をモンテカルロ・シミュレーションにより求め

る.

Page 15: R-hpc-1 TokyoR#11

15

乱数を発生させて株価の時系列シナリオを

発生させる6080

100

120

140

160

180

time

株価

満期に得られる金額を計算する

Page 16: R-hpc-1 TokyoR#11

16

6080

100

120

140

160

180

time

株価

乱数を発生させて株価の時系列シナリオを

生成する 満期に得られる金額を計算する

乱数を発生させて株価の時系列シナリオを

発生させる

満期に得られる金額を計算する

Page 17: R-hpc-1 TokyoR#11

17

6080

100

120

140

160

180

time

株価

乱数を発生させて株価の時系列シナリオを

生成する 満期に得られる金額を計算する

乱数を発生させて株価の時系列シナリオを

発生させる

満期に得られる金額を計算する

独立な処理(並列で処理可能)

Page 18: R-hpc-1 TokyoR#11

18

6080

100

120

140

160

180

time

株価

Page 19: R-hpc-1 TokyoR#11

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

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

21

3.2 foreachパッケージを用いた例

■ RandomForest(集団学習)

■ 人工的に生成したデータを用いて,RandomForestのツリー生成を行う.

■ foreachパッケージを用いて,並列化する.

Page 22: R-hpc-1 TokyoR#11

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

23

4. まとめ

■ HPCとは「うまい」やり方を使って「はやく」「おおく」計算することです.

■ HPCにはいくつかのやり方がありますが,今回はsnowパッケージと

foreachパッケージを用いて,並列処理の効果を確認しました.

Page 24: R-hpc-1 TokyoR#11

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.