SINGAのインストールについてはこちらをご覧ください。
SINGAのトレーニングは zookeeper を利用します。まずは zookeeper サービスが開始されていることを確認してください。
準備された thirdparty のスクリプトを使って zookeeper をインストールした場合、次のスクリプトを実行してください。
#goto top level folder cd SINGA_ROOT ./bin/zk-service.sh start
(./bin/zk-service.sh stop // zookeeper の停止).
デフォルトのポートを使用せずに zookeeper をスタートさせる時は、conf/singa.confを編集してください。
zookeeper_host: "localhost:YOUR_PORT"
スタンドアローンモードでSINGAを実行するとは、Mesos や YARN のようなクラスターマネージャー利用しない場合のことを言います。
1つのプロセスがローンチされます。 例として、 CIFAR-10 データセットを利用して CNN モデル をトレーニングさせます。 ハイパーパラメーターは、cuda-convnet に基づいて設定されてあります。 詳細は、CNN サンプル のページをご覧ください。
データセットのダウンロードと、Triaing や Test のためのデータシャードの生成は次のように行います。
cd examples/cifar10/ cp Makefile.example Makefile make download make create
Training と Test データセットは、それぞれ cifar10-train-shard と cifar10-test-shard フォルダーに作られます。 すべての画像の特徴平均を記述した image_mean.bin ファイルも作成されます。
CNN モデルのトレーニングに必要なソースコードはすべてSINGAに組み込まれています。コードを追加する必要はありません。 ジョブ設定ファイル (job.conf) を指定して、スクリプト(../../bin/singa-run.sh) を実行します。 SINGAのコードを変更、または追加する時は、プログラミングガイドをご覧ください。
Cluster Topology のデフォルト値は、1つの worker と 1つの server となっています。 データとニューラルネットの並列化はされません。
トレーニングを開始するには次のスクリプトを実行します。
# goto top level folder cd ../../ ./bin/singa-run.sh -conf examples/cifar10/job.conf
現在、起動中のジョブのリストを表示するには
./bin/singa-console.sh list JOB ID |NUM PROCS ----------|----------- 24 |1
ジョブの強制終了をするには
./bin/singa-console.sh kill JOB_ID
ログとジョブの情報は /tmp/singa-log フォルダーに保存されます。 conf/singa.conf ファイルの log-dirで変更可能です。
# job.conf ... cluster { nworker_groups: 2 nworkers_per_procs: 2 workspace: "examples/cifar10/" }
複数の worker グループをローンチすることによって、 In SINGA, 非同期トレーニング を実行することが出来ます。 例えば、job.conf を上記のように変更します。 デフォルトでは、1つの worker グループが1つの worker を持つよう設定されています。 上記の設定では、1つのプロセスに2つの worker が設定されているので、2つの worker グループが同じプロセスとして実行されます。 結果、インメモリ Downpour トレーニングフレームワークとして、実行されます。
ユーザーは、データの分散を気にする必要はありません。 ランダムオフセットに従い、各 worker グループに、データが振り分けられます。 各 worker は異なるデータパーティションを担当します。
# job.conf ... neuralnet { layer { ... sharddata_conf { random_skip: 5000 } } ... }
スクリプト実行:
./bin/singa-run.sh -conf examples/cifar10/job.conf
# job.conf ... cluster { nworkers_per_group: 2 nworkers_per_procs: 2 workspace: "examples/cifar10/" }
1つのworkerグループとして複数のworkerをローンチすることで 同期トレーニングを実行することが出来ます。 例えば、job.conf ファイルを上記のように変更します。 上記の設定では、1つの worker グループに2つの worker が設定されました。 worker 達はグループ内で同期します。 これは、インメモリ sandblaster として実行されます。 モデルは2つのworkerに分割されます。各レイヤーが2つのworkerに振り分けられます。 振り分けられたレイヤーはオリジナルのレイヤーと機能は同じですが、特徴インスタンスの数が B/g になります。 ここで、Bはミニバッチのインスタンスの数で、gはグループ内の worker の数です。 別のスキーム を利用したレイヤー(ニューラルネットワーク)パーティション方法もあります。
他の設定はすべて「並列化なし」の場合と同じです。
./bin/singa-run.sh -conf examples/cifar10/job.conf
クラスター設定を変更して、上記トレーニングフレームワークの拡張を行います。
nworker_per_procs: 1
すべてのプロセスは1つのworkerスレッドを生成します。 結果、worker 達は異なるプロセス(ノード)内で生成されます。 クラスター内のノードを特定するには、SINGA_ROOT/conf/ の hostfile の設定が必要です。
e.g.,
logbase-a01 logbase-a02
zookeeper location も設定する必要があります。
e.g.,
#conf/singa.conf zookeeper_host: "logbase-a01"
スクリプトの実行は「Single ノード トレーニング」と同じです。
./bin/singa-run.sh -conf examples/cifar10/job.conf
SINGAのコード変更や追加に関する詳細は、プログラミングガイド をご覧ください。