← Back to Memo
スパコン利用メモ(ABCI)
これは以前,ABCIと呼ばれるAI学習等に使用されるスパコンを触る機会がありましたので,その際に役に立ったプラクティスです. 共有サーバ独特の作法が必要となるため,環境構築からジョブ実行までの手順を整理します.
1. 基本思想:ログインノードと計算ノード
スパコンは「ログインノード」と「計算ノード」で役割が完全に分かれています. この区別を理解することが最初のステップです.
| ノード | 役割 | 禁止事項 / 特徴 |
|---|---|---|
| ログインノード | SSHで最初に接続する場所。 ファイル編集、コンパイル、 pip install、ジョブ投入などに使用. | 重い計算(学習など)は禁止. アカウント停止の対象になる場合があるため注意. |
| 計算ノード | 実際のAI学習が行われる場所. A100 GPUなどが搭載されている. | ジョブ管理システム(qsub)経由でのみ利用可能.ログインノードの環境は引き継がれない(都度ロードが必要). |
2. 環境構築:moduleとvenv
ABCIでは、システム側が提供する module と,ユーザー空間の venv を組み合わせて環境を作ります.
conda はシステム環境と競合しやすいため,非推奨とされることが多いです.
2-1. module コマンド
module は,システムにインストールされた基盤ソフトウェア(Python本体, CUDAなど)を管理するコマンドです.
module avail- 意味: 利用可能なモジュール(ソフトウェア)の一覧を表示します.
- 例:
$ module avail(cuda, pythonなどのバージョンを確認できる)
module load [モジュール名]- 意味: 指定したモジュールを,現在の環境(シェル)に読み込みます.
- 例:
$ module load python/3.12/3.12.9 cuda/12.1/12.1.1
module list- 意味: 現在ロードされているモジュールの一覧を表示します.
module purge- 意味: 現在ロードされているモジュールをすべて解除し,まっさらな状態に戻します.
- 注意: ログインノードで実行すると,
lsなどの基本コマンドまでパスが切れ,動かなくなる場合があります.通常はジョブスクリプトの先頭で使い,環境をリセットします.
2-2. 主要モジュール解説
module avail で表示される /gpgpu や /devtools カテゴリのモジュールが重要です.
python/...: AI学習の土台となるPython本体です.cuda/...: GPU (A100) を動かすための基本プラットフォームです.インストールするPyTorchのCUDAバージョン(例:cu121)と一致させる必要があります.cudnn/...: ディープラーニングの計算(特に畳み込み)を高速化するライブラリ.cudaとセットでロードします.nccl/...: 複数GPU間(例: 8GPU)の通信を高速化するライブラリ.分散学習(torchrunなど)に必須です.
2-3. 【手順】環境構築フロー(ログインノードで1回だけ実行)
# 1. ベースとなるPythonとCUDAを選択してロード
module load python/3.12/3.12.9 cuda/12.1/12.1.1
# 2. venv (仮想環境) を作成 (例: .venv)
python -m venv /path/to/my_project/.venv
# 3. venv を有効化
source /path/to/my_project/.venv/bin/activate
# 4. 必要なライブラリをpipでインストール
# (例: PyTorch CUDA 12.1 対応版)
(venv) $ pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
(venv) $ pip install -r requirements.txt
# 5. 完了したら無効化
(venv) $ deactivate
3. ジョブ実行:計算ノードの使い方
ジョブの実行方法は「インタラクティブジョブ(テスト用)」と「バッチジョブ(本番用)」の2種類です.
3-1. インタラクティブジョブ (qsub -I) :デバッグ・テスト用
短時間のテスト(import確認,hello world)やデバッグに使う方法です.
重要: GPUを使わないテスト(import確認など)は,課金レートが安いCPUノード(rt_HCなど)をリクエストしてください.
# 10分間、CPUノードを1つ借りて接続する
$ qsub -I -P group -q rt_HC -l select=num
# --- (接続後、計算ノード上で操作) ---
(calc_node)$ module load python/3.12/3.12.9
(calc_node)$ source /path/to/my_project/.venv/bin/activate
(calc_node)$ python -c 'import torch; print("Success")'
(calc_node)$ exit
3-2. バッチジョブ (qsub) :本番の学習用
本番の重い学習(train.py)に使う標準的な方法です.run.sh という「予約伝票(ジョブスクリプト)」を作成し、qsub で提出します.
# ログインノードでジョブを提出
$ qsub run.sh
4. テンプレート: qsub 用ジョブスクリプト(run.sh)
qsub で提出するスクリプトのテンプレートです.
#!/bin/sh
#PBS -q rt_HG
#PBS -l select=1
#PBS -l walltime=24:00:00
#PBS -P gch51701
source /etc/profile.d/modules.sh
module load gcc/13.2.0 python/3.12/3.12.9 cuda/12.4/12.4.1 cudnn/9.10/9.10.2
source .venv/bin/activate
cd <dir>
python train.py
5. ジョブ管理
qstat- 意味: ジョブの状況を確認します.
qw(Queued/Waiting): キューで待機中.r(Running): 計算ノードで実行中.
qdel [ジョブID]- 意味: 待機中または実行中のジョブをキャンセル(削除)します.
6. 重要Tips
- 課金の仕組み: 課金は「
-l h_rt=24:00:00(リクエストした最大時間)」ではなく,「ジョブが計算ノードで開始してから終了するまでの実時間」に対して発生します.10秒でImportErrorで失敗した場合,課金は約10秒分です(24時間分ではありません). set -eの活用: ジョブスクリプトの先頭にset -eを書くことで,module loadのタイポやImportErrorが発生した瞬間にジョブが停止し,無駄な待ち時間と計算資源の消費を防げます.