← Back to Memo

スパコン利用メモ(ABCI)

これは以前,ABCIと呼ばれるAI学習等に使用されるスパコンを触る機会がありましたので,その際に役に立ったプラクティスです. 共有サーバ独特の作法が必要となるため,環境構築からジョブ実行までの手順を整理します.

1. 基本思想:ログインノードと計算ノード

スパコンは「ログインノード」と「計算ノード」で役割が完全に分かれています. この区別を理解することが最初のステップです.

ノード役割禁止事項 / 特徴
ログインノードSSHで最初に接続する場所。
ファイル編集、コンパイル、pip install、ジョブ投入などに使用.
重い計算(学習など)は禁止.
アカウント停止の対象になる場合があるため注意.
計算ノード実際のAI学習が行われる場所.
A100 GPUなどが搭載されている.
ジョブ管理システム(qsub)経由でのみ利用可能.
ログインノードの環境は引き継がれない(都度ロードが必要).

2. 環境構築:modulevenv

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 が発生した瞬間にジョブが停止し,無駄な待ち時間と計算資源の消費を防げます.