見出し画像

いわゆる「スパコン」の中ってどんなだった?②ABCIにまつわる一般知識

こんにちはー。入社6年目のはっしーです。

全4回に渡って紹介するスパコン事例。
今回は第2回です。
実際に私が使用することになったスパコン・ABCIについてご紹介したいと思います。

  1. スパコンにまつわる一般知識

  2. ABCIにまつわる一般知識 👈ここ!

  3. ABCIでSingularityを利用した事例

  4. ABCIでGPUを利用した事例


ABCIって何?

スパコンにはいろいろあります。
富岳や京といった名前を聞いたことがある人も多いのではないでしょうか。

今回、私が扱ったスパコンは、ABCI(AI Bridging Cloud Infrastructure, AI橋渡しクラウド)と呼ばれるものでした。ABCIは、国の研究機関である産業技術総合研究所が構築したスパコンで、東京大学柏Ⅱキャンパスに存在しているとのこと。へー。

現在時点(2024年12月)では、バージョン2.0までがリリースされており、3.0がプレリリースされています。

ふむ。
では、肝心の構成やスペックはどのようなものなのでしょうか。

ハードウェア構成

ABCIのハードウェア構成は、以下の概念図の通り。
当たり前と言えば当たり前なのですが、普通のPCとは全然違っています。

ABCIのハードウェア構成の概念図。
(後述の計算資源ページの情報から作成)

随所に「ノード」という言葉があります。これは、スパコンの分野で使われる場合、以下のような意味合いで使われます。

ノードとは「結び目」や「節」を意味する単語で、スーパーコンピュータ分野では1つの管理単位をノードと呼ぶことが多い。例えば、1つの基本ソフト(OS)が動作しているCPUやメモリの塊を指す。

https://www.r-ccs.riken.jp/fugaku/system/

CPU・GPU・メモリなどの部品が集まってノードを成し、ノード間がネットワークで繋がることで、全体として一つのコンピュータのように振舞っている。そんなイメージですかね。

ABCIを扱う上で主要なノードは以下の2つ。

  • 計算ノード

  • インタラクティブノード (ゲートウェイノード)

このうち、計算ノードは、我々が本当にブン回したい重たい処理を行うためのものです。インタラクティブノードは、ABCIをシステム外から操作したい時、インターフェースとして存在しているノードです。

なお、私が使用した時点のABCI 2.0では、計算ノードにはスペック違いで「V」と「A」の2種類が用意されており、それに応じて、インタラクティブノードも「V」と「A」の2種類が用意されていました。
ABCI 3.0では、計算ノード「H」の1種類で、インタラクティブノードも1種類であるようです。
この辺りの構成は結構移り変わりが激しいので、上図ではこれらをあえて区別せず、ざっくりまとめています。
まぁまぁな頻度でメンテナンスが実施され、そのたびに計算ノードやストレージシステムが引退したり導入されたりしています。
詳細は以下のリンクをご参照ください。

計算ノードとインタラクティブノードの他にも、図にはいろいろゴチャゴチャと記載しました。

ポイントなのは、ストレージが計算ノードとインタラクティブノードから独立しているところです。これはそれらのノードで同じ一つのストレージを共有していることを示しています。計算処理のロジックは各ノードの方で担当するけど、参照するデータは同じところを見るよ、ということですね。このような構成を取ることで、後述するジョブを実行する上で、ノード間でデータをうまく共有できるようにしているのだと思われます。
なお、こういった構成は富岳や京でも見られます。この分野ではある程度一般的な構成なのかもしれません。

さて、これらのハードウェアで実現されるABCIのスペックは、以下のように説明されています。

・ABCI 2.0では……

全計算ノード(A)の合算性能は300 AI-PFOPS(半精度)、19 PFLOPS(倍精度)です。

全計算ノード(V)の合算性能は550 AI-PFLOPS(半精度)、37 PFLOPS(倍精度)です。

https://abci.ai/ja/about_abci/computing_resource_2.0.html

・ABCI 3.0では……

全計算ノード(H)の合算性能は6.2 AI-EFLOPS(半精度)、415 PFLOPS(倍精度)です。

https://abci.ai/ja/about_abci/computing_resource.html

・参考値①として、富岳(通常モード)は……

倍精度理論最高値(64 bit)488 ペタフロップス
単精度理論最高値(32 bit)977 ペタフロップス

https://www.fujitsu.com/jp/about/businesspolicy/tech/fugaku/specifications/

・参考値②として、京は……

ピーク演算性能:10.62PFLOPS

https://aics.riken.jp/jp/k/system.html

それぞれ書かれっぷりが異なり何が何だかって感じですが、ざっくりと「京よりは上、富岳よりは下」ぐらいで認識しておくと良さそうです。(ざっくりすぎるか?)

システム構成

ハードウェア構成はだいたい分かりました。ソフトウェアの構成はどうでしょうか。

ユーザガイド(ABCI 2.0)によれば、インタラクティブノードでは、OSとしてRocky LinuxおよびRed Hat Enterprise Linuxが使われていたようです。Rocky Linuxの方は普段あまり見かけない名前だという印象ですが、これはRed Hat Enterprise Linuxを元に開発されたディストリビューションになるそうです。

実際、インタラクティブノードに入ってディレクトリを確認すると、以下のような構成になっていて、「あー、Linuxっぽい」と感じました。

ABCIのざっくりとしたディレクトリ構成。
この他にも/groupsディレクトリも存在しています。
/groupsはユーザが所属する組織ごとに割り当てられた空間です。

このディレクトリ構成は、前述したようにABCIが一つのストレージシステムを共有していることから、インタラクティブノードで見ても計算ノードで見ても変わりません。

なお、OS以外のソフトウェアだと以下のようなものが用意されています。

  • GPUを扱うためのNVIDIAのモジュール :CUDA Tookit, cuDNN など

  • 機械学習でよく使われる言語:Python, R など

  • コンテナ技術のモジュール:SingularityPRO

それで、どうやって使うの?

ABCIは国の持ち物ですが、一般の人もクラウドサービスのように使うことができます。いわゆるPaaSないしIaaSに相当するものになるかと考えています。

利用者登録や秘密鍵の登録などを済ませると、利用者はSSHでABCIに接続できるようになります。

ABCIにはSSHでアクセスする。アクセスした先はCUIで操作する。

アクセスした先は、インタラクティブノードになっています。
利用登録が済んでいれば、すでに前掲したように、homeディレクトリ配下に設けられた自分のディレクトリで、いろいろ作業することができます。

インタラクティブノードにアクセスするイメージ。

ユーザは、このインタラクティブノードで専用のコマンドを叩き、プログラムをジョブとして登録することで、計算ノードに実行を依頼することができます。ジョブにはインタラクティブジョブバッチジョブがあります。

  • インタラクティブジョブ:プログラムを対話的に実行できる。プログラムのデバッグや対話的なアプリケーションの実行に適している。名前の通りインタラクティブにプログラムを実行できるが、バッチジョブに比べると、使える計算資源が少ない。

  • バッチジョブ:プログラムをキューイングし、ABCIに任意のタイミングで実行してもらう。一度始まったら最後まで走り切るような、長時間のジョブや並列度の高いジョブに適している。インタラクティブジョブに比べると、使える計算資源は多い。

ABCIには、これらのジョブを登録するための専用のコマンドが用意されています。例えば、あるシェルスクリプトをバッチジョブとして実行したい場合は、以下のようにコマンドを叩きます。

qsub -g <ユーザが所属するグループ名> run.sh

この時、シェルスクリプト(run.sh)には、冒頭部分にジョブに設定するオプションをコメントで記載することができます。計算資源の種類(資源タイプ)、ジョブ実行の時間上限、標準出力の出力先ファイル、ジョブ実行中の計算ノードへのSSH接続許可、などを設定します。

#!/bin/bash

#$ -l rt_AF=1
#$ -l h_rt=01:00:00
#$ -j y
#$ -cwd
#$ -o out.log
#$ -l USE_SSH=1
#$ -v SSH_PORT=2222
#$ -v ALLOW_GROUP_SSH=1

singularity exec --nv test.sif ./main.py $@

この例では、シェルスクリプトの最後でSingularityを呼び出し、そのコンテナ内でmain.pyを実行しています。

インタラクティブノードでジョブを登録して計算ノードを使用するイメージ。
run.shの中にSingularityでプログラムを実行するコマンドを記載しておく。

実際、私が関わったプロジェクトでは、この方法でプログラムを動作させていました。その事例は後々紹介します。

今回はABCIの一般知識の紹介ということで、以上になります。
ハードウェア構成、システム構成、具体的な使い方、という3点を述べました。
多少スパコンの実態がイメージしやすくなったでしょうか。
では、次回でお会いしましょう🙇‍♂️