sbtを使ってDeeplearning4jをSpark上で動かす(ver: 0.4-rc3.9)
Deeplearning4j(DL4J)をSpark上で動かしたかったがいろいろ問題点があったのでメモ. 最終的には動かすことに成功した.
sparkアプリケーションを動かすには
- 一旦jarを作ってから
spark-submit
コマンドで利用する方法- sparkの環境が必要
- アプリケーションに埋め込んでスタンドアロンに利用する方法
- 事前にsparkの環境は必要ないがクラスタは利用できない
があるが, 今回は「とりあえず試したい」程度だったので後者を目標とした(ちなみにsetMaster
を調整してsbt package
すれば簡単に前者のアプローチへ移行可能).
既存の問題点
- 本記事のタイトル通り「sbtを使ってDL4JをSpark上で動かす時に使うプラグイン」として提供されている GitHub - deeplearning4j/dl4j-spark-ml が古い
- そのサンプル実装とされている https://github.com/deeplearning4j/dl4j-spark-ml-examples が謎の404
- とにかくドキュメントが少ない. 英語ですらほとんど見当たらない(sparkでdeeplearningとかやってる人多そうなのになんで…)
- 適当にやってみるとライブラリのバージョン地獄に嵌まる
動かす
あまりに動かなかったのでDL4Jのgitterで聞きつつ実装したところなんとか動かすことが出来た.
特に注意が必要だったところだけ列挙する
0.4-rc3.9
からnd4j-x86
は不要になり,nd4j-native
のみで良くなったnd4j-native
を利用するにはclasspathTypes
の指定と実行環境に合わせたclassifier
の設定が必須nd4j-native
とnd4j-cuda-7.5
は併用できないjackson-databind
のバージョン依存がどうしようもないのでdependencyOverrides
で固定する必要があるdl4j-spark
が依存しているspark-core
が古いのでexcludeする
(dl4j-spark-cdh5-examplesを参考にしたが互換大丈夫なのか確信が持てない…がこれをしないと依存解決できない)- 性質上
OutOfMemoryError
が出やすいのでヒープサイズを増やす必要がある- スタンドアロン(sbt)を利用 =>
sbt run
時に-mem
で大きめの値を指定する spark-submit
を利用 =>spark-submit
の--driver-memory
と--executor-memory
で大きめの値を指定する
- スタンドアロン(sbt)を利用 =>
どれか一つでも欠けているとコケるという…なかなかシビアである. 以下が作ったサンプルである. テストの内容は GitHub - deeplearning4j/dl4j-spark-cdh5-examples: Examples to run on CDH5 with Spark を参考にした. なお, CNNを利用するMNISTのサンプルはかなりのマシンパワーを利用するので注意が必要である.
分からなくなったら
ライブラリの特性上DL4JはND4Jと密に関係しているのでこちらも参照されたし. ダメそうならgitterで聞いてみると良い.