Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ChainerMNについて

3,857 views

Published on

Chainer Meetup #5のChainerMNの紹介スライド

Published in: Technology
  • Be the first to comment

ChainerMNについて

  1. 1. ChainerMNについて 鈴木 脩司 Preferred Networks, Inc. Chainer Meetup #05 2017/06/10
  2. 2. 今日のお話  ChainerMNとは?  ChainerMNの仕組み  ChainerMNの使い方 2
  3. 3. ChainerMNとは?
  4. 4. ChainerMNとは? Chainerによる学習を、分散処理によって高速化するための追加パッケージ 特徴 – Scalable  NVIDIA NCCLやCUDA-Aware MPIなどの最新技術より高い並列性能を 実現 – Flexible  Chainerの特徴の一つである、動的なネットワークも分散学習可能 – Easy  既存のChainerのコードに少し変更を加えれば利用可能 GitHubリポジトリ – https://github.com/chainer/chainermn 4
  5. 5. ChainerMNの仕組み
  6. 6. 分散学習の手法  データ並列 – データを分割して、複数のワーカーが並列に学習  モデル並列 – モデルを分割して、複数のワーカーが並列に学習 6 データ並列 モデル並列 ChainerMNはこちら
  7. 7. 学習イテレーション 7 通常のChainerによる学習 Forward Backward Optimize All-Reduce Forward Forward Forward Backward Backward Backward Optimize Optimize Optimize ChainerMNによる分散学習
  8. 8. All-Reduce  各ワーカーが持つ値を集計し、集計した結果を全ワーカーに配る処理  ChainerMNでは各ワーカーが持つ勾配𝑔𝑖から平均 𝑔を計算して配る 8 All-Reduce 𝑔0 = 1 𝑔1 = 2 𝑔2 = 3 𝑔 = 2 𝑔 = 2 𝑔 = 2
  9. 9. 9 詳細: https://chainer.org/general/2017/02/08/Performance-of-Distributed-Deep- Learning-Using-ChainerMN.html
  10. 10. ChainerMNの使い方
  11. 11. 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
  12. 12. 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
  13. 13. あれ、動かない?と思ったら・・・  ドキュメントの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 ...
  14. 14. 環境別のインストール方法の紹介記事  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 みなさま、ありがとうございます!
  15. 15. Chainerのコードを改良してChainerMNを使う手順  説明にはMNISTのサンプルを利用  完成コード – https://github.com/chainer/chainermn/blob/master/examples/mnist /train_mnist.py  最低限必要な変更点 1. Communicatorの作成と使用するGPUの指定 2. マルチノード用のOptimizerの作成  追加の変更 3. データの分配 4. マルチノード用のEvaluatorの作成15
  16. 16. 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()
  17. 17. 2. マルチノード用のOptimizerの作成  マルチノード用のOptimizerを以下のようにして作成 – ChainerのMNISTのサンプル: – ChainerMNのMNISTのサンプル: 17 optimizer = chainer.optimizers.Adam() optimizer = chainermn.create_multi_node_optimizer( chainer.optimizers.Adam(), comm)
  18. 18. 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)
  19. 19. 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)
  20. 20. 実行!  シングルノード実行 – 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
  21. 21. まとめ  ChainerMNとは – Chainerによる学習を、分散処理によって高速化するための追加パッケージ – 特徴  Scalable、Flexible、Easy – GitHubリポジトリ  https://github.com/chainer/chainermn  ChainerMNの使い方 – 最低限必要な変更点  Communicatorの作成と使用するGPUの指定  マルチノード用のOptimizerの作成 21

×