AWS ParallelCluster EFSマウント設定

AWS ParallelClusterにEFSをマウントする設定例を紹介します。
2020.08.21

ParallelClusterに共有ストレージをマウント

  • AWS ParallelClusterはAWSがサポートする、HPCクラスターの管理ツールです。
  • PallelClusterの共有ストレージとしてEFSを利用できます。
  • EFSを接続したParallelClusterの設定ファイルを紹介します。

何がうれしいのか

ParallelClusterのマスターノード(ジョブスケジューラ)がNFSサーバになっており、コンピュートノード(演算サーバ)にマウントされます。共有ストレージとして大量のデータの保存や、高頻度、高スループットのアクセスを求めるとマスターノードがボトルネックになります。それを解決するには専用の共有ストレージが必要になります。

マウントできる共有ストレージの種類

ParallelClusterにマウントできる共有ストレージは2種類あります。 当記事ではEFSの設定について触れます。

  1. EFS: フルマネージドのNFSファイルシステムのサービス
  2. FSx for Lustre: フルマネージドのHPC向け高性能共有ストレージサービス

共有ストレージの使い分け

EFS利用時の特徴・注意点

EFS詳細

下記のブログにまとまっておりますのでご覧ください。

EFSのマウント方法

ParallelClusterへEFSのマウント方法も2種類あります。 当記事では2の方法でEFSをマウントする設定について触れます。

  1. ParallelCluster作成時にEFSを新規作成し同時にマウント
  2. 事前にEFSを作成しておき、ParallelCluster作成時に既存EFSをマウント

1. EFS新規作成と同時にマウント

ParallelClusterのクラスター削除コマンド(pcluster delete)でEFSも同時に削除されます。クラスターの作り直す際には注意が必要です。pclusterコマンドからクラスターとして管理のEFSになります。

2. 既存のEFSマウント

EFSは単体で管理されるため、クラスター削除コマンドでEFSも削除されることはありません。

設定例

EFS作成

EFSをそのまま作るだけで大丈夫です。

ParallelClusterを起動するVPCを選択します。

完成です。

ファイルシステムIDをParallelClusterの設定ファイルで使います。例ではバーストモード設定ですがワークロードに応じて、プロビジョンド・スループットもご検討ください。

ParallelCluster設定ポイント

globalセクション

EFS設定を有効化にします。個人的にはここを書き忘れてマウントされなかったをよくやってます。

efs_settings = cluster_efs

efsセクション

  • efs_fs_idは作成EFSのID部分をそのまま入力
  • shared_dirはマスターノードと、コンピュートノードにEFSがマウントされるパスです
    • マスターノードとコンピュートノードで別のパスにマウントすることはできません
    • mnt/efsの表記で、/mnt/efsにマウントされます
[efs cluster_efs]
# EFS Setting
efs_fs_id = fs-1a02143b
shared_dir = mnt/efs

設定ファイル全文

構築する環境に合わせて適時変更してください。とくに下記の項目は環境に依存します。

  • key_name
  • s3_read_resource
  • post_install
  • vpc_id
  • master_subnet_id
  • compute_subnet_id
  • efs_fs_id

efs-config

[aws]
aws_region_name = ap-northeast-1

[global]
cluster_template = default
update_check = true
sanity_check = true

[aliases]
ssh = ssh {CFN_USER}@{MASTER_IP} {ARGS}

[cluster default]
key_name = sandbox-key
base_os = alinux2
scheduler = slurm
vpc_settings = custom

# Instance Type
master_instance_type = m6g.large
compute_instance_type = c6g.xlarge

# Use Spot Instance
cluster_type = spot

# Use Placemant Group
placement = compute
placement_group = DYNAMIC

# Cluster Size
maintain_initial_size = false
initial_queue_size = 0
max_queue_size = 4

# Enable CloudWatchLogs
cw_log_settings = cluster_log

# Enable EFS
efs_settings = cluster_efs

# S3 Setting
s3_read_resource = arn:aws:s3:::test-parallelcluster-ohmura/parallelcluster/*
post_install = s3://test-parallelcluster-ohmura/parallelcluster/postinstall.sh

# Tag
tags = { "Name" : "TestCluster" }

[vpc custom]
# VPC Setting
vpc_id = vpc-0d27a23447c01e156
master_subnet_id = subnet-07df3e71babd667be
compute_subnet_id = subnet-08b8dd5c25b414dd0
use_public_ips = true

[efs cluster_efs]
# EFS Setting
efs_fs_id = fs-1a02143b
shared_dir = mnt/efs

[cw_log cluster_log]
# CloudWatchLogs Setting
enable = true
retention_days = 30

ParallelCluster実行環境

> pcluster version
2.8.1

クラスター構築

クラスターを作成します。

> pcluster create efs-cluster -c efs-config
Beginning cluster creation for cluster: efs-cluster
Creating stack named: parallelcluster-efs-cluster
Status: parallelcluster-efs-cluster - CREATE_COMPLETE
MasterPublicIP: 18.176.30.98
ClusterUser: ec2-user
MasterPrivateIP: 10.1.11.113

マスターノードのマウント状況

マスターノードにSSH接続して確認しました。/mnt/efsにEFSがマウントされていますね。

$ df -h
Filesystem                                      Size  Used Avail Use% Mounted on
devtmpfs                                        3.8G     0  3.8G   0% /dev
tmpfs                                           3.9G     0  3.9G   0% /dev/shm
tmpfs                                           3.9G  484K  3.9G   1% /run
tmpfs                                           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/nvme0n1p1                                   25G  5.0G   21G  20% /
/dev/nvme0n1p128                                 10M  3.7M  6.3M  38% /boot/efi
/dev/nvme1n1                                     20G   45M   19G   1% /shared
fs-1a02143b.efs.ap-northeast-1.amazonaws.com:/  8.0E     0  8.0E   0% /mnt/efs
tmpfs                                           780M     0  780M   0% /run/user/1000

コンピュートノードのマウント状況

コンピュートノードは起動していないため、設定ファイルを変更し1台だけ常時起動状態にしてみましょう。

# Cluster Size
maintain_initial_size = true
initial_queue_size = 1

クラスターを更新します。tagを設定すると差分の確認ができず更新していいのか判断を委ねられます。

> pcluster update efs-cluster -c efs-config
Validating configuration file efs-config...
Retrieving configuration from CloudFormation for cluster efs-cluster...
Found Configuration Changes:

#    parameter              old value    new value
---  ---------------------  -----------  -----------------------
     [cluster default]
01   initial_queue_size     -            1
02   maintain_initial_size  -            True
03*  tags                   -            {'Name': 'TestCluster'}

Validating configuration update...
The requested update cannot be performed. Line numbers with an asterisk indicate updates requiring additional actions. Please review the details below:

#03
Update actions are not currently supported for the 'tags' parameter
How to fix:
Restore 'tags' value to '{}'. If you need this change, please consider creating a new cluster instead of updating the existing one.

In case you want to override these checks and proceed with the update please use the --force flag. Note that the cluster could end up in an unrecoverable state.
Update aborted.

変更内容に問題はないため--forceを追加して改めてクラスターの更新をかけます。 更新してもよいか聞かれるためyを入力します。

pcluster update efs-cluster -c efs-config --force
Validating configuration file efs-config...
Retrieving configuration from CloudFormation for cluster efs-cluster...
WARNING: Forced update applied. All safety checks will be skipped. Not all updates may be applied and your cluster may become unstable.
Found Configuration Changes:

#    parameter              old value    new value
---  ---------------------  -----------  -----------------------
     [cluster default]
01   initial_queue_size     -            1
02   maintain_initial_size  -            True
03   tags                   -            {'Name': 'TestCluster'}
Do you want to proceed with the update? - Y/N:y

Updating: efs-cluster
Calling update_stack
Status: parallelcluster-efs-cluster - UPDATE_COMPLETE

コンピュートノードにSSH接続して確認しました。こちらも/mnt/efsにEFSがマウントされていますね。

$ df -h
Filesystem                                                 Size  Used Avail Use% Mounted on
devtmpfs                                                   3.8G     0  3.8G   0% /dev
tmpfs                                                      3.9G     0  3.9G   0% /dev/shm
tmpfs                                                      3.9G  476K  3.9G   1% /run
tmpfs                                                      3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/nvme0n1p1                                              25G  5.0G   21G  20% /
/dev/nvme0n1p128                                            10M  3.7M  6.3M  38% /boot/efi
ip-10-1-11-113.ap-northeast-1.compute.internal:/home        25G  5.0G   21G  20% /home
ip-10-1-11-113.ap-northeast-1.compute.internal:/shared      20G   44M   19G   1% /shared
fs-1a02143b.efs.ap-northeast-1.amazonaws.com:/             8.0E     0  8.0E   0% /mnt/efs
ip-10-1-11-113.ap-northeast-1.compute.internal:/opt/slurm   25G  5.0G   21G  20% /opt/slurm
tmpfs                                                      783M     0  783M   0% /run/user/1000

Tips: EFSモード変更

バーストモードからスループットモードに切り替え方法

注意: 連続したモード変更はできません。24時間の空き時間が必要になります。

Q: ファイルシステムのプロビジョンドスループットはどのくらいの頻度で変更できますか?
よくある質問 - Amazon EFS | AWS

手順

対象のEFSを選択してから編集をクリック。

プロビジョニング済み にチェックをいれ、必要なスループット数を入力して変更を保存をクリック。

スループットモードが変更されました。

おわりに

先にEFSを作成してファイルシステムIDを設定ファイルに入力するだけなのでマウントは簡単ですね。

以上、コンサル部の大村@網走でした。

参考

efs/ section - AWS ParallelCluster