Upload
hoxom
View
2.522
Download
6
Embed Size (px)
Citation preview
R で超簡単に並列処理を書けるpforeachパッケージ
@hoxo_m
2015/07/18
自己紹介
• hoxo_m
• 某 ECサイトでデータ分析をやっています
• 作成パッケージ:
– pforeach (R の並列処理を超簡単に書く)
– SparkRext (SparkRを dplyrに近づける)
– dplyrr (dplyrの DB用ユーティリティー)
– lambdaR (R にラムダ式を導入する)
– easyRFM (RFM 分析を簡単に実行する)
まとめ
• for はバッドノウハウのかたまり
• apply ファミリーは初心者殺し
foreachを使おう!
まとめ
• for はバッドノウハウのかたまり
• apply ファミリーは初心者殺し
foreachを使おう!
スマン、ありゃウソだった
foreachのつらみ
foreachはつらい
• foreachの最大の特徴である並列化にはつらみがある
並列化バックエンドの選択
• いろいろあってつらい
–parallel
–snow
–multicore
–Rmpi
• R はここらへん混迷している
• どれを選べばいいかわからない
バックエンドの管理
• クラスタの作成・登録・停止がめんどい
パッケージの使用
• ループ内でパッケージを使用する場合、全て指定しなければならない
変数のエクスポート
• 変数を明示的にエクスポートしていないとエラーになる場合がある
参考:http://d.hatena.ne.jp/teramonagi/20140920/1411195147
%do% を%dopar% に変更
• 地味につらい。
• クラスタの作成などのコード変更をすべて正しく行っても、これを忘れていると並列化されない。
参考:http://d.hatena.ne.jp/teramonagi/20140923/1411427677
乱数の使用
• 並列実行の時の乱数の扱いには注意が必要
• バックエンドごとに違ったりする
• やり方は下記記事を参考のこと
– R の foreachで並列処理するときに乱数を固定する
• R ハイパフォーマンス本が詳しい
データフレームの扱い
• データフレームのイテレータを作るのが地味につらい
• iter(data, by = “row”)
• iter(data, by = “col”)
並列化
ごちゃごちゃ
foreachつらい
というわけで
作りました
pforeach
pforeachパッケージ
• R で超簡単に並列処理を書けるパッケージ
foreach
pforeach
pforeachパッケージ
• バックエンドの設定、パッケージの指定、変数のエクスポートなど、めんどくさいことは全部自動的にやってくれる
• 乱数の固定、並列/非並列の切り替え、データフレームの扱いなどを簡単に行う機能がある
バックエンドの選択
• foreachの並列化は分散処理が難しい
–マルチコア並列化に絞る
– R 標準の parallel パッケージがベスト
–古事記(Rハイパフォ本)にもそう書かれている
※分散並列化は Rhpcパッケージが良さそう
インストール
• pforeachのコードは GitHub 上で公開
https://github.com/hoxo-m/pforeach
• devtoolsをインストール(してない場合)
• pforeachのインストール
使い方
• foreachとほぼ同じ
• デフォルトで並列実行される
使い方
%do% が無いデフォルト結合は c
オプション
• foreachのオプションはすべて使用可能– .init
– .final
–などなど
• .combine の短縮版 .c– .c=list で foreachのデフォルト結合になる
• 下記記事に非常に良くまとめられている
– foreachについてまとめたい - J's blog
コア数の指定
• デフォルトで使用するコアは最大コア数
– detectCores() 関数で取得
• .cores オプションで変更可能
• .cores=-1 とすると最大コア数 -1 となる
乱数の固定
• シミュレーション結果を再現したい
• .seed オプションで乱数を固定
• 乱数の結果が毎回同じになる
並列化/非並列化の切り替え
• pforeachはデフォルトで並列実行
• デバッグ時などに非並列で実行したい
• 2 つの方法
– .parallel = FALSE とする
–npforeach() とする
データフレーム便利関数
• データフレームの一行 or 一列ごとにループを回したい
• rows(), cols()
適用例
ランダムフォレストの並列化
foreach
ランダムフォレストの並列化
pforeach
すっきり!!
まとめ
foreachパッケージ
• 並列化がつらい
pforeachパッケージ
• 並列化が超簡単に!
まとめ
• for はバッドノウハウのかたまり
• apply ファミリーは初心者殺し
• foreachはつらい
foreachを使おう!p
参考
• ブログ記事
– R で超簡単に並列処理を書けるパッケージpforeachを作った
–【超訳】foreachパッケージの使い方
– foreachについてまとめたい - J's blog
• 書籍
–福島真太朗『Rによるハイパフォーマンスコンピューティング』