R-hpc-1 TokyoR#11

Post on 15-Jan-2015

4.984 views 0 download

description

 

Transcript of R-hpc-1 TokyoR#11

1

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

Tokyo.R#112011/1/29@sfchaos

2

アジェンダ

1. 自己紹介

2. HPCとは

3. 並列計算の例

4. まとめ

3

1. 自己紹介

■ TwitterID: @sfchaos

■ 職業:コンサルタント

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

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

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

4

■ High Performance Computing(高性能計算)

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

2. HPCとは

5

■ High Performance Computing(高性能計算)

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

はやい!

おおい!

うまい!

6

■ High Performance Computing(高性能計算)

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

はやい!

おおい!

計算速度

処理するデータの量

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

7

2.1 HPCを行うメリット

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

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

計算時間 3.5分の1 !!

010

2030

4050

CPU1個 CPU2個 CPU4個

8

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

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

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

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

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

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

きれいなグラフ 豊富なパッケージ群

10

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

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

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

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

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

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

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

11

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

■ CRANのTaskViewの”HighPerformanceComputing”を見

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

明示的な並列化

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

リソース管理とバッチ

スケジューリング

応用GPUの利用

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

データ

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

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

12

■ CRANのTaskViewの”HighPerformanceComputing”を見

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

明示的な並列化

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

リソース管理とバッチ

スケジューリング

応用GPUの利用

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

データ

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

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

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

13

3. 並列計算の例

■ 並列計算とは

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

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

■ 今回は

snowパッケージ

foreachパッケージ

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

スコープ外).

14

3.1 snowパッケージの使用例

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

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

る.

15

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

発生させる6080

100

120

140

160

180

time

株価

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

16

6080

100

120

140

160

180

time

株価

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

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

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

発生させる

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

17

6080

100

120

140

160

180

time

株価

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

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

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

発生させる

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

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

18

6080

100

120

140

160

180

time

株価

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) }}

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個

21

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

■ RandomForest(集団学習)

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

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

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

23

4. まとめ

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

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

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

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.