AWS CloudFormationを使ったChainerMNの実行

Shingo Omura

2018-06-01 11:58:13

※本記事はChainer Blogの日本語訳です。

AWS CloudFormationInfrastructure As Code の実践を助けてくれるAWSサービスで、幅広いAWSリソースを、宣言的に設定ファイルに記述し、その設定ファイルから、AWS上のインフラストラクチャを自動的に生成したり、再生成できます。それによってAWS上のインフラストラクチャを手作業を自動化できます。

分散深層学習向けのインフラストラクチャの構築の作業負荷も大幅に軽減できます。EC2インスタンスを起動したり、必要なライブラリをインストール・設定したり、計算/通信性能の最適化設定を行ったりする作業を軽減できます。特に、ChainerMNにおいては、MPIクラスタを構築することが必要です。AWS CloudFormationはこの構築作業を自動化することができます。

本日、Chainer/ChainermNがプリインストールされたAMIChainerMN向けのクラスタを自動的に構築するためのCloudFormationテンプレートを公開しました。

この記事では、これらの利用方法とともに、自動構築されたクラスタ上でのChainerMNの実行方法について説明します。

 

Chainer AMI

Chainer AMI には Chainer/CuPy/ChainerMN, ChianerCV, ChainerRLといったChainerライブラリ群と CUDA-aware OpenMPI ライブラリがプリインストールされていいます。そのため、このイメージを利用すればGPUを搭載したAWS EC2 インスタンス上で簡単に高速に深層学習が実行できます。このイメージはAWS Deep Learning Base AMIを基にビルドされています。

Chainer AMIの最新バージョンは0.1.0で、同梱されているライブラリ群のバージョンは次のとおりです:

  • OpenMPI 2.1.3
    • CUDA 9向けにのみビルドされています
  • Chainerライブラリ群 (python, python3 両方の環境にインストールされています)
    • CuPy 4.1.0
    • Chainer 4.1.0
    • ChainerMN 1.3.0
    • ChainerCV 0.9.0
    • ChainerRL 0.3.0

 

CloudFormation Template For ChainerMN

このテンプレートは Chainer AMI を使って ChainerMN クラスタを自動的にAWS上に構築します。構築されるインフラストラクチャの概要は下記のとおりです。

  • クラスタが配置される VPC と Subnet (既存のVPC/Subnetを設定可能)
  • MPIプロセス起動時に利用するephemeralなssh鍵をクラスタ内で共有するための S3 バケット
  • クラスタが配置されるプレイスメントグループ(ネットワークスループット/レイテンシを最適化するため)
  • ChainerMNクラスタ
    • 1 台の マスター EC2 インスタンス
    • N (>=0) 台のワーカーインスタンス(AutoScalingGroup経由で起動されます)
    • MPIジョブ実行用の chainer ユーザ
    • MPIジョブ実行用の hostfile
  • (オプション) Amazon Elastic Filesystem (既存のFilesystemを設定可能)
    • このファイルシステムは各インスタンスに自動的にマウントされれます
  • 各種Security Group および IAM Role

Chaainer CFNの最新バージョンは0.1.0です。詳細なリソース定義についてはリリースされているテンプレートを参照してください。

先日公開した ChainerMN 1.3.0のブログで述べられている通り(英語)ChainerMN 1.3.0 の新機能である、ダブルバッファリング、 半精度浮動小数点数による All-Reduce を使えば、Infinibandが利用できないAWSであっても、ほぼ線形のスケーラビリティを期待できます。

 

CloudFromationテンプレート を使った ChainerMNクラスタ構築

ここでは、CloudFromationテンプレートを使ってChainerMNクラスタを構築する方法をstep-by-stepで説明します。

まず、下記のリンクから CloudFormationのページを開いて「次へ」をクリックしてください。

launch stack

「詳細の指定」画面では、スタック名、VPC/Subnet、クラスタ、EFSといった各種設定を入力できます。下記は 4 台の p3.16xlargeインスタンス(8 NVIDIA Tesla V100 GPUs/インスタンス) によって構成される ChainerMNクラスタを構築する設定例です(VPC, Subnet, EFS等はすべて新規作成)。

最後の確認画面では、Capabilities セクションにある、IAM Roleに関する同意をチェックする必要があります。この CloudFormation テンプレートではクラスタ内インスタンスに割り当てるためのIAM Roleを作成するためです。

しばらして、CloudFormationスタックの状態が CREATE_COMPLETE に遷移したら、クラスタは構築完了です。 スタックの出力セクションの ClusterMasterPublicDNS にマスターインスタンスの Public DNS が表示されます。

 

構築済みクラスタでのChainerMN ジョブ実行

クラスタ内インスタンスには、CloudFormationテンプレートのパラメータに設定したキーペアでログインが可能です。

ssh -i keypair.pem ubuntu@ec2-ww-xxx-yy-zzz.compute-1.amazonaws.com

クラスタ内のインスタンスは前述の [Chainer AMI][ChainerAMI] をつかって起動しているので、必要なライブラリ群はすべてインストール済みです。あとは、自身の学習用のコードとデータをダウンロードするだけです。

# switch user to chainer
ubuntu@ip-ww-xxx-yy-zzz$ sudo su chainer

# download ChainerMN's train_mnist.py into EFS
chainer@ip-ww-xxx-yy-zzz$ wget \
  https://raw.githubusercontent.com/chainer/chainermn/v1.3.0/examples/mnist/train_mnist.py \
  -O /efs/train_mnist.py

これで実行準備完了です。mpiexecコマンドを使ってChainerMNをつかったMNISTの例を実行できます。

# 4インスタンス上で合計32プロセス(-nオプション)を起動(8 プロセス/インスタンス(-N オプション))
chainer@ip-ww-xxx-yy-zzz$ mpiexec -n 32 -N 8 python /efs/train_mnist.py -g
...(you will see ssh warning here)
==========================================
Num process (COMM_WORLD): 32
Using GPUs
Using hierarchical communicator
Num unit: 1000
Num Minibatch-size: 100
Num epoch: 20
==========================================
epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time
1 0.795527 0.316611 0.765263 0.907536 4.47915
...
19 0.00540187 0.0658256 0.999474 0.979351 14.7716
20 0.00463723 0.0668939 0.998889 0.978882 15.2248

# 注意: 上記実行例は2回めの実行例です。(初回実行時はサンプルデータのダウンロードが行われます)

 

 

Leave a Reply