目次

AWS Parallel Computing Service(PCS)完全ガイド v2.0(2026年最新対応)

HPC クラスター完全マネージド・科学技術計算ワークロード自動スケール実行プラットフォーム

AWS Parallel Computing Service(AWS PCS) は、「HPC(ハイパフォーマンスコンピューティング)クラスターを完全マネージドで構築・管理するサービス」 である。Slurm ジョブスケジューラーを標準搭載し、シミュレーション・ゲノミクス・気象予測・CFD(流体力学解析)・分子動力学等の科学技術計算ワークロードを EC2 HPC インスタンスで自動スケール実行。EFA(Elastic Fabric Adapter)で MPI 通信を低レイテンシ化。2024年 GA、2025年に Slurm 拡張カスタマイズ・動的クラスター更新対応。


目次

  1. ドキュメントメタデータ
  2. 本質・課題・特徴
  3. このサービスを選ぶ理由
  4. アーキテクチャと設計原則
  5. コアコンポーネント
  6. 主要ユースケース
  7. 設定・操作の具体例
  8. 類似サービス比較表
  9. ベストプラクティス
  10. トラブルシューティング表
  11. 2025-2026 最新動向
  12. 学習リソース・参考文献
  13. 実装例・チェックリスト
  14. まとめ

ドキュメントメタデータ

  • 最終更新: 2026-04-27
  • バージョン: v2.0
  • 対象者: HPC Administrator、Computational Scientist、SimulationEngineer、Climate Researcher、Bioinformatics Lead
  • 難易度: 上級~エンタープライズレベル
  • 関連サービス: EC2、EFA、FSx for Lustre、Lambda、CloudWatch、S3、IAM
  • 提供開始: 2024年(GA)、2025年に Slurm 拡張・Dynamic Cluster Update 実装

本質・課題・特徴

本質

AWS Parallel Computing Service は 「HPC クラスター管理の複雑さを完全排除」 である:

  • Slurm 完全統合:既存 HPC ユーザーの学習コストゼロ(Slurm 知識のみで運用)
  • 完全マネージド:ノードスケーリング・ジョブスケジューリング・パッチ適用を自動化
  • EFA 統合:超低レイテンシ MPI 通信で タイトカップリングジョブを効率実行
  • スポット統合:中断耐性ジョブでコスト最大 90% 削減
  • 2025新機能:Slurm カスタマイズ(60+ パラメータ)・動的クラスター更新
  • Lustre/EBS ストレージ統合:高速 I/O・並列ファイルシステム対応

従来の課題

課題 従来方式(AWS ParallelCluster / 自社構築) AWS PCS による解決
Slurm 設定・管理 JSON テンプレート・複雑なカスタマイズ コンソール UI で簡単設定
ノード自動スケーリング EC2 Auto Scaling 手動設定が必要 自動統合(Slurm と統期待)
MPI 通信最適化 EFA セットアップが複雑 デフォルト有効化
ストレージ管理 FSx / EBS の別途設定 統合ストレージ構成
パッチ・アップデート 手動実施→ダウンタイム発生 自動ローリングアップデート
監視・ロギング Prometheus・Syslog 自前構築 CloudWatch 統合
複数リージョン展開 テンプレート複製→管理負荷 複数リージョン簡単複製

特徴

  1. Cluster サイズ選択:Small(32ノード)/ Medium(512ノード)/ Large(2048ノード)
  2. Compute Node Group:複数インスタンスタイプ・混在構成可能
  3. Queue(キュー):ジョブの優先度・リソース要件で分類実行
  4. Slurm v25.05 対応:最新版 Slurm 機能(2025対応)
  5. EFA・Lustre 統合:MPI・高速 I/O 最適化
  6. スポット統合:中断耐性ジョブで 90% コスト削減

このサービスを選ぶ理由

AWS PCS が必須な理由

  1. HPC クラスター管理の完全自動化

    • AWS ParallelCluster では JSON テンプレート・Slurm 設定を手動編集
    • AWS PCS はコンソール UI で ノード数・インスタンス型・キュー設定が可能
    • オンプレ HPC 管理者の学習コスト最小化
  2. スケーリングの自動化

    • Slurm ジョブキュー → 自動的に EC2 インスタンス起動
    • オンデマンド+スポットの混在で コスト最適化
    • min=0(未使用時 0 円)から max=256 まで自動スケール
  3. 2025年の拡張機能

    • Slurm カスタマイズ:60+ パラメータで詳細制御
    • Dynamic Cluster Update:クラスター再構築なしで設定変更可能
    • Queue-specific Slurm Settings:キュー別に細粒度制御
  4. EFA・Lustre 標準統合

    • 超低レイテンシ MPI 通信(イーサネット比 10~100 倍高速)
    • 並列ファイルシステム Lustre で I/O ボトルネック解決
    • ノード間通信最適化が自動実施
  5. コスト削減最大化

    • 中断耐性ワークロード:スポット 90% 割引
    • オンデマンド+スポットハイブリッド で平均 50~70% 削減

具体的なユースケース

  1. 気候・気象シミュレーション

    • WRF(Weather Research & Forecasting)・CESM(Community Earth System Model)
    • 大気大循環モデルを数千ノード並列計算
  2. CFD(計算流体力学)解析

    • OpenFOAM・Ansys Fluent での自動車エアロダイナミクス・航空設計
    • 複雑形状の流体・構造解析
  3. 分子動力学シミュレーション

    • GROMACS・AMBER での創薬・材料科学研究
    • タンパク質フォールディング・分子相互作用計算
  4. ゲノム解析パイプライン

    • BWA(Burrows-Wheeler Aligner)・GATK(Genome Analysis Toolkit)
    • WGS(全ゲノムシーケンシング)・RNA-seq の並列処理
  5. 石油・ガス探鉱の地震波形解析

    • RTM(Reverse Time Migration)・FWI(Full Waveform Inversion)
    • 大規模地震波形データの高速処理
  6. 機械学習モデル並列トレーニング

    • PyTorch・TensorFlow での分散トレーニング
    • HPC クラスターで数千 GPU 活用
  7. 金融モデリング・リスク計算

    • Monte Carlo シミュレーション・ポートフォリオ最適化
    • 金融商品の複雑リスク評価
  8. 宇宙シミュレーション・粒子系

    • N-body シミュレーション・宇宙形成モデル
    • 天文物理研究の大規模計算
  9. エンタープライズ利用

    • 大企業の製造・自動車・航空 CAE 負荷
    • クラウド HPC で突発的な計算需要に対応
  10. 大学・研究機関

    • 学位論文・科研費プロジェクトの計算基盤
    • HA-Large スケールでの研究支援

アーキテクチャと設計原則

クラスター全体構成

graph TB
    A["User Job Submission<br/>sbatch job.slurm"] -->|Slurm Protocol| B["Head Node<br/>Slurm Controller<br/>slurmctld"]
    
    B -->|Job Scheduling| C["Compute Node Group 1<br/>Instance Type: c7g.16xlarge<br/>Count: 10"]
    B -->|Job Scheduling| D["Compute Node Group 2<br/>Instance Type: hpc7a.48xlarge<br/>Count: 20"]
    B -->|Job Scheduling| E["Spot Instance Group<br/>c7g.metal (Interruptible)<br/>Max 50"]
    
    C & D & E -->|EFA<br/>Low Latency<br/>MPI| F["Network<br/>EFA Enabled<br/>100Gbps"]
    
    G["Storage"] -->|S3| H["Input Data"]
    G -->|FSx Lustre| I["Working Data<br/>High Throughput"]
    G -->|EBS GP3| J["Node Root<br/>120 IOPS"]
    
    C & D & E -->|Read/Write| I
    B -->|Monitoring| K["CloudWatch<br/>CPU/Memory/Job Stats"]
    K -->|Alerts| L["SNS<br/>Email/Slack"]

Slurm ジョブ実行フロー

1. User Submission:
   sbatch job.slurm
   ↓
2. Queue Assignment:
   SLURM Controller がジョブをキューに追加
   ↓
3. Node Selection:
   - インスタンスタイプ確認(hpc7a vs c7g)
   - スポット vs オンデマンド選択
   ↓
4. Auto Scaling:
   min=0 から max=256 へ EC2 インスタンス起動
   ↓
5. Node Boot:
   ~30秒で OS 起動・HPC ドライバインストール
   ↓
6. Job Start:
   Slurm が各ノードで srun/mpirun 実行
   ↓
7. MPI Execution:
   EFA で ノード間通信(<1μs latency)
   ↓
8. Output:
   結果を S3/Lustre に保存
   ↓
9. Auto Scale Down:
   idletime > 10分で EC2 インスタンス終了(min=0 状態へ)

コアコンポーネント

1. Cluster 作成・管理

# Cluster 作成(コンソール UI or AWS CLI)
aws pcs create-cluster \
  --cluster-name "climate-simulation-cluster" \
  --scheduler-name "slurm" \
  --compute-node-groups '[
    {
      "name": "hpc-compute",
      "instance-type": "hpc7a.48xlarge",
      "desired-count": 20,
      "min-count": 0,
      "max-count": 256,
      "subnet-id": "subnet-xxxxx",
      "security-group-ids": ["sg-xxxxx"]
    },
    {
      "name": "gpu-compute",
      "instance-type": "g5.48xlarge",
      "desired-count": 4,
      "min-count": 0,
      "max-count": 32,
      "gpu-enabled": true
    },
    {
      "name": "spot-compute",
      "instance-type": "c7g.metal",
      "desired-count": 0,
      "max-count": 50,
      "purchase-option": "SPOT",
      "max-price": "0.50"
    }
  ]' \
  --storage-configuration '{
    "lustre-file-system": {
      "size-gib": 1200,
      "per-unit-throughput": 500
    }
  }' \
  --region us-west-2

# Cluster 詳細確認
aws pcs describe-cluster --cluster-id c-xxxxx

# Cluster 削除
aws pcs delete-cluster --cluster-id c-xxxxx

2. Queue(ジョブキュー)設定

# Queue 作成(優先度・リソース制約)
aws pcs create-queue \
  --cluster-id "c-xxxxx" \
  --queue-name "high-priority" \
  --description "Fast turnaround jobs" \
  --priority 100 \
  --compute-node-group-assignments '[
    {
      "compute-node-group-name": "hpc-compute",
      "weight": 2
    },
    {
      "compute-node-group-name": "gpu-compute",
      "weight": 1
    }
  ]' \
  --slurm-queue-configuration '{
    "MaxNodes": 100,
    "DefaultCpuPerTask": 1,
    "MaxWallTime": "01:00:00"
  }' \
  --region us-west-2

# Queue 一覧確認
aws pcs list-queues --cluster-id c-xxxxx

# Queue 設定更新(2025新機能:Dynamic Update)
aws pcs update-queue \
  --cluster-id c-xxxxx \
  --queue-name "high-priority" \
  --slurm-queue-configuration '{
    "MaxNodes": 200,
    "DefaultCpuPerTask": 2,
    "MaxWallTime": "02:00:00"
  }'

3. Slurm ジョブ投入・管理

# Head Node に SSH 接続
ssh ec2-user@<head-node-ip> -i key.pem

# ジョブスクリプト例(CFD 解析)
cat > cfd-job.slurm << 'EOF'
#!/bin/bash
#SBATCH --job-name=openfoam-airfoil
#SBATCH --partition=hpc-compute      # Compute Node Group
#SBATCH --nodes=16
#SBATCH --ntasks-per-node=48         # 48 cores per node
#SBATCH --time=04:00:00
#SBATCH --output=%x-%j.log

# Module load
module load intel-oneapi-compilers
module load openfoam

# Set MPI environment
export I_MPI_FABRICS=shm:ofa        # Shared memory + OFA(EFA)
export I_MPI_FALLBACK_DEVICE=disable

# OpenFOAM simulation
mpirun -np 768 snappyHexMesh -parallel -overwrite
mpirun -np 768 simpleFoam -parallel -overwrite

# Copy results to S3
aws s3 cp postProcessing/ s3://my-cfd-results/openfoam-airfoil-$(date +%Y%m%d)/ --recursive
EOF

# ジョブ投入
sbatch cfd-job.slurm

# ジョブ状態確認
squeue

# ジョブ詳細確認
scontrol show job <job-id>

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

# パーティション(Compute Node Group)確認
sinfo

# ノード状態確認
sinfo -N -l

4. Slurm カスタマイズ(2025新機能)

# Slurm グローバル設定の上書き(60+ パラメータ)
aws pcs update-cluster \
  --cluster-id "c-xxxxx" \
  --slurm-configuration '{
    "SchedTimeSliceLength": "600",          # デフォルト 30秒 → 10分に変更
    "PriorityDecayHalfLife": "7-00:00:00",  # 優先度減衰期間(1週間)
    "PriorityFavorSmallJobs": "YES",        # 小規模ジョブ優遇
    "MaxJobCount": "10000",                  # 同時ジョブ最大数
    "SelectTypeParameters": "CR_Core_Memory" # Core + Memory リソース管理
  }' \
  --region us-west-2

# Queue 別 Slurm 設定(細粒度制御)
aws pcs update-queue \
  --cluster-id "c-xxxxx" \
  --queue-name "batch-queue" \
  --slurm-queue-configuration '{
    "MaxCpusPerNode": 48,
    "MaxMemoryPerNode": 512000,             # MB(512GB)
    "MaxWallTime": "72:00:00",
    "Preempt": "CANCEL",                    # 優先度高いジョブで中断
    "PreemptMode": "CANCEL"
  }' \
  --region us-west-2

5. ストレージ構成・I/O 最適化

# FSx Lustre(高速並列ファイルシステム)統合
aws pcs create-cluster \
  --cluster-name "lustre-cluster" \
  --storage-configuration '{
    "lustre-file-system": {
      "capacity-gib": 2400,
      "per-unit-throughput": 500,          # 500 MB/s per TiB
      "mount-point": "/lustre",
      "import-path": "s3://my-data-bucket/input/",
      "export-path": "s3://my-data-bucket/output/"
    }
  }' \
  --region us-west-2

# クラスターから S3 直接アクセス(Data Transfer Gateway)
aws s3 cp /lustre/results/ s3://my-results-bucket/ --recursive --parallel=8

# I/O パフォーマンステスト
ssh <head-node> "module load ior; ior -w -r -o /lustre/testfile"

6. CloudWatch 監視・ロギング

import boto3
import json

cloudwatch = boto3.client('cloudwatch')
pcs = boto3.client('pcs')

def monitor_cluster_health(cluster_id):
    """クラスター健全性監視"""
    
    # CloudWatch メトリクス取得
    metrics = cloudwatch.get_metric_statistics(
        Namespace='AWS/PCS',
        MetricName='RunningJobCount',
        Dimensions=[
            {'Name': 'ClusterId', 'Value': cluster_id}
        ],
        StartTime=datetime.now() - timedelta(hours=1),
        EndTime=datetime.now(),
        Period=300,
        Statistics=['Average', 'Maximum']
    )
    
    print(f"Running jobs: {metrics['Datapoints']}")
    
    # Active Node Count
    node_metrics = cloudwatch.get_metric_statistics(
        Namespace='AWS/PCS',
        MetricName='ActiveNodeCount',
        Dimensions=[{'Name': 'ClusterId', 'Value': cluster_id}],
        StartTime=datetime.now() - timedelta(hours=1),
        EndTime=datetime.now(),
        Period=300,
        Statistics=['Average']
    )
    
    # Compute Node Group 別のメトリクス
    groups = pcs.describe_cluster(cluster_id=cluster_id)['Cluster']['ComputeNodeGroups']
    
    for group in groups:
        group_metrics = cloudwatch.get_metric_statistics(
            Namespace='AWS/PCS',
            MetricName='IdleNodeCount',
            Dimensions=[
                {'Name': 'ClusterId', 'Value': cluster_id},
                {'Name': 'ComputeNodeGroup', 'Value': group['Name']}
            ],
            StartTime=datetime.now() - timedelta(hours=1),
            EndTime=datetime.now(),
            Period=300,
            Statistics=['Average']
        )
        
        print(f"Node Group {group['Name']}: {group_metrics['Datapoints']}")

主要ユースケース(詳細版)

UC1: 大規模気象シミュレーション(WRF)

# WRF(Weather Research & Forecasting)クラスター構成
cat > wrf-cluster.yaml << 'EOF'
ClusterName: weather-simulation-cluster

ComputeNodeGroups:
  - Name: hpc-nodes
    InstanceType: hpc7a.48xlarge    # 48 cores, EFA enabled
    MinCount: 0
    DesiredCount: 0
    MaxCount: 256                   # 最大 256 ノード × 48 = 12,288 cores

Queues:
  - Name: wrf-queue
    Priority: 100
    MaxWallTime: "12:00:00"
    DefaultCpuPerTask: 1
    MaxNodes: 128

StorageConfiguration:
  LustreFileSystem:
    CapacityGib: 3600               # 3.6 PB
    ThroughputPerUnit: 500          # 500 MB/s per TiB
    ImportPath: "s3://weather-data/input/"
    ExportPath: "s3://weather-data/output/"
EOF

# WRF ジョブスクリプト
cat > wrf-job.slurm << 'EOF'
#!/bin/bash
#SBATCH --job-name=wrf-simulation
#SBATCH --partition=wrf-queue
#SBATCH --nodes=128
#SBATCH --ntasks-per-node=48
#SBATCH --time=12:00:00
#SBATCH --output=wrf-%j.log

module load intel-oneapi-compilers intel-oneapi-mpi
module load hdf5/1.12 netcdf-c/4.8 wrf/4.3

# WRF namelist 準備
cd /lustre/wrf-run
cp /lustre/template/namelist.input .

# WRF シミュレーション実行
mpirun -np 6144 wrf.exe

# 結果を S3 に保送
aws s3 cp wrfout* s3://weather-data/output/run-$(date +%Y%m%d-%H%M%S)/ --recursive
EOF

# クラスター起動→ジョブ投入→自動終了
aws pcs create-cluster --cluster-config wrf-cluster.yaml
sbatch wrf-job.slurm
# 12時間後、自動的にノード終了(min=0)

UC2-10: 他の主要ユースケース

UC2: CFD(Fluent・OpenFOAM)

  • 自動車・航空機設計のエアロダイナミクス解析
  • 数千ノード×数日の並列実行

UC3: ゲノム解析(GATK・BWA)

  • WGS データ 1000 サンプルの並列処理
  • ストレージ最適化で I/O ボトルネック解決

UC4: 分子動力学(GROMACS・AMBER)

  • タンパク質フォールディング・薬物相互作用
  • 数週間の MD シミュレーション

UC5: 地震波形解析(RTM・FWI)

  • 石油・ガス探鉱の反時間マイグレーション
  • ペタスケールデータ処理

UC6: 機械学習(PyTorch 分散トレーニング)

  • 数千 GPU での大規模モデル学習
  • 異種リソース(CPU/GPU)混在

UC7: 金融シミュレーション

  • Monte Carlo・VaR 計算の並列化
  • リスク評価時間を 1 日→1 時間に短縮

UC8: 量子化学シミュレーション

  • 新材料・触媒の量子計算
  • Gaussian・ORCA の並列実行

UC9: スパコンセンター代替

  • 大学・国立研究機関の計算基盤
  • オンプレ投資→クラウド OPEX へ転換

UC10: デジタルツインシミュレーション

  • 自動車・工場のリアルタイムシミュレーション
  • 数百回/日の高速パラメータスイープ

設定・操作の具体例

CLI・SDK での操作

# クラスター一覧
aws pcs list-clusters --region us-west-2

# クラスター詳細
aws pcs describe-cluster --cluster-id c-xxxxx

# Queue 一覧
aws pcs list-queues --cluster-id c-xxxxx

# Compute Node Group スケーリング
aws pcs update-compute-node-group \
  --cluster-id c-xxxxx \
  --compute-node-group-id ng-xxxxx \
  --desired-count 50

# ノード情報(Slurm より)
sinfo -N -l --state=allocated,idle

# ジョブ統計
sacct --format=JobID,JobName,Start,End,Elapsed,CPUTime,NodeList,State --starttime=2026-04-27

Python SDK での実装例

import boto3
import subprocess
import time

pcs = boto3.client('pcs', region_name='us-west-2')
ec2 = boto3.client('ec2', region_name='us-west-2')

class HPCClusterManager:
    def __init__(self, cluster_id, head_node_ip):
        self.cluster_id = cluster_id
        self.head_node_ip = head_node_ip
    
    def submit_batch_jobs(self, job_scripts, queue_name='default'):
        """複数ジョブをバッチ投入"""
        
        job_ids = []
        
        for script in job_scripts:
            # Head Node に SSH で ジョブ投入
            cmd = f"ssh ec2-user@{self.head_node_ip} 'sbatch {script}'"
            result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
            
            job_id = result.stdout.strip().split()[-1]
            job_ids.append(job_id)
            print(f"Submitted job {job_id}")
        
        return job_ids
    
    def monitor_jobs(self, job_ids, poll_interval=30):
        """ジョブ進捗監視"""
        
        while job_ids:
            cmd = f"ssh ec2-user@{self.head_node_ip} 'squeue'"
            result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
            
            running_jobs = set(line.split()[0] for line in result.stdout.split('\n')[1:] if line.strip())
            
            completed = [jid for jid in job_ids if jid not in running_jobs]
            if completed:
                print(f"Completed: {completed}")
                job_ids = [jid for jid in job_ids if jid not in completed]
            
            print(f"Still running: {job_ids}")
            time.sleep(poll_interval)
    
    def get_cluster_metrics(self):
        """クラスター健全性メトリクス取得"""
        
        cluster_info = pcs.describe_cluster(cluster_id=self.cluster_id)
        
        metrics = {
            'cluster_name': cluster_info['Cluster']['Name'],
            'scheduler': cluster_info['Cluster']['SchedulerName'],
            'compute_node_groups': [
                {
                    'name': group['Name'],
                    'instance_type': group['InstanceType'],
                    'desired_count': group['DesiredCount'],
                    'min_count': group['MinCount'],
                    'max_count': group['MaxCount']
                }
                for group in cluster_info['Cluster']['ComputeNodeGroups']
            ]
        }
        
        return metrics

# 使用例
manager = HPCClusterManager('c-xxxxx', '10.0.1.50')

# ジョブ投入
scripts = ['job1.slurm', 'job2.slurm', 'job3.slurm']
job_ids = manager.submit_batch_jobs(scripts)

# 進捗監視
manager.monitor_jobs(job_ids)

# メトリクス確認
metrics = manager.get_cluster_metrics()
print(metrics)

IaC(Terraform / CloudFormation)での構成例

# Terraform での AWS PCS クラスター定義

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "us-west-2"
}

# VPC・Security Group
resource "aws_vpc" "hpc_vpc" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
  enable_dns_support   = true
  
  tags = {
    Name = "hpc-vpc"
  }
}

resource "aws_security_group" "hpc_sg" {
  name        = "hpc-cluster-sg"
  description = "Security group for HPC cluster"
  vpc_id      = aws_vpc.hpc_vpc.id
  
  ingress {
    from_port   = 0
    to_port     = 65535
    protocol    = "tcp"
    cidr_blocks = ["10.0.0.0/16"]
  }
  
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

# Subnet
resource "aws_subnet" "hpc_subnet" {
  vpc_id                  = aws_vpc.hpc_vpc.id
  cidr_block              = "10.0.1.0/24"
  availability_zone       = "us-west-2a"
  map_public_ip_on_launch = true
}

# FSx Lustre(高速並列ファイルシステム)
resource "aws_fsx_lustre_file_system" "hpc_lustre" {
  storage_capacity            = 2400
  throughput_capacity         = 500
  subnet_ids                  = [aws_subnet.hpc_subnet.id]
  security_group_ids          = [aws_security_group.hpc_sg.id]
  import_path                 = "s3://my-hpc-data/input"
  export_path                 = "s3://my-hpc-data/output"
  import_policy_block_size    = 512
  weekly_maintenance_start_time = "1:00:00"
  
  tags = {
    Name = "hpc-lustre"
  }
}

# IAM Role(クラスターがアクセス可能にする)
resource "aws_iam_role" "hpc_cluster_role" {
  name = "hpc-cluster-role"
  
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Principal = {
          Service = "pcs.amazonaws.com"
        }
        Action = "sts:AssumeRole"
      },
      {
        Effect = "Allow"
        Principal = {
          Service = "ec2.amazonaws.com"
        }
        Action = "sts:AssumeRole"
      }
    ]
  })
}

# IAM Policy(S3・FSx・CloudWatch アクセス)
resource "aws_iam_role_policy" "hpc_cluster_policy" {
  name = "hpc-cluster-policy"
  role = aws_iam_role.hpc_cluster_role.id
  
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Action = [
          "s3:GetObject",
          "s3:PutObject",
          "s3:ListBucket"
        ]
        Resource = [
          "arn:aws:s3:::my-hpc-data/*",
          "arn:aws:s3:::my-hpc-data"
        ]
      },
      {
        Effect = "Allow"
        Action = [
          "fsx:DescribeFileSystems",
          "fsx:DescribeDataRepositoryAssociations"
        ]
        Resource = "*"
      },
      {
        Effect = "Allow"
        Action = [
          "cloudwatch:PutMetricData",
          "logs:CreateLogGroup",
          "logs:CreateLogStream",
          "logs:PutLogEvents"
        ]
        Resource = "*"
      }
    ]
  })
}

# CloudWatch Log Group
resource "aws_cloudwatch_log_group" "hpc_logs" {
  name              = "/aws/pcs/hpc-cluster"
  retention_in_days = 30
}

# CloudWatch Alarm(ジョブキューイング警告)
resource "aws_cloudwatch_metric_alarm" "job_queue_high" {
  alarm_name          = "pcs-job-queue-high"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = 2
  metric_name         = "PendingJobCount"
  namespace           = "AWS/PCS"
  period              = 300
  statistic           = "Average"
  threshold           = 100
  alarm_description   = "Alert when job queue exceeds 100"
  alarm_actions       = [aws_sns_topic.hpc_alerts.arn]
  
  dimensions = {
    ClusterId = "c-xxxxx"  # 実際のクラスター ID に置き換え
  }
}

# SNS Topic(アラート)
resource "aws_sns_topic" "hpc_alerts" {
  name = "hpc-cluster-alerts"
}

output "lustre_dns_name" {
  value       = aws_fsx_lustre_file_system.hpc_lustre.dns_name
  description = "FSx Lustre DNS name"
}

output "vpc_id" {
  value       = aws_vpc.hpc_vpc.id
  description = "VPC ID for HPC cluster"
}

類似サービス比較表

項目 AWS PCS AWS ParallelCluster Azure CycleCloud GCP HPC Toolkit Slurm Self-Managed
Slurm 統合 ◎ 標準装備・管理画面有 ◎ テンプレート式 △ 手動設定 △ 限定的 ◎ 完全カスタマイズ
管理UI ◎ AWS コンソール △ CloudFormation △ Web UI △ CLI のみ △ Web UI(別途)
自動スケーリング ◎ Slurm 統合 △ EC2 Auto Scaling △ カスタム実装 △ 基本的 △ スクリプト
EFA 統合 ◎ デフォルト有効 ○ サポート △ 限定的 △ 限定的 △ 別途設定
ストレージ統合 ◎ Lustre/EBS ○ FSx サポート ◎ 統合 ◎ 統合 △ 別途構築
スポット統合 ◎ ハイブリッド ○ サポート ◎ 統合 ◎ 統合 △ スクリプト
CloudWatch 統合 ◎ 標準メトリクス ○ 基本実装 △ 限定的 △ Stackdriver △ Prometheus 必要
Slurm カスタマイズ ◎ 60+ パラメータ(2025) ○ 基本設定 ○ ある程度可能 △ 限定的 ◎ 完全カスタマイズ
マネージド度 ◎ 完全マネージド △ 半自動 △ 半自動 △ 部分的 △ 自社運用
導入期間 ◎ 1日 ○ 3~7日 ○ 3~7日 △ 1~2週間 △ 2~4週間

ベストプラクティス

✅ 推奨事項

  1. Compute Node Group 複数構成

    - HPC Optimized Group(hpc7a):タイトカップリングジョブ
    - General Purpose Group(c7g):中程度結合
    - GPU Group(g5):GPU ワークロード
    - Spot Group:中断耐性ジョブ
    
  2. キューの適切な設計

    - high-priority:4時間以内、少数ノード
    - batch:24時間以内、大規模
    - long-running:72時間、特定用途
    - spot-only:スポット専用(90% 割引)
    
  3. ストレージ戦略

    • Input Data:S3 Standard(低アクセス) → 定期的に Lustre へ
    • Working Data:FSx Lustre(高スループット I/O)
    • Output Data:S3 に自動エクスポート→ Lustre 削除(自動ライフサイクル)
  4. スケーリング最適化

    # Job Dependency で 効率的 スケーリング
    sbatch --job-name=preprocess preprocess.slurm
    sbatch --dependency=afterok:$JOBID --job-name=simulate simulate.slurm
    sbatch --dependency=afterok:$JOBID --job-name=postprocess postprocess.slurm
    
  5. コスト監視

    • CloudWatch で Job Duration・Node Utilization 追跡
    • Spot 中断イベントの監視・リトライ対応

❌ アンチパターン

  1. すべてのジョブを max-count で起動

    ❌ 不適切:min=0 設定したのに max=256 で全ノード起動
    ✅ 推奨:desired-count=0、キュー待機→必要に応じて自動起動
    
  2. ストレージ戦略不備

    ❌ 危険:全データを Lustre に保持(高額)
    ✅ 推奨:S3 → Lustre(作業中) → S3 エクスポート
    
  3. Slurm アカウント管理なし

    ❌ 不適切:課金管理ができない
    ✅ 推奨:sacctmgr で部門別アカウント・QOS 設定
    

トラブルシューティング表

症状 原因 対処法
ノードが起動しない ネットワーク・IAM 権限・AZ キャパシティ不足 VPC・Security Group・IAM Role 確認
ジョブが Pending のまま キュー設定・リソース不足・Slurm Hold squeue -l で理由確認、キュー優先度確認
MPI 通信遅い EFA 非有効・Switch Fabric 未設定 sinfo で EFA 確認、ノード親和性設定
Lustre マウント失敗 FSx 容量不足・ネットワーク断 Lustre キャパシティ確認、再マウント
S3 エクスポート遅い I/O スループット不足・オブジェクト数多 DataSync で並列転送、オブジェクト集約
スポット中断頻発 入札額低すぎ・インスタンスタイプ人気 max-price 上げる、インスタンスタイプ変更
Slurm Controller クラッシュ Head Node リソース枯渇・バグ Head Node インスタンス型アップグレード

2025-2026 最新動向

1. Slurm 拡張カスタマイズ(2025年実装)

  • 60+ パラメータでの詳細制御
  • キュー別 Slurm 設定(細粒度)

2. Dynamic Cluster Update(2025年実装)

  • クラスター再構築なしで設定変更可能
  • ゼロダウンタイム更新

3. Slurm v25.05 対応(2025年対応)

  • 最新 Slurm 機能・バグ修正

4. Advanced Scheduling オプション

  • 複数クラスター間のジョブ分散
  • Cross-Region Job Submission

5. GPU Cluster 統合強化

  • NVIDIA NCCL・PyTorch 分散最適化
  • Multi-GPU Node 統合管理

学習リソース・参考文献

公式ドキュメント

  1. AWS Parallel Computing Service User Guide
  2. AWS PCS Best Practices
  3. Slurm Documentation
  4. AWS HPC Blog

HPC リソース・ツール

  1. Slurm Workload Manager
  2. Open MPI Documentation
  3. Intel MPI Library
  4. AWS ParallelCluster

実装例・チェックリスト

HPC Cluster デプロイメント チェックリスト

## AWS PCS クラスター構築チェック

### インフラ準備
- [ ] VPC・Subnet 作成
- [ ] Security Group 設定(ノード間通信許可)
- [ ] IAM Role・Policy 作成
- [ ] FSx Lustre ファイルシステム作成
- [ ] S3 バケット(Input/Output)準備

### Cluster 構成
- [ ] Compute Node Group 定義(HPC/GPU/Spot)
- [ ] Queue 設計(優先度・リソース制約)
- [ ] Slurm パラメータ設定(2025カスタマイズ)
- [ ] Storage マウントポイント確認

### デプロイ
- [ ] AWS コンソール or Terraform で Cluster 作成
- [ ] Head Node SSH 接続確認
- [ ] sinfo で Partition 確認
- [ ] Lustre マウント確認(df -h /lustre)

### テスト実行
- [ ] サンプルジョブ投入(sbatch sample.slurm)
- [ ] ノードの自動起動確認
- [ ] MPI 通信テスト(IMB-MPI1)
- [ ] I/O パフォーマンステスト(ior)
- [ ] S3 エクスポート動作確認

### 監視・最適化
- [ ] CloudWatch Dashboard 作成
- [ ] Alarms 設定(ジョブキュー・ノード稼働率)
- [ ] Cost anomaly detection 有効化
- [ ] Slurm acct 統計レポート生成

### ドキュメント
- [ ] Cluster 構成図作成
- [ ] ユーザーハンドブック(ジョブ投入マニュアル)
- [ ] トラブルシューティングガイド
- [ ] Backup・Disaster Recovery プラン

まとめ

AWS Parallel Computing Service は HPC 計算の完全クラウド化を実現 する:

  • Slurm 統合:既存 HPC ユーザーの学習コストゼロ
  • 完全マネージド:ノード管理・スケーリング・パッチ自動化
  • コスト最適化:スポット統合で 90% 削減、min=0 で未使用時無料
  • 2025年拡張:Slurm カスタマイズ・Dynamic Update で運用柔軟化
  • エンタープライズ対応:FSx Lustre・CloudWatch・IAM 統合

次のステップ

  1. VPC・Security Group 準備
  2. Cluster サイズ・インスタンスタイプ選定
  3. AWS コンソール or Terraform で構築
  4. サンプルジョブで動作確認
  5. 本番ワークロード段階的移行

最終更新:2026-04-27 バージョン:v2.0