バーチャル富岳に触ってみる(AWS上でスパコン)
会社のハッカソンイベで、バーチャル富岳を試します。
バーチャル富岳
公式ドキュメントが雑。。。
下記の手順で「プライベート富岳」の環境を構築する
1. AWSのEC2インスタンス作成
2. ParallelClusterのインストール
3. ParallelClusterでクラスタを作成するための定義ファイルの作成
4. クラスタの作成
5. Singularityのインストール
6. アプリの実行
パラレルクラスター使うっぽい
Singularityはスパコン用のdockerと考えれば良い?
AIにきいてみた。
申し訳ありません。先ほどは違う文脈のSingularityについて説明してしまいました。
Singularity CE(Community Edition)は、コンテナ技術を使用したHPC(High Performance Computing)向けのコンテナプラットフォームです。以下が主な特徴です:
1. 主な機能:
- HPCワークロード用に最適化されたコンテナ実行環境
- rootless実行が可能
- 既存のDockerコンテナとの互換性
- セキュアなコンテナ実行環境の提供
2. 利点:
- スーパーコンピュータでの使用に適している
- 再現性の高い実行環境の構築が可能
- 科学計算やHPC環境での移植性が高い
- セキュリティが強化されている
3. 使用例:
```bash
# コンテナイメージのビルド
singularity build mycontainer.sif docker://ubuntu:latest
# コンテナの実行
singularity run mycontainer.sif
# シェルアクセス
singularity shell mycontainer.sif
- 特徴的な機能:
- SIFファイルフォーマットの採用
- GPUサポート
- MPI(Message Passing Interface)のサポート
- 既存のHPCスケジューラとの統合
Singularity CEについて、具体的に知りたい点はありますか?例えば、インストール方法や特定のユースケースなど、お教えできます。
ドキュメント、この記載だけでEC2作れとは、、、
スペックやAMIは?
EC2はとりあえず、Ubuntuで適当に立てた。
パラレルクラスタのインストール手順
つんだ
$ python3 -m pip install --upgrade pip
/usr/bin/python3: No module named pip
Ubuntuにしたのでpipインストールで苦戦。。。Amazon Linuxにするべきだった?
やっぱりドキュメントにAMIの指定くらいは書いて欲しい!
なんとかpipとvenvを入れて、仮想環境に入って、パラレルクラスタをインストール。
python3 -m pip install --upgrade "aws-parallelcluster"
インストールできた
$ pcluster version
{
"version": "3.11.1"
}
定義ファイル作成が、AWSへのリンクしかない。。。
このドキュメント、めっちゃ不親切では。。。
サンプル
これベースに最小限の設定でいける?
いや、それでもクソ面倒くさいのだが。。。
シングルAZとマルチAZどちらがよいかをAIに聞いてみた
はい、これまでのやり取りを精査して、シングルAZのメリット・デメリットを改めて整理します。
シングルAZの構成:
```yaml
SubnetIds:
- subnet-123abc # 単一AZ
ComputeResources:
Instances:
- InstanceType: c6gn.16xlarge
```
メリット:
1. ネットワークパフォーマンス:
```plaintext
- 低レイテンシ(〜0.1-0.3ms)
- 高帯域幅(最大100 Gbps)
- ノード間の直接通信が効率的
```
2. コスト効率:
```plaintext
- AZ間データ転送コストが発生しない
- ネットワーク利用料金の最適化
```
3. シンプルな構成:
```plaintext
- ネットワーク設計がシンプル
- 構成管理が容易
- トラブルシューティングが容易
```
デメリット:
1. AZ障害時のリスク:
```plaintext
- システム全体が影響を受ける
- フェイルオーバー先がない
- サービス継続性への影響大
```
2. インフラストラクチャの制約:
```plaintext
- 単一障害点(SPOF)となる
- 障害発生時の代替手段が限定的
```
特に適したワークロード:
```plaintext
1. HPC密結合計算:
- MPI通信を多用する計算
- レイテンシ重視の処理
- ノード間通信が頻繁な処理
2. リアルタイム処理:
- 低レイテンシが必要な処理
- 即時性が求められる計算
```
重要な考慮点:
1. 可用性要件:
```plaintext
- 業務クリティカル度
- 許容可能なダウンタイム
- リカバリ要件
```
2. パフォーマンス要件:
```plaintext
- レイテンシ要件
- スループット要件
- ノード間通信パターン
```
結論:
- HPCワークロードの特性に基づいて選択すべき
- 密結合計算では、シングルAZが最適な選択
- 可用性よりもパフォーマンスを重視する場合はシングルAZ
- ミッションクリティカルな要件がある場合は可用性も考慮
これまでの議論を通じて、特にHPC向けのバーチャル富岳のような環境では、パフォーマンスの観点からシングルAZの構成が望ましいことが明確になりました。
最小で作るにしても、鍵とかサブネットとか事前に用意しないといけないの面倒くさい。。。
Image:
Os: alinux2
HeadNode:
InstanceType: t2.micro
Networking:
SubnetId: subnet-12345678
Ssh:
KeyName: ec2-key-name
Scheduling:
Scheduler: slurm
SlurmQueues:
- Name: queue1
Networking:
SubnetIds:
- subnet-12345678
ComputeResources:
- Name: compute-resource1
InstanceType: c5.2xlarge
権限設定面倒くせぇ。。。
ここでつまりたくないので、本当はよくないけどこれで。。。
設定ファイル作る
pcluster configure --config config-file.yaml
できた。
Region: ap-northeast-1
Image:
Os: alinux2
HeadNode:
InstanceType: t2.micro
Networking:
SubnetId: subnet-xxxxxx
Ssh:
KeyName: parallelCluster
Scheduling:
Scheduler: slurm
SlurmQueues:
- Name: queue1
ComputeResources:
- Name: c52xlarge
Instances:
- InstanceType: c5.2xlarge
MinCount: 0
MaxCount: 10
Networking:
SubnetIds:
- subnet-xxxxxx
クラスタ作る
pcluster create-cluster --cluster-name test-cluster --cluster-configuration cluster-config.yaml
作られ中
ヘッドノード出来てる
AWS PCSには出てこないけど、これでこれは問題ない?
CFn上だとこれが終わらないけど、何を待っている?
これっぽい。ダメそう。。。
こんなマイナーな情報残しておいてくれた人に感謝。
時間的に続きは午後で。。。
ちゃんと書いてあった。
The VPC uses an existing subnet that supports public IP addresses.
英語を適当に読み飛ばし過ぎた。
ロールバック中...
↓
Route53が遅い!!
一旦きれいに消す。
pcluster delete-cluster --cluster-name hackathon-parallelcluster
再実行
pcluster create-cluster --cluster-configuration ./slurm-gen.yaml --cluster-name hackathon-parallelcluster --region ap-northeast-1
CREATE_COMPLETE !!
次はSingularityのインストール
ドキュメントにSingularityのインストール先が書いてないけど、たぶん新たに作られたHeadNodeだと思われる。。。
HeadNodeにログイン
$ pcluster ssh -n hackathon-parallelcluster -i parallelCluster
Singularityドキュメント。
Amazon Linuxなので、apt-getをyumに読み替えながら実行。。。バーチャル富岳のドキュメント不親切すぎやろ。なんで各ツールへのリンクしか貼ってないのだ。。。
goをインストールする。ドキュメントには色々書いてあるけど、yumで入れてしまう。
sudo yum install -y golang
ビルド中。
$ ./mconfig && \
make -C ./builddir && \
sudo make -C ./builddir install
Singularityのビルドが必要なのであれば、t2.micro
はスペック低すぎだったかも。。。
バーチャル富岳のドキュメントに、何か書いておいて欲しい!!
→ なぜかビルドよりインストールにCPU使われてて草
はああああああああ。ARMならドキュメントにそう書いておけよ!!!
クラスタ作り直しじゃないか!!!
$ singularity pull library://riken-rccs/virtual-fugaku/vf-ver1
FATAL: While pulling library image: error fetching image: image does not exist in the library: riken-rccs/virtual-fugaku/vf-ver1:latest (amd64)
理研、まともなドキュメントを作れ!!!
いや確かにWebページには、 Arm アーキテクチャベースの CPU の AWS Graviton を用いたクラウドサービスを提供するアマゾン・ウェブ・サービス(AWS)
って書いてありますね。
でも、ドキュメントに書けよ!!
設定ファイル書き換えて再実行!!!
なおc8gは新しすぎるからか使えなかったのでc7g
Region: ap-northeast-1
Image:
Os: alinux2
HeadNode:
InstanceType: t4g.micro
Networking:
SubnetId: subnet-xxxxxxx
Ssh:
KeyName: parallelCluster
Scheduling:
Scheduler: slurm
SlurmQueues:
- Name: queue1
ComputeResources:
- Name: c72xlarge
Instances:
- InstanceType: c7g.2xlarge
MinCount: 0
MaxCount: 10
Networking:
SubnetIds:
- subnet-xxxxxx
pcluster create-cluster --cluster-configuration ./slurm-gen.yaml --cluster-name hackathon-parallelcluster --region ap-northeast-1
動いた!!
設定値の関係性が分からん。AI君ありがとう。
- ジョブ全体のタスク数
ntasks ≤ nodes × ntasks-per-node
- ノードあたりのコア利用
ntasks-per-node × cpus-per-task ≤ 利用可能なコア数(c7g.2xlargeの場合8)
- 総コア数の計算
総使用コア数 = nodes × ntasks-per-node × cpus-per-task
- AIによる図
スパコンのタスクの設定が分からんので図にした。
コンピュートノードにsingularityが必要じゃん!!!
ドキュメントに書いておけよ!!!
--------------------------------------------------------------------------
mpiexec was unable to find the specified executable file, and therefore
did not launch the job. This error was first reported for process
rank 0; it may have occurred for other processes as well.
NOTE: A common cause for this error is misspelling a mpiexec command
line parameter option (remember that mpiexec interprets the first
unrecognized command line token as the executable).
Node: queue1-dy-c72xlarge-1
Executable: singularity
--------------------------------------------------------------------------
AMIを作るのが正解?
c7g.2xlargeベースで、Singularityだけインストールした環境を作る。。。
インストールの仕方
(参考)クラメソ
メモ。
goはyumでインストールできた。
AMIを指定して、パラレルクラスタを更新。
更新時に実行中のインスタンスを止める必要があるので?以下を追加。
何も動いてなかったと思うんだけど、なんかエラーになっちゃうので。。。
SlurmSettings:
QueueUpdateStrategy: TERMINATE
Region: ap-northeast-1
Image:
Os: alinux2
HeadNode:
InstanceType: t4g.micro
Networking:
SubnetId: subnet-xxxxx
Ssh:
KeyName: parallelCluster
Scheduling:
Scheduler: slurm
SlurmSettings:
QueueUpdateStrategy: TERMINATE
SlurmQueues:
- Name: queue1
ComputeResources:
- Name: c72xlarge
Instances:
- InstanceType: c7g.2xlarge
MinCount: 0
MaxCount: 10
Networking:
SubnetIds:
- subnet-xxxxxxxx
Image:
CustomAmi: ami-xxxxxx
→ 正常にタスクの実行が出来ず。。。
どうやらパラレルクラスタ用のAMIが必要なようです。
素のAmazon LinuxにSingularityだけ入れたら、動かなかったです。
というか、EC2の起動・終了が無限ループした。。。止めるまでに発生した利用料が怖い。。。
続きは明日!!!
メモ :
最新安定版のバージョンが、
parallelclusterが 3.11.1
Singularityが 3.11.4
とても混乱する!
parallelclusteのバージョン3.11.1
を指定してAMIを検索↓
➜ ~ aws ec2 describe-images \
--region ap-northeast-1 \
--owners amazon \
--filters "Name=name,Values=*parallelcluster-3.11.1*amzn*arm64*" \
--query 'Images[].[ImageId,Name,CreationDate]' \
--output table
----------------------------------------------------------------------------------------------------------------------------------------------
| DescribeImages |
+-----------------------+---------------------------------------------------------------------------------------+----------------------------+
| ami-05198bef7ec3f0b54| aws-parallelcluster-3.11.1-amzn2023-hvm-arm64-202410180018 2024-10-18T00-21-48.194Z | 2024-10-18T15:45:49.000Z |
| ami-051c728b3aec2cda7| aws-parallelcluster-3.11.1-amzn2-hvm-arm64-202410180018 2024-10-18T00-21-33.705Z | 2024-10-18T15:44:11.000Z |
| ami-0d11c8188b8a0951f| aws-parallelcluster-3.11.1-amzn2023-hvm-arm64-202410180018 2024-10-18T00-21-48.194Z | 2024-10-21T07:48:47.000Z |
| ami-0f6505e88226e7dfd| aws-parallelcluster-3.11.1-amzn2-hvm-arm64-202410180018 2024-10-18T00-21-33.705Z | 2024-10-21T07:47:02.000Z |
+-----------------------+---------------------------------------------------------------------------------------+----------------------------+
ami-051c728b3aec2cda7
が無難そう?
つまりこれ
うーん。。。AMIが上手く作れん。。。
手順を改めて確認する。。。
AMI作成時の最後に以下が抜けてた。
sudo /usr/local/sbin/ami_cleanup.sh
これをやったあと、AMIを使ったら上手くいった。
が、、、、実行例1を試したところ、動作したものの、、、
spdyn: error while loading shared libraries: libhwloc.so.5: cannot open shared object file: No such file or directory
必要なライブラリが足りないと思われ。どうしろと?
AIに聞いてみた。HPCの場合コンテナの常識が違うっぽいです。
コンテナなのにホストの環境に依存しまくるのか。。。
ただそうだとすると、理研のドキュメントに必要な情報が少なすぎる。。。
以下AIによる一般のコンテナとHPCのコンテナの説明
一般的なコンテナと、HPCでのコンテナの考え方の違いを説明します:
【一般的なコンテナの考え方】
- 完全な独立性
- 環境の完全な封じ込め
- どこでも同じ動作
- ホストとの分離
【HPCでのコンテナの考え方】
- ホストのハードウェアと密接に連携
- MPIやハードウェアライブラリはホスト依存
- 性能最適化のためにホストの情報が必要
- ハイブリッドアプローチが一般的
主な理由:
-
パフォーマンス
- ハードウェアの特性を最大限活用
- 低レイテンシな通信が必要
- ホストのMPIを直接利用
-
特殊なハードウェア
- InfiniBandやEFAなどの高速ネットワーク
- GPUやその他のアクセラレータ
- NUMAアーキテクチャ
-
リソース管理
- ジョブスケジューラ(Slurm)との連携
- ハードウェアリソースの効率的な割り当て
- ノード間通信の最適化
例えば:
通常のコンテナ:
Webサーバー → 完全な独立性が重要
HPCコンテナ:
数値計算 → ホストのハードウェア特性の理解が重要
そのため:
- HPCでのコンテナは「完全な独立性」より
- 「ホストとの効率的な連携」を重視する
- これは意図的な設計選択
この違いは、HPCの特殊性(高性能・効率性重視)から来ているものと理解できます。
コンテナ実行時に、libhwloc.so.5
をバインドしたら進んだ。(上手く言ったと入っていない)
mpiexec --use-hwthread-cpus -n ${SLURM_NTASKS} singularity -v run --bind /usr/lib64/libhwloc.so.5:/usr/lib64/libhwloc.so.5 ${SIFFILE} spdyn p${SLURM_NTASKS}.inp
これでサンプル動いた!!
でも、このやり方は正しくないと思う。
AMIを作る時にこれらを適切にインストールするか、そもそも適切に入っているイメージをベースにするべきだったと思われる。でも、それがなにか分からん。
mpiexec --use-hwthread-cpus -n ${SLURM_NTASKS} singularity -v run \
--bind /usr/lib64/libhwloc.so.5:/usr/lib64/libhwloc.so.5 \
--bind /usr/lib64/libevent_core-2.0.so.5:/usr/lib64/libevent_core-2.0.so.5 \
--bind /usr/lib64/libevent_pthreads-2.0.so.5:/usr/lib64/libevent_pthreads-2.0.so.5 \
--bind /usr/lib64/libgfortran.so.4:/usr/lib64/libgfortran.so.4 \
--bind /usr/lib64/libnuma.so.1:/usr/lib64/libnuma.so.1 \
--bind /usr/lib64/libltdl.so.7:/usr/lib64/libltdl.so.7 \
${SIFFILE} spdyn p${SLURM_NTASKS}.inp
8台のEC2で分散処理
1台のときと比べて1/6程度弱の処理時間で完了。1/8にはならないか。
今までの知見を元に、パラレルクラスターを作り直す。
Region: ap-northeast-1
Image:
Os: alinux2
HeadNode:
InstanceType: t4g.micro
Networking:
SubnetId: subnet-xxxxxxxx
LocalStorage:
RootVolume:
Size: 64
Encrypted: true
VolumeType: gp2
Iops: 100
DeleteOnTermination: true
Ssh:
KeyName: parallelCluster
Image:
CustomAmi: ami-xxxxxxxx
Scheduling:
Scheduler: slurm
SlurmSettings:
QueueUpdateStrategy: TERMINATE
SlurmQueues:
- Name: queue1
ComputeResources:
- Name: c72xlarge
Instances:
- InstanceType: c7g.2xlarge
MinCount: 0
MaxCount: 10
Networking:
SubnetIds:
- subnet-xxxxxxxx
Image:
CustomAmi: ami-xxxxxxxx
綺麗に動くようになったとは言えないけど、サンプルアプリを動かすまでに引っかかったポイントを整理
- バーチャル富岳の公式ドキュメントの記載が圧倒的に足りていない。少なくとも私には。
- Gravitonプロセッサを使う(gがついているインスタンスタイプ)
- singularityをインストールしたAMIを作る(HeadNodeとComputeResources両方)
- AMIは作成時のベースは、
- パラレルクラスター用のものをベースにする
- Amzon Linux2を選ぶ(2023ではない)
- singularityインストール後、最後に以下のコマンド実行を忘れない。
sudo /usr/local/sbin/ami_cleanup.sh
- AMIは作成時のベースは、
- パラレルクラスターのHeadNodeのストレージは増やしておく
- バーチャル富岳のコンテナイメージが重いのでデフォルトの40GBでは足りない。最低60GBは欲しい
- パラレルクラスターが動くVPC には
DNS Resolution = yes
とDNS Hostnames = yes
が必要- 設定しないと作成されたEC2インスタンスにIPアドレスが設定されなくて、エラーになる
- 全タスク数(ntasks)、ノード数(nodes)、ノードあたりのタスク数(ntasks-per-node)、タスクあたりのノード数(cpus-per-task)、CPUのコア数の関係はしっかり把握する必要がある
- HPCでのコンテナは、一般のコンテナと違いホストと密接に連携するハイブリッドアプローチが一般的
- コンテナでもホスト側のライブラリに依存したりするので注意が必要
-
必要なライブラリをbindしたら動いたけど、どうするのがよかったのか分からず腑に落ちていないです。- バーチャル富岳でなくて、singularityのインストールの問題と思われる
-
- コンテナでもホスト側のライブラリに依存したりするので注意が必要
- AWSにはパラレルクラスターの他にパラレルコンピューティングサービス(AWS PCS)があるが、全くの別サービスなので注意が必要
2日間触った感想
正直、バーチャル富岳はドキュメントが不十分すぎてイマイチに感じた。
一方で、AWSのパラレルクラスターは、クラウドを利用して効率的にHPCを扱えるサービスで、上手く使えば便利そうだと思った。
腑に落ちないのでバーチャル富岳の問い合わせ先を探しているのですが、見つからない。
広報窓口しかない。。。そこに技術的な質問しても良い?
英語のドキュメント良い直してたけど、C7gってAWS Graviton3であってAWS Graviton3EはC7gnだな。。。
もしかしてこれが、悪さしてたりするのかな。。。でもGravitonではあるし、一応動いて入るし。。。うーん。。。
↑AIに聞いたら、性能差はあるけど使用できるライブラリ等に差はなさそう。。。
Singularityのビルドが適切でなかった説もありそう。
うーむ。HPCが分からん。
AWSの料金を見たら、Fault Injection Simulator
が結構な金額にいっている。
あとで、確認する。
↑全く 別要因な気がする。たぶん関係ない。
EC2は大した金額ではない。なんで?