始めてみよう CfnClusterでHPCクラスター

2018.07.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、吉井です。
いかがお過ごしでしょうか。

今回はCfnClusterを取り上げます。
CfnClusterは、HPC(ハイパフォーマンスコンピューティング)のワークロードを実行する環境を素早く簡単に作成出来るAWS製のツールです。

使いたい時に使いたい分だけコンピューティングリソースを作成し
計算が終わったら削除する、といった運用が可能です。

構成図

CfnClusterを使って以下のようなHPCクラスターをデプロイします。
左側の”作業ノード”はご自身の端末になります。

はじめに

以下は事前に作っておきます。

  • VPC
  • サブネット
  • ルートテーブル
  • インターネットゲートウェイ
  • IAMユーザー(※)
  • EC2 キーペア

(※)IAMユーザーにはAdministatorのポリシーをアタッチし、アクセスキーを発行しておきます。

CfnClusterの準備

CfnClusterインストール

作業ノードにCfnClusterをインストールします。
作業ノードのOSはLinux(Ubuntu)を想定しています。
CfnClusterはpythonで書かれています。まずはpythonをインストールしておきます。

$ sudo apt install python python-pip

CfnClusterをインストールします。
helpが表示されればOKです。

$ sudo pip install cfncluster

$ cfncluster --help
usage: cfncluster [-h] [--config CONFIG_FILE] [--region REGION] [--nowait]
                  {create,update,delete,start,stop,status,list,instances,configure,version}
                  ...
~~省略~~

CfnCluster初期設定

CfnCluster初期設定用のコマンドを実行し、ご自身の環境に合わせた値を入力します。

$ cfncluster configure
Cluster Template [default]: <クラスター名を入力>
AWS Access Key ID []: <Access Keyを入力>
AWS Secret Access Key ID []: <Secret Access Keyを入力>
Acceptable Values for AWS Region ID:
    ap-south-1
    eu-west-3
    eu-west-2
    eu-west-1
    ap-northeast-2
    ap-northeast-1
    sa-east-1
    ca-central-1
    ap-southeast-1
    ap-southeast-2
    eu-central-1
    us-east-1
    us-east-2
    us-west-1
    us-west-2
AWS Region ID []: <リージョンを入力>
VPC Name [public]: <CfnCluster設定ファイル内で定義する任意のVPC名を指定。実際のVPC名ではありませんのでご注意>
Acceptable Values for Key Name:
    your_keypair
Key Name []: <キーペア名を入力>
Acceptable Values for VPC ID:
    vpc_yourvpc
VPC ID []: <VPC IDを入力>
Acceptable Values for Master Subnet ID:
    subnet-yoursubnet1
    subnet-yoursubnet2
    subnet-yoursubnet3
Master Subnet ID []: <Subnet IDを入力>

ホームディレクトリに設定ファイルが出来ているはずです。

$ ls ~/.cfncluster/
config

CfnClusterの起動

クラスター作成

cfncluster create <クラスター名>を実行するとクラスターが作成されます。(10~15分程度要する)
今回は「default」というクラスター名を設定しています。ご自身の環境に合わせてクラスター名を指定してください。

$ cfncluster create default
Beginning cluster creation for cluster: default
Creating stack named: cfncluster-default
Status: cfncluster-default - CREATE_COMPLETE
MasterPublicIP: nn.nn.nn.nn
MasterPrivateIP: mm.mm.mm.mm
GangliaPublicURL: http://nn.nn.nn.nn/ganglia/
GangliaPrivateURL: http://mm.mm.mm.mm/ganglia/

裏側ではCloudFormationが走っています。
AWSマネジメントコンソールからCloudFormationを見るとスタックが出来ています。

クラスター状態確認

cfncluster statusコマンドで状態を確認します。

$ cfncluster status default
Status: CREATE_COMPLETE
MasterServer: RUNNING
MasterPublicIP: nn.nn.nn.nn
MasterPrivateIP: mm.mm.mm.mm
GangliaPublicURL: http://nn.nn.nn.nn/ganglia/
GangliaPrivateURL: http://mm.mm.mm.mm/ganglia/

cfncluster instancesコマンドでクラスター内のインスタンスを確認します。
今回の例ではマスターノード1台、計算ノード2台が起動していることが確認出来ます。

$ cfncluster instances default
MasterServer         i-xxxxxxxxxxxxxxxxx
ComputeFleet         i-xxxxxxxxxxxxxxxxx
ComputeFleet         i-xxxxxxxxxxxxxxxxx

テストジョブの実行

クラスターが出来たところでテストジョブを実行してみます。
マスターノードにsshで接続します。
/sharedというマウントポイントが出来ています。ここはNFSで計算ノードに共有されています。
全ノードへ見せたいデータ、例えば実行プログラムなどはここに配置します。
それでは、Hello Wolrdプログラムを作っていきましょう。

$ cd /shared
$ mkdir hw_work
$ cd hw_work
$ vi hellojob.sh
#!/bin/bash
sleep 30
echo "Hello World from $(hostname)"

Hello Worldプログラムをスケジューラーのキューに投入します。
qsub <プログラムパス>で投入、qstatでキューの状態確認です。

$ qsub hellojob.sh
Your job 1 ("hellojob.sh") has been submitted

$ qstat
job-ID  prior   name       user         state submit/start at     queue                          slots ja-task-ID
-----------------------------------------------------------------------------------------------------------------
      1 0.00000 hellojob.s ec2-user     qw    07/13/2018 09:38:23                                    1

ホームディレクトリに結果が出力されています。

$ cat ~/hellojob.sh.o1
Hello World from <計算ノードホスト名>

クラスターの停止

計算が終わったらクラスターを停止しておきます。
作業ノードから cfncluster stop コマンドを実行します。

$ cfncluster stop default
Stopping compute fleet : default

$ cfncluster instances default
MasterServer         i-xxxxxxxxxxxxxxxxx

計算ノードが停止しました。
cfncluster stopコマンドでは、マスターノードは停止しないのでご自身でシャットダウンします。

クラスターの削除

不要になったクラスターは削除します。
cfncluster deleteコマンドで削除出来ます。

$ cfncluster delete default
Deleting: default
Status: DynamoDBTable - DELETE_COMPLETE
Cluster deleted successfully.

最後に

ますは入門として初期設定でのクラスター作成~テストジョブ実行~削除までを試してみました。
インフラにそれほど詳しくない方でも簡単にHPCクラスターが実行出来そうです。

伸縮自在な HPC クラスターをデプロイする
CfnCluster
GitHub awslab/cfncluster