GPUクラスタ(NVIDIA A100 系)

お知らせ


既知の問題

  • 現在把握している問題はありません.不審な動作があった場合はお問合せフォームからご連絡いただけますようお願いいたします.

Last Updated: 2024/06/05


1 g00系 GPUクラスタの概要

DGX A100 ([外部リンク] NVIDIA製品情報) ,
および NVIDIA A100 PCIe を搭載した GPU サーバ群を提供しています.
GRAPEライブラリをリンクすることでGRAPE用のコードを実行することもできます.
利用申請の詳細についてはGPU募集要項および利用申請書のページをご覧ください.

2 システム情報

このシステムは1台のログインノード(g00)と6台の計算ノード(gxa[1-2], ga[1001-1004])およびネットワークストレージで構成されており,合計32基の NVIDIA A100 GPU が利用可能です.
ストレージとは Infiniband HDR または HDR100 で接続されています.また,各計算ノードで Singularity コンテナを実行することができます.

2.1 ノード構成

ログインノード:g00.cfca.nao.ac.jp

アドレス g00.cfca.nao.ac.jp
CPU 仮想ホストの AMD EPYC 7282 のうちの 4 コア
主記憶 16 GiB/node
OS Ubuntu 20.04 LTS
その他 仮想マシン

計算ノード:gxa1, gxa2

ノード数 2
CPU AMD EPYC 7742 (64 cores) x 2 / node
加速器 NVIDIA A100 SXM 40GB 8基 / node
主記憶 2 TB/node
OS DGX OS 5 (Ubuntu 20.04 LTS)
その他 ハードウェアはどちらも NVIDIA DGX A100 320GB

計算ノード:ga1001, ga1002

ノード数 2
CPU AMD EPYC 7402P (24 cores) x 1 / node
加速器 NVIDIA A100 PCIe 40GB 4基 / node (2基ずつがNVLINKで接続されています.)
主記憶 512 GB/node
OS Ubuntu 20.04 LTS

計算ノード:ga1003, ga1004

ノード数 2
CPU AMD EPYC 7453 (28 cores) x 1 / node
加速器 NVIDIA A100 PCIe 80GB 4基 / node (2基ずつがNVLINKで接続されています.)
主記憶 512 GB/node
OS Ubuntu 20.04 LTS

計算ノード:ga1005

ノード数 1
CPU AMD EPYC 7443 (24 cores) x 1 / node
加速器 NVIDIA A100 PCIe 80GB 1基 / node (1GPUジョブ専用)
主記憶 512 GB/node
OS Ubuntu 20.04 LTS

2.2 ストレージ

計算ノードおよびログインノードからは /home/<username > , /gwork0/<username > および /cfca-work/<username >
に対して読み書きを行うことができます.
/cfca-work (および /gwork0)は,中規模サーバ,GPU系と共通のストレージで,解析サーバからも使用できます.
/home/<username > ,/gwork0/<username > はIO性能が低く,ネットワーク的にも計算ノードからアクセスするには不利なため,環境構築やファイルの保管に限って利用し,計算結果の書き込みや,学習データ等の配置には /cfca-work を使用してください.
/gwork0 の quota は以下のコマンドで確認することができます( 現在 g00 では使用できません.解析サーバ等でお試し下さい.).
$ quota -s

2.3 アクセス方法

本機材はその他のシステム同様,CfCA-HPCネットワーク内に設置されています.
VPNを用いてHPCネットワークに接続し,g00.cfca.ac.jp にログインしてください.
$ ssh -l アカウント名 g00.cfca.nao.ac.jp
VPNによる接続方法の詳細はHPCネットワークへの接続方法を御覧下さい。
CfCA共同利用計算機のアカウント名(本Webシステムのアカウント名ではありません)は本Webシステムのアカウント情報から確認することができます。
また初期NISパスワードは利用申請受理後にメールで配信されます。

ユーザーのパスワードの変更はログインノードで,
$ passwd
とすれば行えます.
$ csh
とすることでシェルを変更することができますが,動作確認はbashで行っており,その他のシェルでの動作確認は十分ではありません.
GPUクラスタ以外の計算機システムでシェルを変更されている方は,シェル由来の不具合が発生する可能性があります.

3 利用方法

計算ノードへ直接ログインすることはできません.計算ノードで計算するにはログインノードからジョブスクリプトを投入する必要があります.
ジョブの投入については3.2 ジョブ管理システムをご確認ください.

3.1 コンパイル

NVIDIA HPC SDK に含まれるコンパイラを使用します.
HPC SDK の詳細は NVIDIA の documentation https://developer.nvidia.com/hpc-sdkを参照してください.
個別の CUDA-Toolkit のコンパイラも使用できます.特定のバージョンが必要な場合は,自身のホームディレクトリにインストールするかお問合せください.
既に利用可能な CUDA-Toolkit については
$ module avail
で module を確認してください.

Volta以降はWarp内のスレッドスケジューリングが異なっているため,Pascalを意識して書いたコードをコンパイルする際には以下のように指定してください.
この指定では compute_60: Pascal仕様で sm_80: Amper上で動作するバイナリが生成されます.
$ module load nvhpc
$ nvcc -gencode=arch=compute_60,code=sm_80 -o sample sample.c

[外部リンク]independent-thread-scheduling-compatibility
[外部リンク]options-for-steering-gpu-code-generation

CUDA Fortran で書かれたプログラムの場合は以下のように nvfortranでコンパイルしてください.
nvccとはオプションがやや異なります.
$ module load nvhpc
$ nvfortran -cuda -gpu=cuda11.6,cc80 -tp=zen2 -mcmodel=medium -o hello hello.cuf

プリプロセッサを利用する場合には拡張子を CUF としてください.
MPIを使用する場合mpif90でコンパイルします.
(MPIを使う場合のソースの例はこちら)

nvcc や nvfortran といったコマンドは cuda 部分は NVIDIA の CUDA コンパイラが,それ以外の部分はホストのコンパイラがコンパイルを行います.
特に指定しないと gcc が呼び出されますが,-ccbin オプションで
nvcc -ccbin ifort -o sample sample.c
のように指定することで ifort 等他のコンパイラを指定することができます.
ホスト側のコンパイラにオプションを渡すには次のように-Xcompilerオプションを使用します.
nvcc -Xcompiler "-g -Wall -O2" -o sample sample.c

その他の機能は [外部リンク] NVIDIA HPC SDK のドキュメント を参照してください.

3.2 ジョブ管理システム

GPU機材ではジョブ管理システムとして slurm を採用しています.
ログインノードからジョブ管理システムを用いてジョブを実行して下さい.
ジョブ毎に利用可能な資源量は予告なく改訂される可能性があります.
現時点でのパーティション(PBSのキューに相当)設定は以下の通りです.
dgx が付くパーティションに投入されたジョブは gxa1, gxa2(DGX A100)上で,
ga40 が付くパーティションに投入されたジョブは ga1001, ga1002 上で,
ga80 が付くパーティションに投入されたジョブは ga1003, ga1004 上で実行されます.
any-1gpu で投入されたジョブは全てのノードから空いているGPUを探して実行します.GPUメモリが40GBで十分な場合はなるべく any-1gpu を使用してください.

パーティション名 1ジョブあたりの制限 パーティションあたりの制限
dgx-full 最大8GPU, 128CPU, walltime 1-day 制限無し
any-1gpu 最大1GPU, walltime 2-day 同時確保最大2GPU
ga80-1gpu 最大1GPU, 28CPU, walltime 7-day 同時確保最大2GPU
ga80-2gpu 最大2GPU, 28CPU, walltime 4-day 同時確保最大2GPU
ga80-4gpu 最大4GPU, 28CPU, walltime 2-day 同時確保最大4GPU
ga40-1gpu 最大1GPU, 24CPU, walltime 7-day 同時確保最大2GPU
ga40-2gpu 最大2GPU, 24CPU, walltime 4-day 同時確保最大2GPU
ga40-4gpu 最大4GPU, 24CPU, walltime 2-day 同時確保最大4GPU

パーティションにはジョブあたりに使用できるGPU数制限が設定されています。この制限を超えたジョブは実行されません。
ga 系では、パーティションあたりに使用できるGPU数も制限されています。この制限を超えたジョブは資源に空きがあってもキューに並びます。
最後に、システム全体で1ユーザが同時に確保できるGPU数の合計が最大16に制限されています。この制限を超えたジョブは資源に空きがあってもキューに並びます。

  • (例1)"ga80-1gpu"では、GPUを1つ使う2つのジョブが(資源に空きがあれば)同時実行されます。3つめ以降はキューに並びます。
  • (例2)"ga80-4gpu"では、1人のユーザが以下のようにジョブを投入できます。
    • GPUを4つ使う1つのジョブ
    • GPUを3つ使うジョブと1つ使うジョブを同時に実行
    • GPUを2つ使う2つのジョブを同時に実行
    • GPUを1つ使う4つのジョブ同時に実行
  • ga40 と ga80 の同時確保最大GPU数は合計で制限されます.ga40-4gpu で 2GPUジョブを実行しているとき,ga80-4gpu でもあと2GPUしか利用することができません.

ジョブスクリプトの記法

ジョブスクリプトはシェルスクリプトとしてファイルに保存し,sbatch コマンドで投入します.ジョブスクリプトのシェルを bash 以外にするとmoduleの環境変数が読み込まれないことがあります.bashを指定するようにしてください.
slurm のジョブスクリプトではオプションを
#SBATCH <オプション名>=<値>
のように記述します.
良く使われるオプションは
--partition=<パーティション名>
--gres=gpu:<要求GPU数>
--time=<要求実行時間> #書式は hh:mm:ss, days-hh, days-hh:mm, days-hh:mm:ss など
--ntasks=<プロセス数>

などです.以降にジョブスクリプトの記述例を示します.

その他の slurm で使用できるオプション,値の書式については slurm の公式ドキュメント https://slurm.schedmd.com/sbatch.htmlを参照してください.

ジョブスクリプト例(シングルプロセス)

計算の投入に必要な最小のジョブスクリプトは以下の通りです.以下の内容をtest.sh など適当な名前で保存してください.

#!/bin/bash
#SBATCH --partition=dgx-full
#SBATCH --gres=gpu:1
#SBATCH --time=0:10:00
module load nvhpc
./a.out > a.log

ジョブスクリプトを投入したディレクトリは $SLURM_SUBMIT_DIR という環境変数に格納されます.
必要に応じてスクリプト内でディレクトリを移動します.
ジョブスクリプトの最終行でプログラムを実行しています.
標準出力が多くなったときに不具合が生じることがあるため,なるべくリダイレクトを書くようにしてください.
./a.out > a.log
それほど行数が多くないのであればリダイレクトの必要はありません.そのほかの行の意味は以下の通りです.

#!/bin/bash # ジョブスクリプトが使用するシェルの指定(bash 以外は試験をしておりません.原則 bash を指定してください.)
#SBATCH --partition=dgx-full # ジョブを実行したいPartition の指定.ここを ga40-2gpu など要求GPU数などに応じて書き換える.
#SBATCH --gres=gpu:1 # ジョブが要求するGPU数.この例の場合,ジョブからGPUが1基だけ使用可能になる.
#SBATCH --time=0:10:00 # 実行時間の指定.無指定だと最大値に設定される.短時間であればバックフィルで早めの実行が期待できるので指定したほうが良い.

--time のフォーマットは dd-hh:mm:ss ですが,秒の指定は切り上げられます.
指定しない場合には Partition の最大値が設定されるため,backfill の対象になりにくくなります.
スクリプトを作成後,sbatch コマンドでジョブを投入します.

$ sbatch test.sh

標準出力と標準エラー出力ファイル名をPBS風にするには,以下をジョブスクリプトに追記してください.
#SBATCH --output=%x.o%j
#SBATCH --error=%x.e%j

ジョブスクリプト例(MPI)

ノード内でMPIジョブを実行したい場合は以下の様にします.
以下の例では 5 プロセス起動して 2 GPU が利用可能になります.ただしこれは例示のための数字でやや奇妙な要求です.
プログラミングの容易さから,プロセス数と要求 GPU 数は同じにすることが多いでしょう.

#!/bin/bash
#SBATCH --partition=dgx-full
#SBATCH --ntasks=5
#SBATCH --gres=gpu:2
#SBATCH --time=0:10:00
module load nvhpc
mpiexec -n 5 ./hello

以下のように指定することで複数ノードを同時に要求することも可能です.(十分な試験が行えていないため適宜実験の上お試しください.)
#SBATCH --nodes=2
#SBATCH --gpu-bind=closest

特定のノードで実行する

何等かの理由で特定のノードでのみ実行したい場合はジョブスクリプトに --nodelist の指定を追加します.
以下の例のようにすると,ジョブは gxa1 が空き次第 gxa1 で実行されます.
#SBATCH --partition=dgx-full
#SBATCH --nodelist=gxa1

指定したパーティションに含まれないノードを指定することはできません(error になります).

投入したジョブの確認

$ squeue
以下は表示例です。
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
95 dgx-full ga80-hel <username> R 0:26 1 gxa1

ジョブの実行時刻の推定値の確認は以下のようにします.
$ squeue --start -j <JobID>
個別のジョブについて,より詳細な情報を表示するには以下のようにします.
$ sacct -o User%20,JobID,Partition,NodeList,NNodes,Submit,Start,End,Elapsed,State,ReqTRES%50,Timelimit%12 \
-j <JobID>

<JobID> の部分に情報を見たいジョブのIDを入力してください. -j <JobID> 追加すると複数のジョブの情報を表示できます.
表示する項目を追加したい場合は[外部リンク] slurm 公式サイトの sacct のページを参考にしてください.

ジョブの消去

以下のコマンドによってジョブをキャンセルできます。
$ scancel <JOB-ID>
JOB-ID は上記squeue コマンドで調べることができます。

ジョブの継続投入

Slurmにおいて、あるジョブの実行終了後に継続してジョブを投入する一例です。
まず以下のようにジョブ名 (ここでは hoge)をジョブスクリプトに追記してください。
#SBATCH --job-name=hoge
今回の方法でジョブを継続投入するためには、このジョブ名 hoge を揃える必要があります。
その後、以下のように -d singleton オプションを付けてジョブを投入することで、job1.sh, job2.sh, job3.shの順に実行されます。
$ sbatch job1.sh
$ sbatch -d singleton job2.sh
$ sbatch -d singleton job3.sh

この時、ジョブスクリプトと実行プログラム(のファイル名)は、同じものでも異なるものでも問題ありません。

利用可能なパーティションの確認

講習会の開催時等により,利用可能なパーティションや設定が一時的に変更される可能性があります.その時点での状態は以下のように sinfo -s コマンドで確認することができます.
g00:~$ sinfo -s
PARTITION AVAIL TIMELIMIT NODES(A/I/O/T) NODELIST
dgx-full up 1-00:00:00 0/2/0/2 gxa[1-2]
ga80-4gpu up 2-00:00:00 1/1/0/2 ga[1003-1004]
ga80-2gpu up 4-00:00:00 1/1/0/2 ga[1003-1004]
ga80-1gpu up 7-00:00:00 1/1/0/2 ga[1003-1004]
ga40-4gpu up 2-00:00:00 0/2/0/2 ga[1001-1002]
ga40-2gpu up 4-00:00:00 0/2/0/2 ga[1001-1002]
ga40-1gpu* up 7-00:00:00 0/2/0/2 ga[1001-1002]

3.3 Singularity コンテナの使用

このシステムでは、Singularity コンテナが動作します。
当面は Singularity コンテナイメージファイル(SIFファイル)を持ち込んで利用してください。
将来的にはNVIDIA NGCカタログにある主要なコンテナのイメージを
CfCAのネットワーク内にミラーする予定です。

Singularityコンテナの概要

Singularityコンテナは仮想化技術の一種で,おおまかには高速に起動する仮想マシンです.
コンテナを起動してそこにログインすることは,仮想マシンを起動してそこにログインすることとほぼ同じです.

コンテナを使うことの最大の目的はソフトウェアの開発,動作環境を持ち運べるようにすることです.
たとえば必要なバージョンのTensorFlowが既にインストールされたSingularityコンテナファイルを一度準備すれば,
異なる計算機システムでTensorFlowを実行したいときにそのコンテナを持ち込むことで環境構築の手間を飛ばすことができます.

NVIDIAは主要な環境をコンテナ化して配布しています.
今はNGCカタログと呼ばれているようです.
https://www.nvidia.com/ja-jp/gpu-cloud/
先ほど例に出したTensorflowもバージョン別に環境が用意されています
https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tensorflow/tags
これらはDockerコンテナとして提供されているので,Sngularity コンテナに変換する必要があります.
手元の環境に Singularityをインストールし,PyTorchなら
$ singularity pull docker://nvcr.io/nvidia/pytorch:22.01-py3

のようにすることで,sif ファイルに変換できます.
変換後の sif ファイルを g00 系にマウントされているディレクトリ(サイズが大きいので /home ではなく /gwork0 または /cfca-work を推奨します)に置き
実行する(次節)と,様々なソフトウェアの動作環境をCfCAのg00系GPUクラスタに持ち込むことができます.

Singularityコンテナの利用(基礎編)

以下の例では、pytorch_22.01-py3.sifというコンテナ内で、"python CNN.py" を実行しています。
なお、--nv(enable experimental Nvidia support)フラッグは、コンテナからGPUを使用する場合に必要となります。
$ singularity exec --nv pytorch_22.01-py3.sif python CNN.py

/cfca-work はデフォルトではコンテナ内にマウントされないため、マウントするには--bind フラッグを用います。
以下の例では、/cfca-work をコンテナ内の/piyo にマウントしています。マウント先(この例では/piyo)は任意に決めることができます。また、省略した場合はコンテナ内でも/cfca-workにマウントされます。
$ singularity exec --nv --bind /cfca-work:/piyo pytorch_22.01-py3.sif python CNN.py

Singularityイメージを実行するジョブスクリプトの一例です。
以下の例では、--bindフラッグでマウント先を省略することにより、/cfca-work をコンテナ内の/cfca-work にマウントしています。

#!/bin/bash
#SBATCH --partition=ga80-1gpu
#SBATCH --gres=gpu:1
#SBATCH --time=0:10:00
singularity exec --nv --bind /cfca-work pytorch_22.01-py3.sif python CNN.py

3.4 GRAPEライブラリの利用方法

GPUクラスタではライブラリをリンクすることでGRAPE用の命令が書かれたプログラムコードをコンパイル,実行することができます.
GRAPE-5モード,GRAPE-6モードの両方が使用できます.
ただし,ブロックタイムステップの使用時にはユーザプログラムの書き換えが必要になります.
(書き換えを行わなくても動作しますが通信の最適化が行われないため1桁程度遅くなります.)
書き換えの内容は,g00:/opt/muv/grape/grapepkg1.7.1/doc/00readme-j の8.1節 j 粒子転送の最適化」
の項目を参照してください.

GRAPE-5モードのコンパイルは以下のようにします.GRAPE-6モードの場合は -lcuda5 を -lcuda6 に書き換えて下さい.
$ module load grapepkg
$ nvcc csample.c -o sample -Xcompiler="-O2 -pthread" -lm -lcuda5 -lcudart -lstdc++

g5nbutil.h を使用しているプログラムは以下のように書き換える必要があります.
//#include "g5nbutil.h"
#include "g5util.h"

注) 歴史的事情から grapepkg/1.7.1-slurm grapepkg/1.7.1 という2種類の module が存在しますが内容は同一です.

3.5 GPUサンプルコード

GPUクラスタで動作するサンプルコードがこのリンク[github]からダウンロードできます.

3.6 プロファイラの使用の仕方

nvidiaのプロファイラは以下のように使用する。a.outが実行ファイルであり、report.nsys-repというレポートのファイルが生成される。実際には以下のコマンドはバッチジョブとして投入する。
nsys profile -o report ./a.out
report.nsys-repができたら、以下のコマンドでプロファイラを立ちあげる。
$ module load profiler
$ nsys-ui

メニューのOpenからreport.nsys-repを選択することでプロファイルが表示される。

4 その他の注意事項

GPUシステムはGPU利用申請を行い、申請が受理された利用者が使用出来ます。
各利用者は利用方法を守り、他の利用者の利便を損なわないようにしてください。
利用方法が守られていないとこちらで判断した場合、警告無く利用者のプロセスを終了することをご了承下さい。