Open44

バーチャル富岳に触ってみる(AWS上でスパコン)

いばらきいばらき

公式ドキュメントが雑。。。

下記の手順で「プライベート富岳」の環境を構築する
1. AWSのEC2インスタンス作成
2. ParallelClusterのインストール
3. ParallelClusterでクラスタを作成するための定義ファイルの作成
4. クラスタの作成
5. Singularityのインストール
6. アプリの実行

パラレルクラスター使うっぽい
https://docs.aws.amazon.com/parallelcluster/latest/ug/install-v3-virtual-environment.html

いばらきいばらき

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
  1. 特徴的な機能:
  • SIFファイルフォーマットの採用
  • GPUサポート
  • MPI(Message Passing Interface)のサポート
  • 既存のHPCスケジューラとの統合

Singularity CEについて、具体的に知りたい点はありますか?例えば、インストール方法や特定のユースケースなど、お教えできます。

いばらきいばらき

ドキュメント、この記載だけでEC2作れとは、、、

スペックやAMIは?

いばらきいばらき

つんだ

$ 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"
}
いばらきいばらき

シングル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
いばらきいばらき

https://docs.aws.amazon.com/parallelcluster/latest/ug/install-v3-configuring.html

設定ファイル作る

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上だとこれが終わらないけど、何を待っている?

いばらきいばらき

これっぽい。ダメそう。。。

https://qiita.com/gahirosan/items/201fbbdf95fca1975945#スタック作成時にエラーが発生する場合

こんなマイナーな情報残しておいてくれた人に感謝。

時間的に続きは午後で。。。

ちゃんと書いてあった。
https://docs.aws.amazon.com/parallelcluster/latest/ug/install-v3-configuring.html

The VPC uses an existing subnet that supports public IP addresses.

英語を適当に読み飛ばし過ぎた。

いばらきいばらき

一旦きれいに消す。

pcluster delete-cluster --cluster-name hackathon-parallelcluster

再実行

pcluster create-cluster --cluster-configuration ./slurm-gen.yaml --cluster-name hackathon-parallelcluster --region ap-northeast-1
いばらきいばらき

ドキュメントにSingularityのインストール先が書いてないけど、たぶん新たに作られたHeadNodeだと思われる。。。

HeadNodeにログイン

$ pcluster ssh -n hackathon-parallelcluster -i parallelCluster 

Singularityドキュメント。
https://docs.sylabs.io/guides/4.1/admin-guide/installation.html#install-from-source
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)って書いてありますね。
https://www.r-ccs.riken.jp/fugaku/virtual-fugaku/

でも、ドキュメントに書けよ!!

いばらきいばらき

設定ファイル書き換えて再実行!!!
なお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を作るのが正解?

いばらきいばらき

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作成時の最後に以下が抜けてた。

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やハードウェアライブラリはホスト依存
- 性能最適化のためにホストの情報が必要
- ハイブリッドアプローチが一般的

主な理由:

  1. パフォーマンス

    • ハードウェアの特性を最大限活用
    • 低レイテンシな通信が必要
    • ホストのMPIを直接利用
  2. 特殊なハードウェア

    • InfiniBandやEFAなどの高速ネットワーク
    • GPUやその他のアクセラレータ
    • NUMAアーキテクチャ
  3. リソース管理

    • ジョブスケジューラ(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
  • パラレルクラスターのHeadNodeのストレージは増やしておく
    • バーチャル富岳のコンテナイメージが重いのでデフォルトの40GBでは足りない。最低60GBは欲しい
  • パラレルクラスターが動くVPC にはDNS Resolution = yesDNS 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だな。。。
https://www.r-ccs.riken.jp/wp/wp-content/uploads/2024/08/Virtual Fugaku Ver.1 README.pdf

https://aws.amazon.com/jp/ec2/instance-types/c7g/
もしかしてこれが、悪さしてたりするのかな。。。

でもGravitonではあるし、一応動いて入るし。。。うーん。。。

↑AIに聞いたら、性能差はあるけど使用できるライブラリ等に差はなさそう。。。

いばらきいばらき

Singularityのビルドが適切でなかった説もありそう。

うーむ。HPCが分からん。

いばらきいばらき

AWSの料金を見たら、Fault Injection Simulator が結構な金額にいっている。
あとで、確認する。

↑全く 別要因な気がする。たぶん関係ない。

EC2は大した金額ではない。なんで?