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)かヘルプを参照してもらいたい。