R で超簡単に並列処理を書けるpforeach パッケージ

38
R で超簡単に並列処理を書ける pforeach パッケージ @hoxo_m 2015/07/18

Transcript of R で超簡単に並列処理を書けるpforeach パッケージ

Page 1: R で超簡単に並列処理を書けるpforeach パッケージ

R で超簡単に並列処理を書けるpforeachパッケージ

@hoxo_m

2015/07/18

Page 2: R で超簡単に並列処理を書けるpforeach パッケージ

自己紹介

• hoxo_m

• 某 ECサイトでデータ分析をやっています

• 作成パッケージ:

– pforeach (R の並列処理を超簡単に書く)

– SparkRext (SparkRを dplyrに近づける)

– dplyrr (dplyrの DB用ユーティリティー)

– lambdaR (R にラムダ式を導入する)

– easyRFM (RFM 分析を簡単に実行する)

Page 4: R で超簡単に並列処理を書けるpforeach パッケージ

まとめ

• for はバッドノウハウのかたまり

• apply ファミリーは初心者殺し

foreachを使おう!

Page 5: R で超簡単に並列処理を書けるpforeach パッケージ

まとめ

• for はバッドノウハウのかたまり

• apply ファミリーは初心者殺し

foreachを使おう!

Page 6: R で超簡単に並列処理を書けるpforeach パッケージ

スマン、ありゃウソだった

Page 7: R で超簡単に並列処理を書けるpforeach パッケージ

foreachのつらみ

Page 8: R で超簡単に並列処理を書けるpforeach パッケージ

foreachはつらい

• foreachの最大の特徴である並列化にはつらみがある

Page 9: R で超簡単に並列処理を書けるpforeach パッケージ

並列化バックエンドの選択

• いろいろあってつらい

–parallel

–snow

–multicore

–Rmpi

• R はここらへん混迷している

• どれを選べばいいかわからない

Page 10: R で超簡単に並列処理を書けるpforeach パッケージ

バックエンドの管理

• クラスタの作成・登録・停止がめんどい

Page 11: R で超簡単に並列処理を書けるpforeach パッケージ

パッケージの使用

• ループ内でパッケージを使用する場合、全て指定しなければならない

Page 12: R で超簡単に並列処理を書けるpforeach パッケージ

変数のエクスポート

• 変数を明示的にエクスポートしていないとエラーになる場合がある

参考:http://d.hatena.ne.jp/teramonagi/20140920/1411195147

Page 13: R で超簡単に並列処理を書けるpforeach パッケージ

%do% を%dopar% に変更

• 地味につらい。

• クラスタの作成などのコード変更をすべて正しく行っても、これを忘れていると並列化されない。

参考:http://d.hatena.ne.jp/teramonagi/20140923/1411427677

Page 14: R で超簡単に並列処理を書けるpforeach パッケージ

乱数の使用

• 並列実行の時の乱数の扱いには注意が必要

• バックエンドごとに違ったりする

• やり方は下記記事を参考のこと

– R の foreachで並列処理するときに乱数を固定する

• R ハイパフォーマンス本が詳しい

Page 15: R で超簡単に並列処理を書けるpforeach パッケージ

データフレームの扱い

• データフレームのイテレータを作るのが地味につらい

• iter(data, by = “row”)

• iter(data, by = “col”)

Page 16: R で超簡単に並列処理を書けるpforeach パッケージ

並列化

ごちゃごちゃ

Page 17: R で超簡単に並列処理を書けるpforeach パッケージ

foreachつらい

Page 18: R で超簡単に並列処理を書けるpforeach パッケージ

というわけで

作りました

Page 19: R で超簡単に並列処理を書けるpforeach パッケージ

pforeach

Page 20: R で超簡単に並列処理を書けるpforeach パッケージ

pforeachパッケージ

• R で超簡単に並列処理を書けるパッケージ

foreach

pforeach

Page 21: R で超簡単に並列処理を書けるpforeach パッケージ

pforeachパッケージ

• バックエンドの設定、パッケージの指定、変数のエクスポートなど、めんどくさいことは全部自動的にやってくれる

• 乱数の固定、並列/非並列の切り替え、データフレームの扱いなどを簡単に行う機能がある

Page 22: R で超簡単に並列処理を書けるpforeach パッケージ

バックエンドの選択

• foreachの並列化は分散処理が難しい

–マルチコア並列化に絞る

– R 標準の parallel パッケージがベスト

–古事記(Rハイパフォ本)にもそう書かれている

※分散並列化は Rhpcパッケージが良さそう

Page 23: R で超簡単に並列処理を書けるpforeach パッケージ

インストール

• pforeachのコードは GitHub 上で公開

https://github.com/hoxo-m/pforeach

• devtoolsをインストール(してない場合)

• pforeachのインストール

Page 24: R で超簡単に並列処理を書けるpforeach パッケージ

使い方

• foreachとほぼ同じ

• デフォルトで並列実行される

Page 25: R で超簡単に並列処理を書けるpforeach パッケージ

使い方

%do% が無いデフォルト結合は c

Page 26: R で超簡単に並列処理を書けるpforeach パッケージ

オプション

• foreachのオプションはすべて使用可能– .init

– .final

–などなど

• .combine の短縮版 .c– .c=list で foreachのデフォルト結合になる

• 下記記事に非常に良くまとめられている

– foreachについてまとめたい - J's blog

Page 27: R で超簡単に並列処理を書けるpforeach パッケージ

コア数の指定

• デフォルトで使用するコアは最大コア数

– detectCores() 関数で取得

• .cores オプションで変更可能

• .cores=-1 とすると最大コア数 -1 となる

Page 28: R で超簡単に並列処理を書けるpforeach パッケージ

乱数の固定

• シミュレーション結果を再現したい

• .seed オプションで乱数を固定

• 乱数の結果が毎回同じになる

Page 29: R で超簡単に並列処理を書けるpforeach パッケージ

並列化/非並列化の切り替え

• pforeachはデフォルトで並列実行

• デバッグ時などに非並列で実行したい

• 2 つの方法

– .parallel = FALSE とする

–npforeach() とする

Page 30: R で超簡単に並列処理を書けるpforeach パッケージ

データフレーム便利関数

• データフレームの一行 or 一列ごとにループを回したい

• rows(), cols()

Page 31: R で超簡単に並列処理を書けるpforeach パッケージ

適用例

Page 32: R で超簡単に並列処理を書けるpforeach パッケージ

ランダムフォレストの並列化

foreach

Page 33: R で超簡単に並列処理を書けるpforeach パッケージ

ランダムフォレストの並列化

pforeach

すっきり!!

Page 34: R で超簡単に並列処理を書けるpforeach パッケージ

まとめ

Page 35: R で超簡単に並列処理を書けるpforeach パッケージ

foreachパッケージ

• 並列化がつらい

Page 36: R で超簡単に並列処理を書けるpforeach パッケージ

pforeachパッケージ

• 並列化が超簡単に!

Page 37: R で超簡単に並列処理を書けるpforeach パッケージ

まとめ

• for はバッドノウハウのかたまり

• apply ファミリーは初心者殺し

• foreachはつらい

foreachを使おう!p

Page 38: R で超簡単に並列処理を書けるpforeach パッケージ

参考

• ブログ記事

– R で超簡単に並列処理を書けるパッケージpforeachを作った

–【超訳】foreachパッケージの使い方

– foreachについてまとめたい - J's blog

• 書籍

–福島真太朗『Rによるハイパフォーマンスコンピューティング』