コンテンツにスキップ

EvoSpikeNet HPC環境セットアップガイド

[!NOTE] 最新の実装状況は 機能実装ステータス (Remaining Functionality) を参照してください。

概要

このガイドでは、SlurmとEnroot/Pyxisを使用するHPCクラスタ環境でEvoSpikeNetを動作させる方法を説明します。

環境仕様

コンテナ実行基盤

  • ジョブスケジューラ: Slurm 21.08.8+
  • コンテナランタイム: Enroot/Pyxis
  • コンテナレジストリ: NVIDIA NGC Private Registry (セキュリティスキャン必須)

ストレージ構成

ストレージ名 マウントポイント 用途 特記事項
ローカルストレージ /raid コンテナ配置・起動 RAID0構成、永続保管不可
メインストレージ /lustre 学習データ、高速IO Lustreファイルシステム
ホーム領域 /home/[username] プロジェクトコード ユーザー単位で払い出し
データストア /store バックアップ ログインサーバーのみアクセス可

セットアップ手順

1. ストレージ構造の作成

ログインサーバーで以下を実行:

cd /path/to/EvoSpikeNet
bash slurm/setup_storage.sh

作成されるディレクトリ構造:

/lustre/${USER}/
├── evospikenet/          # プロジェクトコード
├── containers/           # コンテナイメージ(.sqsh)
├── data/                # 学習データ
├── output/              # 学習結果・モデル
├── logs/                # ログファイル
├── checkpoints/         # チェックポイント
└── artifacts/           # その他成果物

/home/${USER}/
├── project -> /lustre/${USER}/evospikenet  # シンボリックリンク
├── data -> /lustre/${USER}/data
├── output -> /lustre/${USER}/output
├── scripts/             # 個人用スクリプト
└── configs/             # 個人用設定

/store/${USER}/
├── backups/             # バックアップ
├── models/              # アーカイブ済みモデル
├── datasets/            # データセットバックアップ
└── archive/             # その他アーカイブ

2. プロジェクトコードのアップロード

ログインサーバーで:

# プロジェクトをLustreにクローン
cd /lustre/${USER}
git clone https://github.com/your-org/EvoSpikeNet.git evospikenet
cd evospikenet

# または、scpでアップロード
scp -r /local/path/to/EvoSpikeNet user@login-server:/lustre/${USER}/evospikenet

3. コンテナイメージのビルドとデプロイ

重要: HPCクラスタ環境にはDockerがインストールされていないため、コンテナのビルドはローカルマシンまたはDockerが利用可能な別のビルドサーバーで行う必要があります。

3.1 ローカルマシン/ビルドサーバーでの作業

Dockerがインストールされているマシンで実行:

# NGC Private Registryにログイン
docker login nvcr.io

# コンテナのビルドとプッシュ
cd /path/to/EvoSpikeNet

# 事前に設定を編集
# NGC_REGISTRY="nvcr.io/your-org/your-private-registry" を実際の値に変更
vim slurm/build_and_deploy_container.sh

# ビルドとプッシュを実行
bash slurm/build_and_deploy_container.sh

代替方法: Docker Tarファイル経由でのデプロイ

NGC Private Registryを使用しない場合:

# ローカルマシンでコンテナをビルド
docker build -f Dockerfile.ngc -t evospikenet:latest .

# Tarファイルにエクスポート
docker save evospikenet:latest -o evospikenet-latest.tar

# HPC環境にアップロード
scp evospikenet-latest.tar user@login-server:/lustre/${USER}/containers/

3.2 NGC コンソールでセキュリティスキャン

  1. NGC Private Registryコンソールにアクセス
  2. アップロードされたイメージを確認
  3. セキュリティスキャンが自動実行されるのを待つ
  4. スキャン完了後、脆弱性レポートを確認

3.3 HPC環境へのコンテナインポート

HPCログインサーバーで実行 (Dockerはインストールされていません):

方法A: NGC Private Registry経由 (推奨)

# NGC APIキーの設定 (初回のみ)
export NGC_API_KEY="your-ngc-api-key"

# Enrootでコンテナをインポート (Dockerは不要)
enroot import docker://nvcr.io/your-org/your-private-registry/evospikenet:latest

# .sqshファイルを適切な場所に移動
mv evospikenet+latest.sqsh /lustre/${USER}/containers/evospikenet-ngc.sqsh

# 確認
ls -lh /lustre/${USER}/containers/

方法B: Tarファイル経由

ローカルからアップロードしたTarファイルを使用する場合:

# HPC環境でTarファイルからインポート
enroot import dockerd:///lustre/${USER}/containers/evospikenet-latest.tar

# .sqshファイルを適切な場所に配置
mv evospikenet.sqsh /lustre/${USER}/containers/evospikenet-ngc.sqsh

# Tarファイルは削除可能
rm /lustre/${USER}/containers/evospikenet-latest.tar

# 確認
ls -lh /lustre/${USER}/containers/

4. 環境モジュールの設定

Slurmモジュールのロード:

# 利用可能なモジュールの確認
module avail

# Slurmモジュールのロード
module load slurm/Slurm/21.08.8

# 永続化 (bashの場合)
echo "module load slurm/Slurm/21.08.8" >> ~/.bashrc

5. ジョブスクリプトの設定

5.1 基本的な学習ジョブ

example_training.slurmを編集:

# 必須: メールアドレスの変更
#SBATCH --mail-user=your-email@example.com

# パーティション名の確認・変更
#SBATCH -p gpu-partition  # 実際のパーティション名に変更

実行:

cd /lustre/${USER}/evospikenet
sbatch slurm/example_training.slurm

5.2 インタラクティブJupyter

example_interactive.slurmを使用:

sbatch slurm/example_interactive.slurm

# ジョブの状態確認
squeue -u ${USER}

# ログからJupyter URLを確認
tail -f /lustre/${USER}/logs/jupyter-<job-id>.out

出力例:

Jupyter URL: http://node-01:8888/?token=evospikenet

5.3 マルチノード分散学習

example_batch_experiments.slurmを使用:

sbatch slurm/example_batch_experiments.slurm

ジョブ管理

ジョブの投入

# ジョブの投入
sbatch slurm/example_training.slurm

# インタラクティブジョブ
srun --pty -p gpu-partition -N 1 --gpus-per-node=1 -t 01:00:00 bash

ジョブの監視

# 自分のジョブ一覧
squeue -u ${USER}

# 詳細情報
scontrol show job <job-id>

# リアルタイムログ監視
tail -f /lustre/${USER}/logs/evospikenet-train-<job-id>.out
tail -f /lustre/${USER}/logs/evospikenet-train-<job-id>.err

ジョブの制御

# ジョブのキャンセル
scancel <job-id>

# 全ジョブのキャンセル
scancel -u ${USER}

# ジョブの一時停止
scontrol suspend <job-id>

# ジョブの再開
scontrol resume <job-id>

データ管理

データのアップロード

# ログインサーバー経由でアップロード
scp -r /local/data user@login-server:/lustre/${USER}/data/

# または、rsyncで同期
rsync -avz --progress /local/data/ user@login-server:/lustre/${USER}/data/

バックアップ戦略

ログインサーバーで定期的にバックアップを実行:

#!/bin/bash
# backup_models.sh

SOURCE_DIR="/lustre/${USER}/output/saved_models"
BACKUP_DIR="/store/${USER}/backups/models/$(date +%Y%m%d)"

echo "Backing up models to data store..."
mkdir -p ${BACKUP_DIR}
rsync -avz --progress ${SOURCE_DIR}/ ${BACKUP_DIR}/

echo "Backup completed: ${BACKUP_DIR}"

cronで自動化 (ログインサーバー):

# crontabの編集
crontab -e

# 毎日午前3時にバックアップ
0 3 * * * /home/${USER}/scripts/backup_models.sh >> /home/${USER}/logs/backup.log 2>&1

チェックポイント管理

学習中に定期的にチェックポイントを保存:

# EvoSpikeNet学習コード内
import torch
import os

checkpoint_dir = "/lustre/${USER}/checkpoints"
os.makedirs(checkpoint_dir, exist_ok=True)

# 定期的に保存
if epoch % 10 == 0:
    torch.save({
        'epoch': epoch,
        'model_state_dict': model.state_dict(),
        'optimizer_state_dict': optimizer.state_dict(),
        'loss': loss,
    }, f"{checkpoint_dir}/checkpoint_epoch_{epoch}.pt")

トラブルシューティング

コンテナが起動しない

# コンテナイメージの確認
ls -lh /lustre/${USER}/containers/

# マニュアルテスト
srun --pty -p gpu-partition -N 1 -t 00:10:00 \
    --container-image=/lustre/${USER}/containers/evospikenet-ngc.sqsh \
    bash

GPUが認識されない

# コンテナ内でGPU確認
srun -p gpu-partition -N 1 --gpus-per-node=1 \
    --container-image=/lustre/${USER}/containers/evospikenet-ngc.sqsh \
    nvidia-smi

パーミッションエラー

# Lustreストレージのパーミッション確認
ls -la /lustre/${USER}/

# 必要に応じて修正
chmod 755 /lustre/${USER}/evospikenet
chmod -R u+rwX /lustre/${USER}/evospikenet

ストレージ容量不足

# 容量確認
df -h /lustre
df -h /home/${USER}

# 不要なファイルの削除
find /lustre/${USER}/logs -name "*.out" -mtime +30 -delete
find /lustre/${USER}/output -name "*.tmp" -delete

ベストプラクティス

1. ストレージ使用の最適化

  • ローカルストレージ (/raid): コンテナの一時展開にのみ使用
  • メインストレージ (/lustre): アクティブな学習データと実験結果
  • データストア (/store): 長期保存が必要なモデルとデータセット

2. ジョブ設計

  • 長時間ジョブは適切なチェックポイント機能を実装
  • 実験は小規模で検証してからスケールアップ
  • --exclusiveオプションで専有モードを使用 (GPU性能最大化)

3. リソース効率

# GPUの効率的な利用
#SBATCH --gpus-per-node=8  # ノードの全GPU使用
#SBATCH --exclusive        # ノード専有

# 短時間実験にはtest-partition
#SBATCH -p test-partition
#SBATCH -t 0-00:30:00

4. セキュリティ

  • NGC Private Registryのセキュリティスキャンを必ず実行
  • ホームディレクトリのパーミッションはデフォルトを維持
  • APIキーや認証情報はホームディレクトリに保存 (.ssh/, .config/)

参考コマンド集

Slurm基本コマンド

# パーティション一覧
sinfo

# ノード情報
scontrol show node

# ジョブ履歴
sacct -u ${USER} --format=JobID,JobName,Partition,State,Elapsed,MaxRSS

# ジョブ効率レポート
seff <job-id>

パフォーマンス監視

# GPUサーバーでのリソース監視 (インタラクティブセッション内)
watch -n 1 nvidia-smi

# ジョブのリソース使用状況
sstat -j <job-id> --format=AveCPU,AveRSS,MaxRSS

追加リソース

サポート

問題が発生した場合:

  1. ログファイルを確認: /lustre/${USER}/logs/
  2. ジョブの詳細を確認: scontrol show job <job-id>
  3. システム管理者に連絡 (システム側の問題の場合)

更新日: 2026年1月27日
バージョン: 1.0