狠狠撸

狠狠撸Share a Scribd company logo
颁丑补颈苍别谤惭狈について
鈴木 脩司
Preferred Networks, Inc.
Chainer Meetup #05
2017/06/10
今日のお話
? 颁丑补颈苍别谤惭狈とは?
? 颁丑补颈苍别谤惭狈の仕组み
? 颁丑补颈苍别谤惭狈の使い方
2
颁丑补颈苍别谤惭狈とは?
颁丑补颈苍别谤惭狈とは?
Chainerによる学習を、分散処理によって高速化するための追加パッケージ
特徴
– Scalable
? NVIDIA NCCLやCUDA-Aware MPIなどの最新技術より高い並列性能を
実現
– Flexible
? Chainerの特徴の一つである、動的なネットワークも分散学習可能
– Easy
? 既存のChainerのコードに少し変更を加えれば利用可能
GitHubリポジトリ
– https://github.com/chainer/chainermn
4
颁丑补颈苍别谤惭狈の仕组み
分散学習の手法
? データ並列
– データを分割して、複数のワーカーが並列に学習
? モデル並列
– モデルを分割して、複数のワーカーが並列に学習
6
データ並列 モデル並列
ChainerMNはこちら
学習イテレーション
7
通常のChainerによる学習
Forward Backward Optimize
All-Reduce
Forward
Forward
Forward
Backward
Backward
Backward
Optimize
Optimize
Optimize
ChainerMNによる分散学習
All-Reduce
? 各ワーカーが持つ値を集計し、集計した結果を全ワーカーに配る処理
? ChainerMNでは各ワーカーが持つ勾配??から平均 ?を計算して配る
8
All-Reduce
?0 = 1
?1 = 2
?2 = 3
? = 2
? = 2
? = 2
9
詳細: https://chainer.org/general/2017/02/08/Performance-of-Distributed-Deep-
Learning-Using-ChainerMN.html
颁丑补颈苍别谤惭狈の使い方
ChainerMNに必要なライブラリ (GPUを利用する場合)
1. Chainer
– CuPyとcuDNN も含めてインストールする
2. MPI (OpenMPIなど)
– CUDA-Awareのサポートを入れてコンパイルする
3. NVIDIA NCCL
– CUDA 8.0より前のバージョンのCUDAを利用する場合は、makeのときに
NVCC_GENCODEを指定する必要がある
4. MPI4py
5. Cython
– 事前にpipなどでインストールする必要がある
11
CPUのみの場合は以下を参照
http://chainermn.readthedocs.io/en/latest/installation/guide.html
ChainerMNのインストールとサンプル実行(GPUを利用する場合)
? インストール方法
– pip install chainermn
? MNISTのサンプルの実行
– git clone git@github.com:chainer/chainermn.git
– cd chainermn
– mpiexec -n 4 python examples/mnist/train_mnist.py –g
? この例では1つのノードで4つのワーカーが起動して、4つのGPUを使って分散学
習が実行される
12
あれ、動かない?と思ったら???
? ドキュメントのStep-by-Step Troubleshootingを見る!
– http://chainermn.readthedocs.io/en/latest/installation/troubleshooti
ng.html
? Step-by-Step TroubleshootingはChainerMNを使うときにハマりそう
な部分を、1つ1つ問題がないか確認していく手順が書かれている
– たとえば???
? Check SSH connection
13
$ ssh host00 'hostname'
host00 # without hitting the password
$ ssh host01 'hostname'
host01 # without hitting the password
...
環境別のインストール方法の紹介記事
? AWSのGPUインスタンスでChainerMNを動かす環境構築
– http://qiita.com/pst-ic/items/e01033dee4d389df3a5e
? 共用環境向けのChainerMNのインストール
– http://qiita.com/htsst/items/a38d4e09d05c2ef80242
? Chainermn をTSUBAME2.5にインストール
– http://graphium.hatenadiary.jp/entry/2017/06/06/012502
14
みなさま、ありがとうございます!
Chainerのコードを改良してChainerMNを使う手順
? 説明にはMNISTのサンプルを利用
? 完成コード
– https://github.com/chainer/chainermn/blob/master/examples/mnist
/train_mnist.py
? 最低限必要な変更点
1. Communicatorの作成と使用するGPUの指定
2. マルチノード用のOptimizerの作成
? 追加の変更
3. データの分配
4. マルチノード用のEvaluatorの作成15
1. Communicatorの作成と使用するGPUの指定
? Communicatorの作成
– 高い並列性能を実現するためには計算機環境に合わせてCommunicatorを
選択する必要がある。詳しくは以下を参照
? https://chainermn.readthedocs.io/en/latest/reference/index.html#communicators
? プロセスが使用するGPUを指定
– ChainerのMNISTのサンプル:
– ChainerMNのMNISTのサンプル:
16
# args.gpu: 使用するGPUのID
chainer.cuda.get_device(args.gpu).use()
# comm.intra_rank:マシン内におけるワーカーの番号
device = comm.intra_rank
chainer.cuda.get_device(device).use()
comm = chainermn.create_communicator()
2. マルチノード用のOptimizerの作成
? マルチノード用のOptimizerを以下のようにして作成
– ChainerのMNISTのサンプル:
– ChainerMNのMNISTのサンプル:
17
optimizer = chainer.optimizers.Adam()
optimizer = chainermn.create_multi_node_optimizer(
chainer.optimizers.Adam(), comm)
3.データの分配
? 2.までの状態では、1つのワーカーだけで改良前と同じサイズのデータを学習
– このため、Chainerのサンプルよりも1エポックの合計の大きさが、ワーカー数倍増加
? 1エポックを改良前と同じ大きさにするために、1つのワーカーがデータの読み
込みを行い、全ワーカーに分割して配る
– ChainerのMNISTのサンプル:
– ChainerMNのMNISTのサンプル:
18
train, test = chainer.datasets.get_mnist()
if comm.rank == 0: # rank 0 のワーカーが読み込み
train, test = chainer.datasets.get_mnist()
else:
train, test = None, None
# データを分割して配る
train = chainermn.scatter_dataset(train, comm)
test = chainermn.scatter_dataset(test, comm)
4. マルチノード用のEvaluatorの作成
? マルチノード用のEvaluatorを以下のように作成
– ChainerのMNISTのサンプル:
– ChainerMNのMNISTのサンプル:
– 注意
? PrintReportなどのExtensionは1つのワーカーだけ実行するようする
19
trainer.extend(extensions.Evaluator(test_iter, model, device=args.gpu))
evaluator = extensions.Evaluator(test_iter, model, device=device)
evaluator = chainermn.create_multi_node_evaluator(evaluator, comm)
trainer.extend(evaluator)
実行!
? シングルノード実行
– mpiexec -n 4 python train_mnist.py –g
? 1つのノードで4つのワーカーを立ち上げ、4個のGPUを使って分散学習を行う
? マルチノード実行
– mpiexec -n 8 -host host00,host01 python train_mnist.py –g
? host00,host01 という2つのノードで、4つずつワーカーが立ち上げ、
合計8個のGPUを使って分散学習を行う
20
まとめ
? ChainerMNとは
– Chainerによる学習を、分散処理によって高速化するための追加パッケージ
– 特徴
? Scalable、Flexible、Easy
– GitHubリポジトリ
? https://github.com/chainer/chainermn
? 颁丑补颈苍别谤惭狈の使い方
– 最低限必要な変更点
? Communicatorの作成と使用するGPUの指定
? マルチノード用のOptimizerの作成
21

More Related Content

颁丑补颈苍别谤惭狈について