Section 11 並列化
Rはデフォルトでは並列化を行わない。parallelMap
パッケージをmlr
と合わせて使うことで、mlr
が既にサポートしている並列化機能を容易に有効化できる。parallelMap
は主要な並列化バックエンドの全てで動作する。例えばparallel
を使用したローカルでのマルチコアを利用した並列化、snow
パッケージを用いたソケットやMPIによるクラスタ、BatchJobs
パッケージを使用した一時的なSSHクラスタやハイパフォーマンスコンピューティング(SLURMやTorque/PBS、SGEやLSFなどのスケジューラによる)などが含まれる。
実際に行う作業は、parallelStart*
関数によりバックエンドを選択するだけだ。並列実行可能とマークされたループは自動的に並列化される。また、スクリプトの実行が終わったらparallelStop
を呼び出すのを忘れないようにしよう。
library(parallelMap)
parallelStartSocket(2)
$> Starting parallelization in mode=socket with cpus=2.
rdesc = makeResampleDesc("CV", iters = 3)
r = resample("classif.lda", iris.task, rdesc)
$> Exporting objects to slaves for mode socket: .mlr.slave.options
$> Mapping in parallel: mode = socket; cpus = 2; elements = 3.
$> [Resample] Aggr. Result: mmce.test.mean=0.02
parallelStop()
$> Stopped parallelization. All cleaned up.
LinuxかmacOSを使用している場合は、parallelStartMulticore
を代わりに使うことができる。
11.1 並列化レベル
並列化をきめ細かく制御するために、mlr
は異なる並列化レベルを提供している。例えば、ベンチマーク試験は例数が少ないので並列化しなくてよいが、リサンプリングは並列化したいという場合は、parallelStart*
関数を呼び出す際にlevel = "mlr.resample"
を指定すれば良い。現状、以下の並列化レベルがサポートされている。
parallelGetRegisteredLevels()
$> mlr: mlr.benchmark, mlr.resample, mlr.selectFeatures, mlr.tuneParams, mlr.ensemble
これらの詳細は?mlr::parallelization
で確認してほしい。
11.2 自作の学習器と並列化
ローカルで自作の学習器を実装した場合は、現状ではこれをスレーブとしてエクスポートする必要がある。たとえば並列化したリサンプリングで次のようなエラーが出た場合
no applicable method for 'trainLearner' applied to an object of class <自作の学習器名>
parallelStart
以後に次の文を実行すれば良い。
parallelExport("trainLearner.<自作の学習器名>", "predictLearner.<自作の学習器名>")
11.3 並列化の話はこれで終わりだ!
より詳しい話はparallelMapのチュートリアル(berndbischl/parallelMap: R package to interface some popular parallelization back-ends with a unified interface)かヘルプを参照してもらいたい。