こんにちは。GMOインターネットの大川です。今回はTOP500ランキングについて、そもそも本スコアがどのようなものなのか、何を使って測定しているのかを実際に登録に関わったエンジニアの立場として紹介したいと思います。
TOP500/Green500ランキングについて
先日、GMOインターネットとしてスパコンの電力効率を競い合う世界ランキング「Green500」の2025年6月版において世界第34位、国内第1位にランクインした旨のプレリリース記事を公開しました。※ 昨年には「TOP500」ランキングにおいてもプレリリースを公開しておりますので合わせてご参照ください。
TOP500ランキングとは?
そもそもTOP500ランキングとは、年に2回、スーパーコンピュータの演算性能をその数値でランク付けし、上位500システムを公開しているものです。過去には理化学研究所の「京」や「富岳」が世界で1位のスパコンになった、といったニュースもありましたが、そのランキングがまさにこのTOP500ランキングですね。ランキングへの参加自体はだれでも可能です。TOP500.orgが公開しているルールやレギュレーションに沿って測定したベンチマークのスコアやシステム情報などを期日までにサブミットすることで審査の対象となります。
Green500ランキングとは?
TOP500が単純な演算性能を評価するのに対し、電力効率の良いスーパーコンピュータを評価しているのがGreen500です。TOP500ランキングへサブミットする際に「ベンチマーク取得時の電力効率に関わる情報(総消費電力やピーク電力など)」も任意でサブミットすることが可能です。これらの情報を登録してベンチマークスコアに対する消費電力の割合(≒ エネルギー効率)を算出したシステムについては、その値をもとにランク順のソートが行われ、Green500として公開されます。消費電力情報を登録せずにTOP500のみにサブミットすることは可能ですが、TOP500の中でエネルギー効率が優れているシステムをソートしたものがGreen500であり、Green500だけの申請を行うようなことはできないので注意が必要です。
ベンチマークについて
TOP500ランキングではLINPACK性能と呼ばれる、システムの浮動小数演算性能(FLOPS値)を測定するもので、測定するための実装としてHPL(High Performance Linpack)と呼ばれるLINPACKベンチマークを用います。古くからあるコンピュータのベンチマークであるため、近年の生成AIや機械学習で行われる処理とは方向性が異なるものの、HPL自体が行列・ベクトル演算を多用することから、まさにこれらの演算に強いGPUとは非常に相性がよく、性能指標としては遠からず近からずといったところになっています。
GMO GPUクラウドでHPLベンチマークを取得してみよう
それでは、GMO GPUクラウドを使用して実際に HPL ベンチマークを実行してみたいと思います。ベンチマーク用のプログラムを用意する必要がありますが、NVIDIA 社の NGC カタログにてHPL テストに必要な一式を用意したNVIDIA HPL-Benchmarks コンテナが提供されていますので、こちらを利用するのが便利です。
実行環境の準備
GMO GPUクラウドではコンテナ実装として Singularity を採用しているため、singularity コマンドでHPL-Benchmarks コンテナを pull します。※ Docker 環境の場合は適宜コマンドを読み替えてください。
$ module load singularitypro
$ singularity pull hpc-benchmarks_25.02.sif docker://nvcr.io/nvidia/hpc-benchmarks:25.02
...
コンテナ内部に入ってみると /workspace ディレクトリにプログラム類が配置されています。ここでは、hpl.sh が実行する HPL テストの本体になります。
$ singularity exec hpc-benchmarks_25.02.sif /bin/bash
Singularity> ls -l /workspace
total 148
-rw-rw-r-- 1 root root 148725 Jan 23 2025 NVIDIA_Deep_Learning_Container_License.pdf
-rw-r--r-- 1 root root 1130 Feb 8 12:28 hpc-benchmarks-gpu-env.sh
drwxr-xr-x 4 root root 157 Feb 8 12:26 hpcg-linux-x86_64
lrwxrwxrwx 1 root root 25 Feb 8 12:28 hpcg.sh -> hpcg-linux-x86_64/hpcg.sh
drwxr-xr-x 4 root root 147 Feb 8 12:28 hpl-linux-x86_64
drwxr-xr-x 3 root root 135 Feb 8 12:26 hpl-mxp-linux-x86_64
lrwxrwxrwx 1 root root 31 Feb 8 12:28 hpl-mxp.sh -> hpl-mxp-linux-x86_64/hpl-mxp.sh
lrwxrwxrwx 1 root root 23 Feb 8 12:28 hpl.sh -> hpl-linux-x86_64/hpl.sh
drwxr-xr-x 4 root root 41 Feb 8 12:30 lib
drwxr-xr-x 2 root root 118 Feb 8 12:28 stream-gpu-linux-x86_64
lrwxrwxrwx 1 root root 42 Feb 8 12:28 stream-gpu-test.sh -> stream-gpu-linux-x86_64/stream-gpu-test.sh
-rw-r--r-- 1 root root 701 Feb 8 12:28 third-party.txt
また、HPL テストには「どのように問題を生成し、計算するか」を定義する、いわば設定ファイルとなる .dat が必要になります。.dat 内における適切な各パラメータ値は使用する GPU モデルや数によって異なってくるのですが、/workspace/hpl-linux-x86_64/sample-dat ディレクトリにサンプルが用意されているので流用が可能です。今回は HGX H200 を 4 ノード(8 GPUs x 4 = 32GPUs)で測定する予定なので、HPL-H200-32GPUs.dat を使用します。
Singularity> ls -l /workspace/hpl-linux-x86_64/sample-dat/
total 68
...
-rw-r--r-- 1 root root 1133 Feb 8 12:26 HPL-H200-16GPUs.dat
-rw-r--r-- 1 root root 1133 Feb 8 12:26 HPL-H200-1GPU.dat
-rw-r--r-- 1 root root 1132 Feb 8 12:26 HPL-H200-2GPUs.dat
-rw-r--r-- 1 root root 1133 Feb 8 12:26 HPL-H200-32GPUs.dat
-rw-r--r-- 1 root root 1132 Feb 8 12:26 HPL-H200-4GPUs.dat
-rw-r--r-- 1 root root 1133 Feb 8 12:26 HPL-H200-8GPUs.dat
...
ベンチマークの実行
上記のファイルも踏まえて HPC-Benchmarks コンテナで HPL ベンチマーク(hpl.sh)を実行するには以下のようにします。GMO GPUクラウドでは Slurm ジョブスケジューラを採用しているため、実行している処理の本体は singularity run ... 以降のコマンドです。それ以前は Slurm としてのノードオプションや割り当てるリソース量、実行するパーティション(計算リソース)の指定です。
$ srun -N 4 --partition=$PARTITION_NAME \
--mpi=pmix \
--ntasks-per-node=8 \
--gpus-per-node=8 \
--cpu-bind=none \
--mem-bind=none \
--mem=1048576 \
singularity run \
--nv hpc-benchmarks_25.02.sif \
/workspace/hpl.sh \
--dat /workspace/hpl-linux-x86_64/sample-dat/HPL-H200-32GPUs.dat \
--gpu-affinity 0:1:2:3:4:5:6:7 \
--mem-affinity 0:0:0:0:1:1:1:1 \
--cpu-affinity "0,2,4,6,8,...(snip)...,110:1,3,5,7,...(snip)...,109,111" \
--ucx-affinity mlx5_0:mlx5_1:mlx5_2:mlx5_3:mlx5_4:mlx5_7:mlx5_8:mlx5_9
hpl.sh で指定しているオプションは、それぞれ以下のようなものになります。
--gpu-affinity MPIランクごとにどのGPUを割り当てるか今回はノード当たり8プロセスで並列処理し、ノード当たりのGPUも8なので 0:1:2:3:4:5:6:7と記載します。--mem-affinityMPIランクごとにどのNUMAノードのメモリを使用するかここでは前半プロセスは0番に、後半プロセスは1番に設定しています。メモリのNUMA配置は /sys/devices/system/node/node[0-1] などを参照することで確認可能です。--cpu-affinityMPIランクごとにどのNUMAノードのCPUを使用するか本筐体は2Socketであり、ここでは前半プロセスはNUMA Node0に、後半プロセスはNUMA Node1に設定しています。NUMA Nodeとそれに対するCPUの割り当てはlscpuコマンドの NUMA node0 CPU(s) あるいは NUMA node1 CPU(s) を見ることによって確認可能です。--ucx-affinityMPIランクごとにどのIBデバイスを使用するかノード当たり8枚のBlueField3が搭載されているので、GPUアフィニティと同様に連番で使用します。mlxデバイスの一覧は ibdev2netdev コマンドで確認可能です。
なお、環境によっても異なるものの、MPI による並列処理を正しく動作させるため実行時にいくつかの環境変数を与える必要があるかもしれません。代表的な環境変数を紹介します。
NCCL_SOCKET_IFNAME=bond0NCCLがどのインタフェースを使用するかマルチノード時にNCCLが通信に使用する管理系のインタフェースを指定します。NCCL_IB_GID_INDEX=3インターコネクトでRoCEモードで通信する際にどのインデックスIDを使用するかインデックスIDはshow_gidsコマンドで確認可能で、本環境での「3」はRoCEv2を表します。UCX_TLS=sm,self,rcUCXレイヤでどの通信方式を使用するかtcpを指定するとRDMAインターコネクト通信を使用しないため、環境に応じて指定します。
結果の確認
上記を実際に実行してみると数分の処理の後以下のような結果が得られ、この値から演算結果は 1.543e+06 GFLOPS、即ち 1.543 PFLOPS となります。参考までに、2025年6月時点のランキングでは500位が2.44PFLOPSですから、このノード数での計算ではランク圏外となってしまいました。
================================================================================
T/V N NB P Q Time Gflops ( per GPU)
--------------------------------------------------------------------------------
WC0 733184 1024 8 4 170.28 1.543e+06 ( 4.822e+04)
HPL_pdgesv() start time Wed Jul 30 15:11:45 2025
HPL_pdgesv() end time Wed Jul 30 15:14:35 2025
--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)= 0.000278354594 ...... PASSED
||Ax-b||_oo . . . . . . . . . . . . . . . . . = 0.0000000469051317
||A||_oo . . . . . . . . . . . . . . . . . . . = 183891.8852058251795825
||x||_oo . . . . . . . . . . . . . . . . . . . = 11.2573452283603679
||b||_oo . . . . . . . . . . . . . . . . . . . = 0.9915993640190937
================================================================================
Finished 1 tests with the following results:
1 tests completed and passed residual checks,
0 tests completed and failed residual checks,
0 tests skipped because of illegal input values.
--------------------------------------------------------------------------------
End of Tests.
================================================================================
スコアを伸ばすには
シンプルに HPL によるベンチマークを測定してみましたが、よりハイスコアを狙うためには各種チューニングを行います。主なチューニング事項としては以下のようなものが挙げられます:
ハードウェア面
CPU や GPU などの電力上限や動作周波数を引き上げることによる計算性能の向上冷却性能を引き上げる(サーマルスロットの防止)
ソフトウェア面
BIOS等でシステムの動作モードを省電力からパフォーマンス重視のモードに切り替えるNCCLやUCXなどのパラメータ調整HPL.datの調整(別記事にしようと思いますが、演算するときの行列サイズやプロセスグリッドと呼ばれる値を環境に合わせて最適化する作業を指します)
このような細かい調整を網羅的に行い、ベストスコアが出るポイントを探っていきます。ただし、どれだけ頑張ってもスコアが元の倍になるようなことはないので、あくまで少しでもスコアを底上げすることを目的に期日のギリギリまで頑張るようなイメージです。
まとめ
ここまで TOP500 ランキングと実際に HPL によるベンチマークの取得法をご紹介しました。サブミット自体にそこまでハードルがあるわけではありませんので、皆様のお手元のクラスタでもぜひトライしてみてください!なお、Green500 スコアを取得するには、前述のように「電力効率」を意識した特殊な(?)調整が追加で必要になってきます。改めて記事にてご紹介予定なのでお楽しみに!