- 1 §1 なぜ Quantum/HPC Vol1 か — 第21軸目起点 + AWS先端アーキテクチャ階層 + ナビ
- 2 §2 Amazon Braket 本番運用 — 量子ハードウェア4種 × Hybrid Jobs × Local Simulator × Cost制御 × Task Queue ★山場1
- 2.1 Amazon Braket 概要 — 古典 API ラッパ + 量子バックエンド統一抽象
- 2.2 量子ハードウェア4種 比較表 (2026年現役機種)
- 2.3 Amazon Braket SDK — Bell State 回路を IonQ / SV1 両バックエンドに投入
- 2.4 Local Simulator 使い分け — SV1 / DM1 / TN1
- 2.5 Hybrid Jobs — 古典 (SageMaker/EC2) × 量子 (QPU) を1ジョブにバンドル
- 2.6 Cost 制御 — Task per Shot 課金 / Reservation / Budget Alert / IAM 制限
- 2.7 Task Queue 設計 — 優先度 / Cancel / Retry / Timeout
- 3 §3 ParallelCluster 本番運用 — Cluster Config × Slurm Scheduler × Auto-scaling × EFA × FSx for Lustre
- 3.1 3-1 ParallelCluster 概要 — CloudFormation バックエンド + pcluster CLI
- 3.2 3-2 Cluster Config — Head node × Compute fleet × Queue 設計
- 3.3 3-3 Slurm Scheduler Tuning — Partition × QoS × Priority
- 3.4 3-4 Auto-scaling — Idle Scale-down × Spot Integration
- 3.5 3-5 EFA — Elastic Fabric Adapter × MPI 高速通信
- 3.6 3-6 FSx for Lustre — Scratch × Persistent × S3 連携 × HSM
- 4 §4 AWS Batch HPC 本番運用 — Compute Environment × Job Queue × Job Definition × Multi-node Parallel × GPU Job
- 4.1 4-1 概要 — ParallelCluster との使い分け基準
- 4.2 4-2 Compute Environment — Managed × Spot × Allocation Strategy
- 4.3 4-3 Job Queue — 優先度 × Compute Environment 多重バインド
- 4.4 4-4 Job Definition — Container × Multi-node Parallel × Parameters 汎用化
- 4.5 4-5 Multi-node Parallel Job — MPI × NCCL × EFA
- 4.6 4-6 GPU Job — Instance Type × NVIDIA Driver × DCGM 監視
- 5 §5 Nitro System 本番運用 — Nitro Card × Hypervisor × Security Chip × Bare Metal × Nitro Enclaves ★山場2
- 5.1 Nitro System 概要 — 仮想化の常識を覆すアーキテクチャ
- 5.2 Nitro Card (専用 ASIC) — 3種の役割分担
- 5.3 Nitro Hypervisor — 旧 Xen EC2 との比較
- 5.4 Nitro Security Chip — Root of Trust
- 5.5 Bare Metal インスタンス — ハイパーバイザーなし物理サーバ直接アクセス
- 5.6 Nitro Enclaves — Confidential Computing の実装
- 5.7 Nitro Enclaves 通信 — vsock (Virtual Socket)
- 5.8 Nitro Enclaves KMS Attestation — Terraform 実装
- 6 §6 詰まりポイント7選 図解 (Mermaid01 判断ツリー)
- 6.1 パターン1: Braket cost runaway — QPU 利用料金が想定の10倍
- 6.2 パターン2: ParallelCluster headnode failure — AZ 障害でクラスタ全停止
- 6.3 パターン3: Slurm tuning 不在 — ジョブ滞留・優先度バッティング
- 6.4 パターン4: EFA driver mismatch — MPI ジョブが ENA 経由でフォールバック
- 6.5 パターン5: Batch Spot interruption — 長時間ジョブが頻繁に中断
- 6.6 パターン6: Nitro Enclaves attestation 失敗 — KMS Decrypt が AccessDenied
- 6.7 パターン7: コスト最適化不在 — HPC ジョブ常時稼働 / Reservation 未活用
- 7 §7 アンチパターン → 正解パターン変換演習 (5問)
- 8 §8 まとめ + 第21軸目Quantum/HPCシリーズ起点告知 + 51記事化達成告知 + 全軸クロスリンク (Mermaid02)
§1 なぜ Quantum/HPC Vol1 か — 第21軸目起点 + AWS先端アーキテクチャ階層 + ナビ
AWS本番運用シリーズは、ここまで20軸 (IAM / EKS / 復旧 / AI×3 / Security×3 / コスト / Multi-Account /
Observability×3 / Network×2 / DevOps×3 / Database×4 / Serverless×2 / Container×3 / Storage×2 /
Edge / Analytics / Migration / IoT×2 / Game-Media) の本番運用知見を蓄積してきた。
これらは「クラウド上で動く一般的なワークロード」の本番運用を扱うものであり、
そのほとんどは仮想化された EC2 / コンテナ / マネージドサービスの組み合わせで実装されてきた。
しかし、AWS が提供する計算リソースは「仮想化されたインスタンス」だけではない。
– 量子コンピューティング — 古典コンピュータでは時間がかかる問題を量子ビットで解く Amazon Braket
– HPC (高性能計算) — 数千〜数万コアを協調動作させる ParallelCluster / AWS Batch HPC
– Bare metal / Nitro System — 仮想化オーバーヘッドゼロの物理サーバ直接利用
この3領域は「先端領域」と呼ばれ、創薬・気候シミュレーション・金融リスク計算・
ゲーノム解析・量子化学・流体力学・暗号解析といった、
従来の一般的なクラウドワークロードでは扱えなかった計算問題を解くために利用される。
本記事 Quantum/HPC本番運用 Vol1 は、AWS本番運用シリーズの第21軸目として、
この先端領域 (Quantum + HPC + Bare metal) を1本に統合し、本番運用視点で体系化する。
– Amazon Braket — 量子ハードウェア4種 (IonQ / Rigetti / IQM / QuEra) を統一 API で扱う本番運用
– ParallelCluster — Slurm スケジューラ + EFA + FSx for Lustre による HPC クラスタの本番運用
– AWS Batch HPC — Compute environment + Multi-node parallel + GPU job による HPC バッチの本番運用
– Nitro System — Nitro Card / Hypervisor / Security Chip / Bare metal / Nitro Enclaves の本番運用
第21軸目を新たに設ける理由
既存20軸は「一般的なクラウドワークロード」を対象としてきた。具体的には、
– Web API / マイクロサービス (Container / Serverless / API Gateway)
– データ基盤 (Database / Analytics / Storage)
– 機械学習推論・学習 (SageMaker / Bedrock)
– 運用基盤 (Observability / Security / DevOps / Multi-Account)
これらは「仮想化された汎用 CPU」を前提とした構成であり、本記事の3領域は
「量子ビット」「数千コア協調」「物理サーバ直接アクセス」という質的に異なる計算リソースを扱う。
このため、既存軸への追加ではなく独立した第21軸目シリーズとして体系化する。
Vol1 (本記事) で「Braket / ParallelCluster / Batch HPC / Nitro」の4本柱を本番運用視点で
俯瞰した後、後続 Vol2/Vol3 では「量子アルゴリズム実装」「HPC ジョブ最適化」「Nitro Enclaves
セキュア計算」「Hybrid Jobs」を縦深化する予定である。
AWS先端アーキテクチャ階層 (4層モデル)
AWS の計算リソースを「仮想化からの距離」で階層化すると、以下の5層に整理できる。
| 階層 | 距離 | サービス例 | 典型コスト (参考) | 典型レイテンシ | 本記事での扱い |
|---|---|---|---|---|---|
| L4: マネージド | 完全抽象化 | Lambda / Fargate / DynamoDB | $0.0000002/req〜 | ms 〜 秒 | 既存軸でカバー済 |
| L3: 仮想化EC2 | ハイパーバイザー経由 | EC2 (m6i / c6i / r6i) | $0.09〜$4/hr | ENI: 数十 µs | 既存軸でカバー済 |
| L2: HPC 専用 | 高速 NW + 分散 FS | ParallelCluster / AWS Batch HPC + EFA + FSx | $0.5〜$30/hr | EFA MPI: 単桁 µs | §3 / §4 で本番運用 |
| L1: Bare metal | ハイパーバイザー無し | Nitro System (i3.metal / c5n.metal) | $1〜$80/hr | ENA: 〜10 µs / vDSO直接 | §5 で本番運用 |
| L0: 量子 | 古典計算機の外 | Amazon Braket (IonQ / Rigetti / IQM / QuEra) | $0.01〜$0.90/shot | QPUゲート: ns / キュー待ち: 秒〜分 | §2 で本番運用 |
コスト・レイテンシの読み方: L2/L1 は「コアあたりの計算速度」ではなく
「ノード間通信速度」がボトルネックになる。EFA を使った MPI ジョブは単桁 µs の
レイテンシで数千ノードを協調動作させる。L0 (量子) のコストは
「ショット単価 × 実行ショット数」であり、エラー訂正を考慮した実効コストは
単純なショット数計算より格段に高くなる点に注意が必要だ。
L0-L2 を選択する条件: 既存20軸 (L3/L4) で解決できない問題、すなわち
「古典コンピュータの指数時間問題 (量子)」「数千ノード協調 MPI (HPC)」
「ハイパーバイザー 1〜2% オーバーヘッドが許容できない (Bare metal)」のいずれかが
発生したときに初めてこの階層を検討する。むやみな L2/L1 採用はコスト増と
運用複雑性増大を招くアンチパターンである。
本 Vol1 は L0 (量子) / L2 (HPC) / L1 (Bare metal) の3層を横断的に扱う。
既存20軸が主に L3 / L4 を扱ってきたのに対し、本軸は L0-L2 の「下層・先端」を担当する。
想定読者
本記事は以下のいずれかに該当する読者を主な対象としている。
① 量子コンピューティング R&D / PoC 担当
AWS 上で量子回路を動かしたい、あるいは NISQ (Noisy Intermediate-Scale Quantum) デバイスを
使った組合せ最適化 (VQE / QAOA) を本番環境に投入したい研究者・エンジニア。
前提知識として「Python + Boto3 の基本操作」「量子ゲートの概念 (X/H/CNOT 程度)」があれば
本記事の実装例を即座に試せる。量子回路理論の深い知識は §2 範囲では不要である。
② HPC ワークロード移行エンジニア
オンプレミス HPC クラスタ (SGE / PBS / Slurm) を AWS に移行したい、あるいはクラウドネイティブな
HPC 環境を新規構築したいエンジニア。CFD (流体力学) / FEM (有限要素法) / 分子動力学 /
気候シミュレーション / 創薬スクリーニングなどのジョブを扱う担当が典型例だ。
前提知識は「Linux コマンド操作」「MPI の概念 (mpirun / mpiexec)」「EC2 の基本操作」。
Slurm の詳細設定や EFA ドライバの扱い方は §3 で解説する。
③ Bare metal / Nitro Enclaves が必要なアーキテクト
高頻度取引 (HFT) でマイクロ秒レイテンシが要件になる場合、
Oracle Database の raw デバイス I/O 要件がある場合、
VMware/Hyper-V のネスト仮想化が必要な場合、
あるいは機密データ処理 (決済トークン / 生体認証 / 鍵マテリアル) を
ホスト OS から完全隔離したい Security 担当が該当する。
前提知識は「EC2 インスタンスタイプの選定経験」「IAM / KMS の基本操作」。
④ AWS 本番運用シリーズの継続読者
本シリーズを Vol1 (IAM) から読み続けてきた SRE / 上級アーキテクトが
先端領域 (Quantum / HPC / Bare metal) へ知見を広げるための記事としても機能する。
既存20軸の基礎知識 (特に Container / Observability / Network) があると
§2〜§5 の実装例をより深く理解できる。
逆に、本記事は「クラウド入門者」「一般的な Web サービスのみ運用する担当者」は対象外だ。
そうした読者はまず既存20軸 (Container Vol1-3 / Serverless Vol1-2 / Observability Vol1-3) から
読み始め、インフラ基礎を固めることを強く推奨する。本記事はそれらの上位レイヤーとして
設計されており、基礎知識なしに読み進めても実装上の詰まりポイントが理解しにくい。
既存20軸からの移行導線 — どの軸から本軸へ進むべきか
本軸 Quantum/HPC Vol1 は「先端領域」に分類されるため、読者がどの既存軸から
本軸へ移行すべきかの判断が重要だ。以下の優先度順で参照されたい。
優先度A (最優先で移行を検討すべき軸)
– AI/ML 軸 (Vol1-3): SageMaker + Bedrock を使い込んだ後に「GPU 学習の限界突破」
「古典-量子ハイブリッドアルゴリズム」を検討するときに Braket + Hybrid Jobs (§2) が直接役立つ。
– Container 軸 (Vol1-3): EKS / Fargate の上位に「Nitro Bare metal × EKS 高密度ノード」
「i3.metal NVMe 直接マウント」を検討するときに §5 が参照ポイントになる。
– Observability 軸 (Vol1-3): HPC ジョブの可視化 (CloudWatch + Container Insights) や
Braket Task の実行メトリクス監視を Observability Vol3 の知識と組み合わせると §2/§6 が活きる。
優先度B (組み合わせ効果が高い軸)
– Network 軸 (Vol1-2): EFA の高速通信 (単桁 µs MPI) は VPC 設計・プレイスメントグループと
セットで学ぶと §3 の ParallelCluster 設計が深く理解できる。
– Storage 軸 (Vol1-2): FSx for Lustre の Scratch/Persistent 設計は §3 で扱う。
EBS gp3 チューニング知識があると Bare metal の NVMe 構成 (§5) への理解が速まる。
– Security 軸 (Vol1-3): Nitro Enclaves の KMS Attestation (§5) は
Security 軸の「KMS + IAM 最小権限」知識が前提になる。Security Vol3 読了後に §5 を読むと
PCR 値・Attestation Document の意味が腑に落ちる。
優先度C (背景知識として有効)
– DevOps 軸 (Vol1-3): CI/CD パイプラインと PCR0 更新の自動化 (§5 KMS Policy 連動) や
Braket Hybrid Jobs のジョブ管理に CodePipeline を組み合わせる場合に参照。
– コスト最適化軸: Braket の Task per shot 課金モデル / HPC Spot 活用 / Savings Plans との
組み合わせは コスト最適化軸の知識が直接応用できる場面だ (§2 Cost制御 / §3-§4 で言及)。
既存20軸を経由せずに本記事から読み始めることも可能だが、上記優先度Aの軸を
事前に把握しておくと実装上のつまずきが大幅に減る。
本記事の構成
§2 で Amazon Braket (量子) の本番運用を扱い、§3 / §4 で HPC (ParallelCluster + Batch HPC) を、
§5 で Nitro System (Bare metal + Enclaves) を扱う。
§6 で4領域の詰まりポイント7選を判断ツリー化し、§7 で5つのアンチパターン → 正解パターン
変換演習を行う。§8 で第21軸目 Quantum/HPC シリーズ起点宣言 + 51記事化達成告知 + 全21軸
クロスリンクで締めくくる。
第21軸目 Quantum/HPC本番運用シリーズ起点 + 51記事化達成
AWS本番運用シリーズは、ここまで20軸 (IAM / EKS / 復旧 / AI×3 / Security×3 / コスト /
Multi-Account / Observability×3 / Network×2 / DevOps×3 / Database×4 / Serverless×2 /
Container×3 / Storage×2 / Edge / Analytics / Migration / IoT×2 / Game-Media) を完成させ、
合計50記事を公開してきた。
本記事は第21軸目 Quantum/HPC本番運用シリーズの起点 Vol1であり、
同時に51記事化大台を達成する節目となる。
既存20軸が主に「仮想化された一般的なクラウドワークロード」を対象としていたのに対し、
本軸は「量子コンピューティング × HPC × Bare metal」という先端領域を扱う。
創薬・気候シミュレーション・金融リスク・ゲノム解析・量子化学・流体力学・暗号解析といった
従来クラウドでは扱えなかった計算問題を AWS で本番運用する知見を体系化する。
Vol2 / Vol3 ロードマップ (予定)
Vol2 — 量子アルゴリズム × Hybrid Jobs 深掘り
Vol2 では Amazon Braket の Hybrid Jobs を中心に、古典-量子ハイブリッドアルゴリズムの
本番実装を深掘りする。VQE (変分量子固有値ソルバー) と QAOA (量子近似最適化アルゴリズム)
の実装パターン、SageMaker との Hybrid Jobs 連携、量子エラー緩和技術 (ZNE / PEC) の
実践的な適用方法を扱う。量子アドバンテージが実証される領域 (組合せ最適化・
量子化学シミュレーション) と、まだ古典コンピュータが優位な領域の境界線についても
2026年時点の最新情報を基に整理する。
Vol3 — HPC ジョブ最適化 × Nitro Enclaves セキュア計算
Vol3 では ParallelCluster の Slurm チューニング深掘り (ジョブ優先度 / QoS / リソース制約)、
AWS Batch HPC の Multi-node parallel ジョブ最適化、EFA ドライバのバージョン管理と
トラブルシューティングを扱う。あわせて Nitro Enclaves を用いた機密コンピューティングの
本番事例 (金融決済 / 医療データ処理 / 暗号鍵管理) を実装例つきで解説する。
コスト最適化 (Spot Fleet × HPC / Braket Reservation 活用) の計算式も収録する予定だ。
本 Vol1 を読んだ後に Vol2 → Vol3 と進むことで、先端領域の本番運用知見を
段階的に積み上げることができる構成になっている。
§2 Amazon Braket 本番運用 — 量子ハードウェア4種 × Hybrid Jobs × Local Simulator × Cost制御 × Task Queue ★山場1
Amazon Braket 概要 — 古典 API ラッパ + 量子バックエンド統一抽象
Amazon Braket は、異なるベンダーの量子ハードウェアを統一 API で扱えるフルマネージドな
量子コンピューティングサービスである。2019 年にプレビュー公開、2020 年に GA となった。
Braket の設計思想は「量子バックエンドの差異を API レイヤーで吸収する」ことにある。
IonQ (Trapped ion) / Rigetti (Superconducting) / IQM (Superconducting) / QuEra (Neutral atom)
という4種類の異なる物理実装を持つ QPU を、同一の Braket SDK / API で呼び出せる。
加えて、コスト不要でローカル実行できる Simulator (SV1 / DM1 / TN1) も同じ API で利用できる。
Braket の主要コンポーネントは以下の4つだ。
| コンポーネント | 役割 | 備考 |
|---|---|---|
| Braket SDK (Python) | 量子回路記述 + バックエンド切替 | amazon-braket-sdk PyPI パッケージ |
| Quantum Task | QPU/Simulator へのジョブ投入単位 | ARN で管理 / S3 に結果保存 |
| Hybrid Jobs | 古典 (SageMaker/EC2) + 量子 (QPU) を1ジョブにバンドル | VQE/QAOA 向け |
| Braket Simulator | ローカル/クラウド量子シミュレーター | 課金なし (クラウドは別途) |
Braket の処理フローは「回路定義 → Task 投入 → キュー待機 → QPU 実行 → S3 結果保存」の
5ステップだ。QPU は共有リソースであり、予約なしの場合はキュー待機時間が
数分〜数十分発生することを考慮した設計が必要だ。
量子ハードウェア4種 比較表 (2026年現役機種)
| ベンダー | 方式 | 主要デバイス | Qubit数 | Braket 対応リージョン | 1ショット単価 |
|---|---|---|---|---|---|
| IonQ | Trapped ion | Aria (25Q) / Forte (36Q) | 25〜36 | us-east-1 / eu-west-2 | $0.01/shot |
| Rigetti | Superconducting | Ankaa-2 (84Q) | 84 | us-west-1 | $0.0035/shot |
| IQM | Superconducting | Garnet (20Q) | 20 | eu-north-1 | $0.00145/shot |
| QuEra | Neutral atom | Aquila (256Q) | 256 | us-east-1 | $0.01/shot |
※ 提供状況・価格は変動するため常に公式ドキュメントで最終確認すること。
Braket コンソールの「Devices」ページに現在の稼働状況とアベイラビリティが表示される。
各デバイスの特性と使い分け:
IonQ (Aria/Forte): Trapped ion 方式はゲートエラー率が最も低い。
All-to-all 接続 (任意の Qubit 間で直接ゲート可能) のため回路の最適化が容易。
ただし実行速度は Superconducting より遅い (µs/ゲート 対 ns/ゲート)。
アルゴリズム検証・小規模量子化学シミュレーションに適している。Rigetti (Ankaa-2): Superconducting 方式は最高速だが近傍接続のみ。
QPU キャリブレーションを週次で実施するため、実行タイミングによりエラー率が変動する。
get_deviceでdeviceCapabilitiesの最新キャリブレーション日時を確認してから投入すること。IQM (Garnet): Superconducting 方式 / 欧州 (eu-north-1) 拠点。
GDPR 管轄内でデータを完結させたい欧州企業向け。20Q の小規模なため
回路深度の浅いアルゴリズム (QAOA 浅層 / Grover 小規模) に適している。QuEra (Aquila): Neutral atom 方式は 256Q で現状最多 Qubit。
ただしゲートベース量子回路ではなく「アナログモード」 (Rydberg ハミルトニアンの直接制御) のみ。
組合せ最適化 (Maximum Independent Set / グラフ問題) に特化した使い方が基本となる。
Amazon Braket SDK — Bell State 回路を IonQ / SV1 両バックエンドに投入
import boto3
from braket.aws import AwsDevice, AwsQuantumTask
from braket.circuits import Circuit
# Bell state 回路定義
circuit = Circuit().h(0).cnot(0, 1)
# --- バックエンド1: IonQ Aria (QPU) ---
ionq_device = AwsDevice("arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1")
task_qpu = ionq_device.run(circuit, shots=100, s3_destination_folder=("my-braket-bucket", "results/ionq"))
print(f"QPU Task ARN: {task_qpu.id}")
# QPU はキュー待機があるため非同期で確認
# task_qpu.result() は COMPLETED になるまでブロックするため本番では非推奨
# 代わりに state ポーリングまたは EventBridge → Lambda 通知を使う
# --- バックエンド2: SV1 Simulator (クラウドシミュレーター / 課金あり) ---
sv1_device = AwsDevice("arn:aws:braket:::device/quantum-simulator/amazon/sv1")
task_sv1 = sv1_device.run(circuit, shots=1000, s3_destination_folder=("my-braket-bucket", "results/sv1"))
result = task_sv1.result()
print(result.measurement_counts)
# 出力例: Counter({'00': 503, '11': 497})
# --- バックエンド3: Local Simulator (課金なし / 開発時推奨) ---
from braket.devices import LocalSimulator
local_sim = LocalSimulator()
local_result = local_sim.run(circuit, shots=1000).result()
print(local_result.measurement_counts)
バックエンドの切り替えは AwsDevice の ARN を変えるだけでよい。
この API 統一性が Braket の最大の強みであり、「ローカルで開発 → SV1 で中規模検証 → QPU で本番投入」
というワークフローを同一コードで実現できる。
Local Simulator 使い分け — SV1 / DM1 / TN1
| Simulator | 種別 | 最大 Qubit | 主要用途 | 課金 |
|---|---|---|---|---|
| Local Simulator | ローカル (開発機) | ~25Q | 開発・デバッグ・単体テスト | なし |
| SV1 (State Vector) | クラウドマネージド | 34Q | 小規模アルゴリズム検証 | $0.075/タスク〜 |
| DM1 (Density Matrix) | クラウドマネージド | 17Q | ノイズシミュレーション (実機近似) | $0.075/タスク〜 |
| TN1 (Tensor Network) | クラウドマネージド | 50Q | 疎構造・浅層回路の大規模シミュレーション | $0.075/タスク〜 |
選択指針:
– 開発・デバッグ → Local Simulator (コストゼロ / ~25Q で十分)
– 実機投入前の動作確認 (エラーなし理想状態) → SV1 (34Q / 深層回路)
– 実機エラーモデルの検証 (ノイズ込みシミュレーション) → DM1 (17Q / デポラライズノイズ等)
– 50Q 超の疎構造回路 (QAOA / クラスタ状態) → TN1 (縮約可能な構造限定)
TN1 は「テンソルネットワーク縮約が有効な回路」にしか適用できない。
Dense な回路 (QFT 等) は TN1 では実行できないため、回路の構造を事前に確認すること。

Hybrid Jobs — 古典 (SageMaker/EC2) × 量子 (QPU) を1ジョブにバンドル
Hybrid Jobs は「古典最適化ループ + 量子回路評価」を1つのマネージドジョブとして実行する
機能だ。VQE (Variational Quantum Eigensolver) や QAOA (Quantum Approximate Optimization Algorithm)
のように「古典側がパラメータを更新 → 量子回路を評価 → 結果を古典側にフィードバック」という
反復的なハイブリッドワークフローに最適化されている。
Hybrid Jobs を使わずに Lambda / EC2 で独自にループを実装することもできるが、
以下の機能が組み込まれているためマネージドな Hybrid Jobs の利用を推奨する。
| 機能 | Hybrid Jobs | 独自実装 |
|---|---|---|
| QPU 優先キュー | あり (一般 Task より優先) | なし |
| コンテナ管理 | braket-job-py-base コンテナ自動利用 | 自前コンテナ管理 |
| チェックポイント | S3 自動保存 + 再開 | 自前実装 |
| メトリクス | CloudWatch 自動連携 | 手動設定 |
| ライフサイクル管理 | 自動クリーンアップ | 手動 |
Hybrid Jobs 実装例 — VQE (変分量子固有値ソルバー)
from braket.jobs import hybrid_job, save_job_checkpoint, load_job_checkpoint
from braket.circuits import Circuit, FreeParameter
from braket.aws import AwsDevice
import numpy as np
@hybrid_job(device="arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1", wait_until_complete=False)
def run_vqe(n_iterations: int = 50, shots: int = 100):
device = AwsDevice("arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1")
# パラメータ付き ansatz 回路 (RY ゲート × 2 Qubit)
theta = FreeParameter("theta")
phi= FreeParameter("phi")
circuit = Circuit().ry(0, theta).ry(1, phi).cnot(0, 1)
# チェックポイントから再開 (再実行時の途中再開)
try:
checkpoint = load_job_checkpoint("vqe_checkpoint")
params = checkpoint["params"]
start_iter = checkpoint["iteration"]
except Exception:
params = np.array([0.1, 0.2])
start_iter = 0
for i in range(start_iter, n_iterations):
param_dict = {"theta": params[0], "phi": params[1]}
task = device.run(circuit, shots=shots, **param_dict)
result = task.result()
# エネルギー期待値計算 (Z0 Z1 オブザーバブル)
counts = result.measurement_counts
energy = (counts.get("00", 0) + counts.get("11", 0) - counts.get("01", 0) - counts.get("10", 0)) / shots
# 勾配降下法でパラメータ更新 (パラメータシフトルール)
params -= 0.1 * np.array([energy, energy])
# チェックポイント保存
save_job_checkpoint({"params": params.tolist(), "iteration": i + 1, "energy": energy})
return {"final_energy": float(energy), "final_params": params.tolist()}
Hybrid Jobs InstanceConfig (YAML)
# Hybrid Jobs の古典側インスタンス設定 (job_definition.yaml)
instanceConfig:
instanceType: ml.m5.large# 古典最適化ループ用 (必要に応じて GPU インスタンスに変更)
volumeSizeInGb: 30
checkpointConfig:
localPath: /opt/braket/checkpoints
s3Uri: s3://my-braket-bucket/checkpoints/vqe-job/
outputDataConfig:
s3Path: s3://my-braket-bucket/output/vqe-job/
stoppingCondition:
maxRuntimeInSeconds: 86400# 最大24時間 (QPU キュー待ち込みの場合)
stoppingCondition.maxRuntimeInSeconds は QPU キュー待機時間を含めた総実行時間を
設定することを忘れずに。QPU が混雑している場合、1回の Task で数時間待機することもある。
Cost 制御 — Task per Shot 課金 / Reservation / Budget Alert / IAM 制限
Braket の課金は「Task per shot 課金」である。1 Task 投入するたびに基本料金が発生し、
そこに shots × ショット単価 が加算される。コスト暴走の典型例は
「デバッグコードが本番QPUに大量 shots を投入し続ける」シナリオだ。
コスト計算モデル
1 Task のコスト = Task 基本料金 + (shots × ショット単価)
例: IonQ Aria で shots=1000 実行した場合
= $0.30 (Task 基本料) + (1000 × $0.01/shot)
= $0.30 + $10.00
= $10.30 / Task
1 Task で shots=1000 の IonQ 実行は $10 超となる。VQE の反復回数が 100 イテレーションなら
合計 $1,000 超になる計算だ。コスト制御の設計を最初から組み込まなければならない。
Reservation (時間帯予約)
Braket Reservation は特定の QPU を「専有スロット (分単位)」で予約する機能だ。
予約した時間帯は他のユーザーと共有せずに QPU を実行できるため、キュー待機ゼロで実行できる。
# Reservation 一覧確認
aws braket search-quantum-tasks \
--filters "name=deviceArn,values=arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1" \
--region us-east-1
# Reservation 作成 (IonQ Aria / 2時間予約)
aws braket create-quantum-task-reservation \
--device-arn "arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1" \
--duration-in-minutes 120 \
--start-time "2026-06-01T10:00:00Z" \
--region us-east-1
Reservation は時間単位で課金されるため、予約した時間内に実行するジョブ数を
事前に見積もっておくこと。予約時間を使い切らなかった場合も課金される。
Budget Alert + IAM 制限でコスト暴走防止
# AWS Budgets で Braket コストアラート設定
aws budgets create-budget \
--account-id 123456789012 \
--budget '{
"BudgetName": "Braket-Monthly",
"BudgetLimit": {"Amount": "500", "Unit": "USD"},
"TimeUnit": "MONTHLY",
"BudgetType": "COST",
"CostFilters": {"Service": ["Amazon Braket"]}
}' \
--notifications-with-subscribers '[{
"Notification": {
"NotificationType": "ACTUAL",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 80.0,
"ThresholdType": "PERCENTAGE"
},
"Subscribers": [{"SubscriptionType": "EMAIL", "Address": "ops@example.com"}]
}]'
IAM Policy で shots 上限を強制する方法はない (Braket はリソースベース制限未対応) が、
SCP (Service Control Policy) で「Reservation なしの QPU 実行を禁止」することで
コスト暴走を組織レベルで防止できる。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyBraketQPUWithoutReservation",
"Effect": "Deny",
"Action": "braket:CreateQuantumTask",
"Resource": "arn:aws:braket:*::device/qpu/*",
"Condition": {
"Null": {"braket:ReservationArn": "true"}
}
}
]
}
このSCPを適用すると、Reservation ARN を指定しない QPU Task の投入が全アカウントで拒否される。
開発環境では SCP を外し、本番アカウントのみ適用するマルチアカウント設計が推奨だ。
Task Queue 設計 — 優先度 / Cancel / Retry / Timeout
Task ライフサイクルと状態遷移
Braket Task は以下の状態を遷移する。
CREATED → QUEUED → RUNNING → COMPLETED
↓
FAILED
↓
CANCELLED
状態確認と Cancel は以下のコマンドで行う。
# Task 状態確認
aws braket get-quantum-task \
--quantum-task-id arn:aws:braket:us-east-1:123456789012:quantum-task/TASK-ID \
--region us-east-1
# Task キャンセル (QUEUED または RUNNING 中のみ可能)
aws braket cancel-quantum-task \
--quantum-task-id arn:aws:braket:us-east-1:123456789012:quantum-task/TASK-ID \
--region us-east-1
Retry / Timeout 設計
QPU Task は FAILED になる可能性がある (デバイスキャリブレーション中 / 一時的なハードウェア障害)。
本番環境では以下のリトライ設計を組み込むこと。
import time
from braket.aws import AwsQuantumTask
def run_task_with_retry(circuit, device, shots: int, max_retries: int = 3, timeout_sec: int = 7200):
for attempt in range(max_retries):
task = device.run(circuit, shots=shots)
deadline = time.time() + timeout_sec
while time.time() < deadline:
state = task.state()
if state == "COMPLETED":
return task.result()
if state in ("FAILED", "CANCELLED"):
print(f"Attempt {attempt+1} failed with state={state}. Retrying...")
break
time.sleep(30) # 30秒ポーリング
else:
task.cancel()
print(f"Attempt {attempt+1} timed out. Retrying...")
raise RuntimeError(f"Task failed after {max_retries} attempts")
timeout_sec のデフォルト推奨は 2 時間 (7200 秒)。QPU が混雑している場合に
QUEUED 状態のまま長時間待機することがあるため、Timeout を設定せずに無限待機する
実装は本番環境では禁忌だ。
Amazon Braket 本番運用 3鉄則
鉄則1 — 本番QPU 投入前に必ず Local Simulator → SV1 → QPU の3段階を踏め
回路の正確性を Local Simulator で確認し、クラウド環境での動作を SV1 で確認してから
QPU に投入する。QPU 実行は高コストかつキュー待機があるため、
バグを QPU 実行後に発見するコスト損失は避けられない。
また QPU 投入時の shots 数は「統計的有意性が確認できる最小値」から始め、
徐々に増やすアプローチを採ること。
鉄則2 — Hybrid Jobs でないと「QPU 優先キュー」は使えない
一般 Quantum Task と Hybrid Jobs では QPU のキュー優先度が異なる。
Hybrid Jobs はキューで優先処理されるため、VQE/QAOA などの反復実行ジョブは
必ず Hybrid Jobs として投入すること。個別の Task を Lambda などで繰り返し投入する
実装は優先度が低く、全体の待機時間が著しく長くなる。
鉄則3 — Cost制御はコード・IAM・SCP の3層で実装せよ
コードレベルでは shots 数の上限定数を必ず定義し、IAM レベルでは本番 QPU 実行ロールを
分離し、SCP レベルでは本番アカウントで Reservation なし QPU 実行を拒否する。
Budget Alert だけでは「アラートが来たときには既に過剰課金が発生している」ため、
予防的な SCP による実行制限が本番運用の鉄則となる。
Amazon Braket 採用判断チェックリスト
以下の全項目に「YES」と答えられる場合のみ Amazon Braket (QPU) の本番採用を検討せよ。
「YES」でない項目がある場合は、まず古典コンピュータ (SageMaker / EC2 HPC) での
解決を検討すること。NISQ 時代の現在、量子コンピュータが古典コンピュータに勝てる
問題領域は限定的である。
- □ 解こうとしている問題が「指数時間古典アルゴリズム」に該当するか? (例: 組合せ最適化の特定サブクラス / 量子化学シミュレーション)
- □ 25〜84 Qubit の NISQ デバイスで意味のある結果が得られる問題規模か? (大規模問題は古典コンピュータが優位)
- □ エラー率を考慮した「量子アドバンテージ」が実証済みの問題か、または R&D PoC として許容できるか?
- □ コスト (QPU 1回あたり数ドル〜数十ドル) が実験 / 研究予算内で許容されるか?
- □ Local Simulator での動作確認フローを確立しているか? (Simulator で動かない回路は QPU でも動かない)
- □ QPU キュー待機 (数分〜数時間) を許容するワークフロー設計になっているか? (リアルタイム処理は不可)
- □ Hybrid Jobs を使う場合、古典側 (SageMaker/EC2) と量子側 (QPU) のコスト分離モニタリングが設計済みか?
上記チェックリストの全ての項目が「YES」でない場合、Amazon Braket の採用は時期尚早だ。
SageMaker での機械学習 (AI/ML 軸) や ParallelCluster での HPC (§3) での解決を先に検討せよ。
§3 ParallelCluster 本番運用 — Cluster Config × Slurm Scheduler × Auto-scaling × EFA × FSx for Lustre
3-1 ParallelCluster 概要 — CloudFormation バックエンド + pcluster CLI
Amazon ParallelCluster は AWS が提供するオープンソースの HPC クラスタ自動構築・管理ツールである。
内部的に AWS CloudFormation をバックエンドとして使用し、pcluster CLI から YAML 形式の設定ファイル1つで
Head node / Compute fleet / ストレージ (EFS / FSx for Lustre) / ネットワーク (EFA / Placement Group)
を一括デプロイする。v3 系 (2021〜現在) では設定ファイルが JSON から YAML に刷新され、可読性が大幅に向上した。
主なデプロイコマンド:
# クラスタ作成 (CloudFormation スタック展開 / 10〜20分)
pcluster create-cluster \
--cluster-name hpc-prod \
--cluster-configuration cluster-config.yaml
# クラスタ状態確認
pcluster describe-cluster --cluster-name hpc-prod
# Head node SSH 接続
pcluster ssh --cluster-name hpc-prod -i ~/.ssh/hpc-keypair.pem
# クラスタ削除
pcluster delete-cluster --cluster-name hpc-prod
クラスタ作成から Slurm 利用可能状態になるまでの典型的な所要時間は 10〜20 分である。
本番運用では CodePipeline + Lambda から pcluster コマンドを呼び出し、
「ジョブ投入 → クラスタ作成 → 実行 → 結果保存 → クラスタ削除」のライフサイクルを自動化する。
3-2 Cluster Config — Head node × Compute fleet × Queue 設計
クラスタ設定の核心は YAML 形式の cluster-config.yaml であり、以下の構成が本番の標準形となる。
Region: ap-northeast-1
Image:
Os: alinux2023
HeadNode:
InstanceType: m6i.xlarge
Networking:
SubnetId: subnet-0123456789abcdef0
Ssh:
KeyName: hpc-keypair
LocalStorage:
RootVolume:
Size: 500
Scheduling:
Scheduler: slurm
SlurmQueues:
- Name: ondemand-q
ComputeResources:
- Name: hpc6a-od
InstanceType: hpc6a.48xlarge
MinCount: 0
MaxCount: 64
Efa:
Enabled: true
Networking:
SubnetIds:
- subnet-0123456789abcdef0
PlacementGroup:
Enabled: true
- Name: spot-q
ComputeResources:
- Name: hpc6a-spot
InstanceType: hpc6a.48xlarge
MinCount: 0
MaxCount: 256
Efa:
Enabled: true
CapacityType: SPOT
Networking:
SubnetIds:
- subnet-0123456789abcdef0
PlacementGroup:
Enabled: true
SharedStorage:
- MountDir: /lustre
Name: fsx-lustre-prod
StorageType: FsxLustre
FsxLustreSettings:
StorageCapacity: 4800
DeploymentType: SCRATCH_2
ImportPath: s3://my-hpc-bucket/input/
ExportPath: s3://my-hpc-bucket/output/
Head node 設計の重要事項:
Head node は Single-AZ 固定であり、Multi-AZ 構成はサポートされない (= SPOF)。
インスタンスタイプは m6i.xlarge 以上を推奨し、
512 ノードを超える大規模クラスタでは m6i.4xlarge 以上を選択する。
EBS ルートボリュームは最低 500 GB を確保し、Slurm accounting ログの肥大化に備える。
Compute fleet — HPC 専用インスタンス:
| インスタンス | vCPU | ネットワーク | EFA | 主な用途 |
|---|---|---|---|---|
| hpc6a.48xlarge | 96 | 100 Gbps | 対応 | CFD / FEM (x86 Epyc) |
| hpc7a.96xlarge | 192 | 300 Gbps | 対応 | 大規模流体シミュレーション |
| c5n.18xlarge | 72 | 100 Gbps | 対応 | MPI 汎用 HPC |
| c6gn.16xlarge | 64 | 100 Gbps | 対応 | ARM Graviton3 HPC |
| p4d.24xlarge | 96 | 400 Gbps | 対応 | GPU 並列 (深層学習 HPC) |
Queue は ondemand-q (SLA あり・長時間 MPI) と spot-q (コスト優先・中断耐性あり) の2本に分離する。
hpc6a / hpc7a はキャパシティが特定 AZ に集中するため、Placement Group + Cluster Placement で物理近接配置を指定する。
3-3 Slurm Scheduler Tuning — Partition × QoS × Priority
QoS + PreemptType の設定:
# QoS 追加 (Head node 上 sacctmgr で実行)
sacctmgr add qos high_priority MaxJobsPerUser=10 Priority=1000
sacctmgr add qos normal Priority=500
sacctmgr add qos low_priority Priority=100
# Partition への QoS バインド
scontrol update PartitionName=ondemand-q QoS=high_priority,normal
scontrol update PartitionName=spot-q QoS=normal,low_priority
PreemptType=preempt/qos を設定することで、high_priority QoS のジョブが low_priority のジョブを
REQUEUE (強制保留) してキャパシティを獲得できる。pcluster では CustomActions の post_install スクリプトで
slurm.conf への追記として実装する。
本番運用でよく使う Slurm コマンド:
# ジョブ投入 (4ノード × 96コア / EFA MPI / ondemand-q)
sbatch --nodes=4 --ntasks-per-node=96 \
--partition=ondemand-q --time=12:00:00 \
--qos=high_priority --output=/lustre/logs/%j.out \
sample-mpi.slurm
# ジョブ状態確認
squeue -u $(whoami) --format="%.18i %.9P %.8j %.2t %.10M %.6D %R"
# ノード状態確認 (IDLE / ALLOC / DRAIN / DOWN)
sinfo -N -l
# ジョブ詳細 (割り当てノード / 終了コード)
scontrol show job <JOBID>
MPI ジョブの sbatch スクリプト例:
#!/bin/bash
#SBATCH --nodes=8
#SBATCH --ntasks-per-node=96
#SBATCH --partition=ondemand-q
#SBATCH --time=06:00:00
#SBATCH --qos=high_priority
#SBATCH --output=/lustre/logs/%j.out
#SBATCH --error=/lustre/logs/%j.err
module load openmpi
export FI_EFA_USE_DEVICE_RDMA=1
export OMPI_MCA_btl=^vader,tcp,openib
export OMPI_MCA_pml=^cm
mpirun -np 768 ./cfd_solver \
--input /lustre/input/mesh.dat \
--output /lustre/output/result.dat \
--timesteps 10000
3-4 Auto-scaling — Idle Scale-down × Spot Integration
Idle Scale-down (デフォルト 10 分):
ParallelCluster の Slurm インテグレーションは、アイドル状態のコンピュートノードを自動シャットダウンする。
デフォルトの SuspendTimeout=600 (10 分) を短縮することでコスト削減効果が大きい。
# Head node の slurm.conf を確認
grep SuspendTimeout /opt/slurm/etc/slurm.conf
# アイドルタイムアウトを 3 分に短縮後、Slurm に反映
sudo sed -i 's/SuspendTimeout=600/SuspendTimeout=180/' \
/opt/slurm/etc/slurm.conf
sudo scontrol reconfigure
p4d.24xlarge (約 $32/時) のような高コストインスタンスでは、3分短縮の効果が顕著である。
Spot Integration と自動 Re-queue:
Spot キューで実行中のジョブが Spot interruption (2分前通知) を受けた場合、
ParallelCluster の Slurm インテグレーションが以下を自動実行する。
- IMDS から Spot interruption シグナルを検知
- 対象ノードに
scontrol update NodeName=<node> State=DRAINを発行 - ノード上のジョブに REQUEUE シグナルを送信 → ジョブがペンディング状態に戻る
- 別の Spot ノードが起動後、ジョブが自動再開
長時間 MPI ジョブ (>2時間) は ondemand-q で実行し、Spot は中断耐性のある
パラメータスイープ・モンテカルロに限定することを強く推奨する。

ParallelCluster 本番運用 3鉄則
鉄則1: Slurm QoS + PreemptType=preempt/qos を必ず設定する
QoS 未設定クラスタでは全ジョブが同一優先度で実行され、高優先ジョブ (本番シミュレーション) が
低優先ジョブ (開発テスト) に待たされる事態が発生する。PreemptType=preempt/qos を設定し、high_priority キューのジョブが
low_priority キューをプリエンプトできる設計とする。
鉄則2: EFA 対応インスタンス + Placement Group + libfabric 3点セットを徹底する
EFA を有効にしても Placement Group が未設定だと Compute node が複数 AZ に分散し EFA レイテンシが劣化する。
OpenMPI の btl/pml 設定で EFA (libfabric backend) を明示しないと TCP fallback が発生し
通信帯域が 1/10 以下になる。FI_EFA_USE_DEVICE_RDMA=1 とOMPI_MCA_btl=^vader,tcp,openib をジョブスクリプトに必ず設定する。
鉄則3: FSx for Lustre を全ノード共有ストレージとしてマウントする
NFS (EFS) は HPC ワークロードのメタデータアクセスでボトルネックとなる。
FSx for Lustre (SCRATCH_2 または PERSISTENT_2) を /lustre にマウントし、
全 Compute node から並列アクセスできる設計とする。
S3 との DataRepositoryAssociation を設定し、入力データの自動インポートと結果の自動エクスポートを実現する。
3-5 EFA — Elastic Fabric Adapter × MPI 高速通信
EFA (Elastic Fabric Adapter) は AWS が独自開発した高速ネットワークインターフェースであり、
OS バイパスの RDMA (Remote Direct Memory Access) を実現する。libfabric ライブラリをバックエンドとし、
OpenMPI / Intel MPI / MPICH および NCCL から透過的に利用できる。
EFA 有効化の設定:
ComputeResources:
- Name: hpc6a-efa
InstanceType: hpc6a.48xlarge
Efa:
Enabled: true
GdrSupport: false
Networking:
PlacementGroup:
Enabled: true
ENA + EFA driver 同居の罠 (Driver version mismatch):
カスタム AMI を使用する場合、ENA ドライバと EFA ドライバのバージョン整合を必ず確認する。
ENA が EFA より新しいバージョンだと、カーネルモジュール競合により EFA 通信が TCP fallback する事例がある。
# EFA driver バージョン確認
modinfo efa | grep version
# EFA インストール状態確認 (libfabric でプロバイダ認識)
fi_info -p efa
# EFA 帯域測定 (疎通確認)
fi_pingpong -p efa
# OpenMPI の EFA 設定 (ジョブスクリプトに追加)
export FI_PROVIDER=efa
export FI_EFA_USE_DEVICE_RDMA=1
export OMPI_MCA_btl=^vader,tcp,openib
export OMPI_MCA_pml=^cm
カスタム AMI では aws-efa-installer スクリプトを使って ENA/EFA 両ドライバを同時更新する。
EFA が利用可能なインスタンスは hpc6a / hpc7a / c5n / c6gn / p4d / p5 など限定されており、
汎用インスタンス (m6i / r6i 等) では EFA は利用できない。
3-6 FSx for Lustre — Scratch × Persistent × S3 連携 × HSM
Scratch vs Persistent の選択基準:
| タイプ | 用途 | 耐久性 | スループット |
|---|---|---|---|
| SCRATCH_1 | 短期バースト | 低 | 200 MB/s/TiB |
| SCRATCH_2 | 短期高速 | 低 | 500 MB/s/TiB |
| PERSISTENT_1 | 永続化 | 高 | 200 MB/s/TiB |
| PERSISTENT_2 | 永続化高速 | 高 | 1000 MB/s/TiB |
HPC ジョブが 48 時間以内なら SCRATCH_2、長期的にシミュレーション結果を蓄積するなら PERSISTENT_2 を選択する。
S3 連携 (DataRepositoryAssociation):
FsxLustreSettings:
StorageCapacity: 4800
DeploymentType: SCRATCH_2
DataRepositoryAssociations:
- BatchImportMetaDataOnCreate: true
DataRepositoryPath: s3://my-hpc-bucket/input/
FileSystemPath: /lustre/input
AutoImportPolicy:
Events: [NEW, CHANGED, DELETED]
AutoExportPolicy:
Events: [NEW, CHANGED, DELETED]
S3 バケットの変更が自動的に FSx for Lustre に反映 (AutoImport) され、
FSx for Lustre の変更が S3 に自動エクスポート (AutoExport) される。
HSM (Hierarchical Storage Management):
アクセス頻度の低いファイルを S3 にアーカイブし、アクセス時に透過的に復元する。
# ファイルの HSM 状態確認
lfs hsm_state /lustre/input/mesh.dat
# S3 への手動アーカイブ
lfs hsm_archive /lustre/output/result_20260524.dat
# S3 からの透過的復元
lfs hsm_restore /lustre/output/result_20260524.dat
ParallelCluster Head node SPOF — 見落とされがちな落とし穴
Amazon ParallelCluster の Head node は Single-AZ 固定であり Multi-AZ 構成には非対応である。
Head node が停止すると Slurm daemon が停止し、実行中の全ジョブが終了する。
落とし穴1: Head node インスタンス障害 → 全ジョブ消失
Head node の EC2 障害はクラスタ全体の停止を意味する。
本番 HPC クラスタでは Head node をリザーブドインスタンスで常時稼働させ、
EBS スナップショットを定期取得してリカバリ手順を整備する。
落とし穴2: Head node EBS ディスクフル → Slurm daemon クラッシュ
Slurm の accounting ログ・ジョブログが Head node の EBS に蓄積し、
ディスクフルになると Slurm daemon がクラッシュする。/opt/slurm/var/log/ と /home/ の容量を CloudWatch Logs にエクスポートし、
EBS は 500 GB 以上確保する。
落とし穴3: pcluster update-cluster の不意のリブートpcluster update-cluster は Head node 設定変更時にリブートを伴う場合があり、
実行中ジョブが強制終了される。
更新前に squeue で実行中ジョブを確認し、必ずメンテナンスウィンドウで実施する。
§4 AWS Batch HPC 本番運用 — Compute Environment × Job Queue × Job Definition × Multi-node Parallel × GPU Job
4-1 概要 — ParallelCluster との使い分け基準
AWS Batch は、コンテナベースのジョブスケジューリングサービスであり、
Compute environment + Job queue + Job definition の3要素でジョブ実行を管理する。
HPC ワークロードにおける AWS Batch (Batch HPC) の位置付けは、
ParallelCluster (持続クラスタ) との対比で理解すると明確になる。
| 比較軸 | ParallelCluster | AWS Batch HPC |
|---|---|---|
| クラスタ形態 | 持続クラスタ (Head node 常時稼働) | ジョブ駆動 (EC2 自動起動・停止) |
| スケジューラ | Slurm | AWS Batch 内部スケジューラ |
| 適性ジョブ | 長時間 MPI (CFD / 分子動力学) | 多数小ジョブ並列 / GPU バッチ |
| 運用コスト | Head node 分の固定費 | 完全従量課金 (ジョブ時間のみ) |
| 最短起動時間 | 10〜20分 (クラスタ作成) | 3〜5分 (Compute env 起動) |
| 設定手段 | YAML + pcluster CLI | JSON (CloudFormation / Terraform) |
使い分け基準:
– ParallelCluster を選ぶ場合: 長時間 (>4時間) MPI ジョブが主体 / Slurm QoS 制御が必要 / 既存 HPC ソフトウェア資産
– AWS Batch HPC を選ぶ場合: 多数の小ジョブを並列実行 / コンテナで完結 / Spot を最大活用 / ジョブ駆動でクラスタ不要
4-2 Compute Environment — Managed × Spot × Allocation Strategy
Compute Environment の定義:
{
"computeEnvironmentName": "hpc-ce-spot",
"type": "MANAGED",
"state": "ENABLED",
"computeResources": {
"type": "SPOT",
"allocationStrategy": "SPOT_CAPACITY_OPTIMIZED",
"minvCpus": 0,
"maxvCpus": 4096,
"instanceTypes": [
"hpc6a.48xlarge",
"c5n.18xlarge",
"p4d.24xlarge"
],
"subnets": ["subnet-0123456789abcdef0"],
"securityGroupIds": ["sg-0123456789abcdef0"],
"instanceRole": "arn:aws:iam::123456789012:instance-profile/AmazonEC2ContainerServiceforEC2Role",
"placementGroup": "hpc-placement-group"
}
}
Allocation Strategy の選択:
| 戦略 | 動作 | 適合ユースケース |
|---|---|---|
| BEST_FIT | コスト最小のインスタンスタイプ優先 | コスト最優先 |
| BEST_FIT_PROGRESSIVE | 上記 + 未達時に代替タイプ試行 | コスト × 起動成功率バランス |
| SPOT_CAPACITY_OPTIMIZED | Spot 在庫が最も多いタイプ優先 | 中断リスク最小 (Spot 推奨) |
| SPOT_PRICE_CAPACITY_OPTIMIZED | 価格 + 在庫の総合評価 | 2023〜推奨の新戦略 |
Spot 使用時は SPOT_CAPACITY_OPTIMIZED を選択し、instanceTypes に複数タイプを列挙して中断リスクを分散させる。
4-3 Job Queue — 優先度 × Compute Environment 多重バインド
1つの Job queue に複数の Compute environment をバインドし、
Spot 枯渇時に自動的に On-demand にフォールバックする設計が本番の定石である。
{
"jobQueueName": "hpc-queue-high",
"state": "ENABLED",
"priority": 1000,
"computeEnvironmentOrder": [
{
"order": 1,
"computeEnvironment": "hpc-ce-spot"
},
{
"order": 2,
"computeEnvironment": "hpc-ce-ondemand"
}
]
}
優先度 (priority) が高い Job queue が先にジョブを取得する。
本番では high (priority=1000) / normal (priority=500) / low (priority=100) の3段階が標準的。
4-4 Job Definition — Container × Multi-node Parallel × Parameters 汎用化
{
"jobDefinitionName": "hpc-mpi-job",
"type": "multinode",
"nodeProperties": {
"numNodes": 8,
"mainNode": 0,
"nodeRangeProperties": [
{
"targetNodes": "0:",
"container": {
"image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/hpc-mpi:latest",
"vcpus": 96,
"memory": 196608,
"privileged": false,
"linuxParameters": {
"devices": [
{
"hostPath": "/dev/infiniband/uverbs0",
"containerPath": "/dev/infiniband/uverbs0",
"permissions": ["READ", "WRITE", "MKNOD"]
}
],
"sharedMemorySize": 4096
},
"environment": [
{"name": "FI_PROVIDER", "value": "efa"},
{"name": "FI_EFA_USE_DEVICE_RDMA", "value": "1"},
{"name": "OMPI_MCA_btl", "value": "^vader,tcp,openib"}
],
"mountPoints": [
{
"containerPath": "/lustre",
"readOnly": false,
"sourceVolume": "lustre"
}
],
"volumes": [
{"name": "lustre", "host": {"sourcePath": "/lustre"}}
]
}
}
]
},
"parameters": {
"inputPath": "/lustre/input/default.dat",
"outputPath": "/lustre/output/result.dat",
"timesteps": "10000"
},
"retryStrategy": {
"attempts": 3,
"evaluateOnExit": [
{"onExitCode": "0", "action": "EXIT"},
{"onExitCode": "1", "action": "EXIT"}
]
}
}
parameters フィールドで Job definition を汎用化し、異なる入力データ・パラメータを持つジョブを
同一 Job definition から投入できる。
# パラメータ差し替えでジョブ投入
aws batch submit-job \
--job-name "cfd-run-20260524" \
--job-queue hpc-queue-high \
--job-definition hpc-mpi-job \
--parameters inputPath=/lustre/input/mesh-v2.dat,timesteps=20000

AWS Batch HPC 本番運用 3鉄則
鉄則1: Compute environment は Spot / On-demand を分離し、Job queue で多重バインドする
1つの Compute environment に Spot と On-demand を混在させると Spot 枯渇時の挙動が不透明になる。
Spot 専用 CE と On-demand 専用 CE を別々に作成し、Job queue の computeEnvironmentOrder で
Spot を order=1、On-demand を order=2 とすることで、Spot → On-demand の透過的フォールバックを実現する。
鉄則2: Multi-node parallel job には EFA デバイス + sharedMemorySize + Placement Group を必ず設定する
EFA デバイス (/dev/infiniband/uverbs0) を container の devices にマウントしないと、
MPI / NCCL が EFA を認識できずに TCP fallback する。sharedMemorySize (IPC shared memory) が小さいと NCCL の集合通信が失敗する。
Placement Group を Compute environment に指定し、MPI ノード間の物理的近接を保証する。
鉄則3: GPU job では DCGM ヘルスチェックをジョブ前に実行する
GPU インスタンス (p4d / p5 / g5) は GPU メモリエラーや XID エラーが事前予告なく発生することがある。
ジョブ開始前に dcgmi diag -r 1 を実行し、GPU ヘルスチェックを通過した場合のみ
本計算を開始する2段階設計とする。エラー時は Batch の retryStrategy で自動再試行する。
4-5 Multi-node Parallel Job — MPI × NCCL × EFA
AWS Batch の Multi-node parallel job は、複数のコンテナ (複数の EC2 インスタンス上の ECS タスク) を
協調動作させる仕組みである。mainNode (index=0) が MPI の master プロセスとして動作し、
残りのノード (index=1〜N-1) が worker プロセスとして協調する。
AWS Batch は起動時に以下の環境変数をコンテナに自動注入する。
| 環境変数 | 説明 |
|---|---|
| AWS_BATCH_JOB_NUM_NODES | 合計ノード数 |
| AWS_BATCH_JOB_NODE_INDEX | 自ノードのインデックス (0始まり) |
| AWS_BATCH_JOB_MAIN_NODE_INDEX | mainNode のインデックス |
| AWS_BATCH_JOB_MAIN_NODE_PRIVATE_IPV4_ADDRESS | mainNode の内部 IP |
MPI 起動スクリプト例 (entrypoint.sh):
#!/bin/bash
set -euo pipefail
NODE_INDEX="${AWS_BATCH_JOB_NODE_INDEX}"
NUM_NODES="${AWS_BATCH_JOB_NUM_NODES}"
if [ "${NODE_INDEX}" -eq 0 ]; then
sleep 10
for i in $(seq 0 $((NUM_NODES - 1))); do
echo "worker-${i}" >> /tmp/hostfile
done
mpirun -np $((NUM_NODES * 96)) \
--hostfile /tmp/hostfile \
-x FI_PROVIDER=efa \
-x FI_EFA_USE_DEVICE_RDMA=1 \
/app/cfd_solver
else
/usr/sbin/sshd -D
fi
4-6 GPU Job — Instance Type × NVIDIA Driver × DCGM 監視
GPU インスタンスの選択:
| インスタンス | GPU | GPU メモリ | EFA | 用途 |
|---|---|---|---|---|
| g5.48xlarge | A10G × 8 | 192 GB | 非対応 | 推論・中規模学習 |
| p4d.24xlarge | A100 × 8 | 320 GB | 対応 | 大規模 GPU 並列 (NCCL) |
| p5.48xlarge | H100 × 8 | 640 GB | 対応 | 最大性能 GPU HPC |
nvidia-smi によるジョブ前検証:
# GPU 認識確認
nvidia-smi --query-gpu=name,memory.total,driver_version \
--format=csv,noheader
# プロセス確認 (他のジョブが GPU を占有していないか)
nvidia-smi --query-compute-apps=pid,used_memory --format=csv,noheader
DCGM (Data Center GPU Manager) によるヘルスチェック:
# DCGM ヘルスチェック (レベル1: 基本診断 / ジョブ前に必ず実行)
dcgmi diag -r 1
# GPU メモリエラー監視 (XID エラー)
dcgmi health -g 0 -j
# DCGM エクスポーター (Prometheus 連携)
dcgm-exporter \
-f /etc/dcgm-exporter/dcp-metrics-included.csv &
Terraform で Batch Compute Environment + Job Queue を管理:
resource "aws_batch_compute_environment" "hpc_spot" {
compute_environment_name = "hpc-ce-spot"
type= "MANAGED"
state = "ENABLED"
compute_resources {
type = "SPOT"
allocation_strategy = "SPOT_CAPACITY_OPTIMIZED"
max_vcpus = 4096
min_vcpus = 0
instance_type = ["hpc6a.48xlarge", "c5n.18xlarge", "p4d.24xlarge"]
spot_iam_fleet_role = aws_iam_role.spot_fleet.arn
instance_role = aws_iam_instance_profile.batch.arn
subnets = [aws_subnet.hpc.id]
security_group_ids = [aws_security_group.hpc.id]
placement_group = aws_placement_group.hpc.name
}
service_role = aws_iam_role.batch_service.arn
}
resource "aws_batch_job_queue" "hpc_high" {
name = "hpc-queue-high"
state = "ENABLED"
priority = 1000
compute_environment_order {
order= 1
compute_environment = aws_batch_compute_environment.hpc_spot.arn
}
compute_environment_order {
order= 2
compute_environment = aws_batch_compute_environment.hpc_ondemand.arn
}
}
AWS Batch HPC — Spot interruption の落とし穴
AWS Batch HPC で Spot インスタンスを使用する場合、Spot interruption (2分前通知) が発生すると
そのノードで実行中のジョブが強制終了される。
落とし穴1: Multi-node parallel job の Spot interruption → 全ノード強制終了
いずれか1つのノードが Spot interruption を受けると、Batch がジョブ全体を FAILED と判定し全ノードを強制終了する。
Checkpoint 機構 (DMTCP 等) を実装していない MPI ジョブは最初から再実行となる。
長時間 Multi-node MPI ジョブには On-demand Compute environment を使用することを強く推奨する。
落とし穴2: instanceTypes を1種類のみ指定 → Spot 枯渇でジョブ保留
特定の Spot インスタンスタイプが枯渇すると、Batch はキャパシティ不足でジョブを保留し続ける。
instanceTypes に複数のインスタンスタイプを指定し、SPOT_CAPACITY_OPTIMIZED 戦略で
在庫の豊富なタイプを自動選択させることで、キャパシティ枯渇リスクを分散させる。
落とし穴3: retryStrategy の evaluateOnExit 未設定 → 意図しない無限リトライ
retryStrategy の attempts のみを設定し evaluateOnExit を設定しない場合、
アプリケーションのバグによる終了コード1も「リトライ対象」と判断されて attempts 回再実行される。onExitCode: "0" → EXIT と onExitCode: "1" → EXIT を明示する。
§5 Nitro System 本番運用 — Nitro Card × Hypervisor × Security Chip × Bare Metal × Nitro Enclaves ★山場2
Nitro System 概要 — 仮想化の常識を覆すアーキテクチャ
AWS が 2017 年に導入した Nitro System は、EC2 の仮想化基盤を根本から刷新したアーキテクチャである。
従来の Xen ハイパーバイザーベース EC2 では「ホスト OS → ハイパーバイザー → ゲスト OS」という
3 層構造を経由するため、ネットワーク I/O やストレージ I/O において CPU サイクルが消費されていた。
Nitro System はこの問題を 専用 ASIC (Nitro Card) + 軽量 KVM ハイパーバイザー + Security Chip
の組み合わせで解決した。NW/Storage 処理を専用シリコンに offload することで、
ゲスト OS が利用できる vCPU と DRAM をほぼ 100% ワークロードに割り当てることが可能になった。
Nitro System は以下の3コンポーネントで構成される。
| コンポーネント | 役割 | 実装 |
|---|---|---|
| Nitro Card | NW/Storage/管理処理の offload | 専用 ASIC (NW / Storage / Controller の3種) |
| Nitro Hypervisor | メモリ分離 + CPU スケジューリングのみ | 軽量化 KVM (旧 Xen から移行) |
| Nitro Security Chip | Root of Trust / Measured Boot | マザーボード直実装チップ |
Nitro Card (専用 ASIC) — 3種の役割分担
| カード種別 | 担当処理 | 主要機能 |
|---|---|---|
| Nitro Card for Networking | VPC / SR-IOV / ENA | 帯域保証 / パケット処理 / 暗号化 offload |
| Nitro Card for Storage | EBS NVMe / Instance Store | AES-256 透過暗号化 / NVMe queue 管理 |
| Nitro Controller | BMC 代替 / 電源制御 | セキュリティポリシー強制 / ファームウェア更新 |
Nitro Card の最大の特徴は処理がゲスト OS から完全に透過な点だ。
ゲスト OS は通常の NVMe/ENA デバイスとして認識するが、実際の処理は CPU を消費しない。c7i.48xlarge (192 vCPU) で「ネットワーク 50 Gbps + CPU 100% 同時稼働」が実現できるのは
この offload アーキテクチャによる。
Nitro Hypervisor — 旧 Xen EC2 との比較
| 項目 | 旧 Xen | Nitro KVM |
|---|---|---|
| NW/Storage 処理 | ハイパーバイザーが CPU で処理 | Nitro Card (ASIC) が処理 |
| ゲストへの CPU 割当 | 数% オーバーヘッド消費 | ほぼ 100% 割当可能 |
| ゲスト OS のデバイス認識 | xen_blkfront / xen_netfront | nvme / ena |
| ライブマイグレーション | Xen vMotion 互換 | Stop→Start ベース (廃止) |
Nitro Security Chip — Root of Trust
Nitro Security Chip はマザーボードに直接実装された専用チップで、以下の機能を提供する。
- Secure Boot: ファームウェア → ブートローダー → カーネルの署名検証チェーン
- Measured Boot: 起動の各段階 (Bootloader / Kernel / initramfs / Enclave) をハッシュ値で測定し PCR に記録
- KMS Attestation の根拠: Nitro Enclaves が KMS に鍵取得をリクエストする際、PCR 値が根拠となる
- ファームウェア改竄検知: OS レベルから到達不可能なレイヤーで常時検証

Nitro System 公式ドキュメント — Nitro Enclaves User Guide (AWS)
Nitro System 本番運用 3鉄則
鉄則1 — Bare metal 適性判断を先に行え
Bare metal (i3.metal / c5n.metal 等) は「仮想化非対応ソフトウェアが必要な場合」か
「ハイパーバイザーの 1〜2% オーバーヘッドがビジネス上許容できない場合 (HFT 等)」のみ選択する。
起動時間が通常 EC2 (数十秒) に対して数分〜10 分かかるため Auto Scaling での動的スケールには向かない。
常時稼働 + 事前プロビジョニング前提で設計せよ。
鉄則2 — Nitro Enclaves は「機密データが親インスタンスに漏れてはいけない場合」のみ使え
Nitro Enclaves は永続ストレージなし・ネットワークなし (vsock のみ) の完全隔離環境である。
KMS の秘密鍵マテリアル処理 / 生体認証データ照合 / 支払いトークン処理など
「処理結果のみを親に返す」ユースケースに限定する。
一般的なアプリケーション処理を Enclave に移動するのはアーキテクチャ上のアンチパターンである。
鉄則3 — Security Chip の PCR 値を Enclave イメージのライフサイクルと連動させよ
Nitro Enclaves の KMS Attestation は PCR0 (Enclave イメージのハッシュ) をkms:RecipientAttestation:ImageSha384 条件キーで検証する。
Enclave イメージを再ビルドするたびに PCR0 値が変わるため、
KMS Key Policy の更新を CI/CD パイプラインに組み込まなければ本番 Attestation が通らなくなる。
Bare Metal インスタンス — ハイパーバイザーなし物理サーバ直接アクセス
Bare metal インスタンスはハイパーバイザーを完全にバイパスして物理サーバのリソースに直接アクセスできる。
| インスタンス | vCPU | Memory | NW | 主要用途 |
|---|---|---|---|---|
i3.metal | 72 | 512 GiB | 25 Gbps | NVMe 直接アクセス / Oracle DB raw partition |
c5n.metal | 72 | 192 GiB | 100 Gbps EFA | MPI HPC / RDMA / 高頻度取引 (HFT) |
m6i.metal | 128 | 512 GiB | 50 Gbps | VMware / Hyper-V ネスト仮想化 |
r6i.metal | 128 | 1024 GiB | 50 Gbps | Oracle DB / メモリ集約 HPC |
i3.metal 起動 + Nitro CLI セットアップ
# Nitro Enclaves 有効化オプション付きで i3.metal 起動
aws ec2 run-instances \
--image-id ami-0abcdef1234567890 \
--instance-type i3.metal \
--key-name my-keypair \
--subnet-id subnet-12345678 \
--security-group-ids sg-12345678 \
--enclave-options 'Enabled=true' \
--block-device-mappings '[{"DeviceName":"/dev/xvda","Ebs":{"VolumeSize":100,"VolumeType":"gp3"}}]' \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=nitro-bare-metal}]'
# nitro-cli インストール (Amazon Linux 2023)
sudo dnf install -y aws-nitro-enclaves-cli aws-nitro-enclaves-cli-devel
sudo usermod -aG ne ec2-user
sudo systemctl enable --now nitro-enclaves-allocator.service
# Enclave へ割り当てる CPU/メモリを設定 (/etc/nitro_enclaves/allocator.yaml)
# cpu_count: 2 ← 偶数必須
# memory_mib: 512
sudo systemctl restart nitro-enclaves-allocator.service
Bare metal が必須になるシナリオ:
| ユースケース | 理由 | 推奨インスタンス |
|---|---|---|
| 高頻度取引 (HFT) | レイテンシ < 1 μs 要件 / ハイパーバイザー遅延不可 | c5n.metal (EFA + 100 G) |
| Oracle DB raw partition | Oracle の raw デバイス I/O 要件 | i3.metal / r6i.metal |
| VMware Cloud on AWS | ネスト仮想化 (ESXi / Hyper-V) | m6i.metal / r6i.metal |
| PCI passthrough | GPU / FPGA を VM に直接渡す | p3dn.24xlarge |
Nitro Enclaves — Confidential Computing の実装
Nitro Enclaves は、親インスタンスの vCPU と DRAM の一部を切り出した完全隔離 VM である。
| 特性 | 詳細 |
|---|---|
| 永続ストレージ | なし (Enclave 内でのディスク書き込み不可) |
| ネットワーク | なし (vsock 経由の親インスタンスとの通信のみ) |
| 親からの見え方 | /dev/nitro_enclaves デバイスとして認識 |
| 再起動 | stateless — 起動のたびに初期化 |
| 対応インスタンス | --enclave-options Enabled=true で起動した EC2 のみ |
Nitro Enclaves ビルドと起動
# EIF (Enclave Image Format) ビルド — Dockerfile から変換
nitro-cli build-enclave \
--docker-uri my-enclave-app:latest \
--output-file my-enclave.eif
# 出力例:
# {
#"Measurements": {
# "PCR0": "ab12cd34ef56...96文字hex", <- イメージ全体ハッシュ (KMS Policy に登録必須)
# "PCR1": "0000...0000",<- カーネル+ブートRAMfsのハッシュ
# "PCR2": "ab12cd34ef56..."<- アプリのハッシュ
#}
# }
# Enclave 起動 (CID=16 を割当)
nitro-cli run-enclave \
--cpu-count 2 \
--memory 512 \
--enclave-cid 16 \
--eif-path my-enclave.eif
# 稼働状態確認
nitro-cli describe-enclaves
# [{"EnclaveID":"i-xxx:enc-xxx","EnclaveCID":16,"State":"RUNNING",...}]
# 停止
nitro-cli terminate-enclave --enclave-id i-xxx:enc-xxx
Nitro Enclaves 通信 — vsock (Virtual Socket)
vsock は VM 間通信専用のソケットで TCP/IP スタックを経由しないため VPC/Security Group に影響されない。
| 識別子 | 説明 | 値 |
|---|---|---|
| CID (Context ID) | vsock のアドレス (IP 相当) | 親インスタンス = 3 / Enclave = 16 (デフォルト) |
| Port | vsock のポート番号 | 任意 (例: 5000) |
import socket
import json
# 親インスタンス側 — Enclave へリクエスト送信
def send_to_enclave(cid: int, port: int, payload: dict) -> dict:
sock = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
sock.connect((cid, port))
message = json.dumps(payload).encode()
sock.sendall(len(message).to_bytes(4, "big") + message)
length = int.from_bytes(sock.recv(4), "big")
response = sock.recv(length)
sock.close()
return json.loads(response)
result = send_to_enclave(cid=16, port=5000, payload={"operation": "decrypt", "ciphertext": "base64..."})
Nitro Enclaves KMS Attestation — Terraform 実装
# EC2 インスタンス (Nitro Enclaves 有効化)
resource "aws_instance" "nitro_enclave" {
ami = "ami-0abcdef1234567890"
instance_type = "m6i.metal"
enclave_options {
enabled = true
}
iam_instance_profile= aws_iam_instance_profile.enclave.name
subnet_id = aws_subnet.private.id
vpc_security_group_ids = [aws_security_group.enclave.id]
root_block_device {
volume_type = "gp3"
volume_size = 100
}
}
# KMS Key — PCR0 attestation 条件付き
resource "aws_kms_key" "enclave" {
description = "KMS key for Nitro Enclave attestation"
deletion_window_in_days = 30
policy= data.aws_iam_policy_document.enclave_kms.json
}
data "aws_iam_policy_document" "enclave_kms" {
statement {
sid = "KeyAdministration"
effect = "Allow"
principals {
type = "AWS"
identifiers = ["arn:aws:iam::${data.aws_caller_identity.current.account_id}:root"]
}
actions= ["kms:*"]
resources = ["*"]
}
# Enclave のみが Decrypt 可 — PCR0 値が一致した場合のみ許可
statement {
sid = "EnclaveDecryptOnly"
effect = "Allow"
principals {
type = "AWS"
identifiers = [aws_iam_role.enclave.arn]
}
actions= ["kms:Decrypt"]
resources = ["*"]
condition {
test = "StringEqualsIgnoreCase"
variable = "kms:RecipientAttestation:ImageSha384"
values= ["PCR0_96CHAR_HEX_FROM_BUILD_OUTPUT"]
}
}
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EnclaveDecryptWithAttestation",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/nitro-enclave-role"
},
"Action": "kms:Decrypt",
"Resource": "*",
"Condition": {
"StringEqualsIgnoreCase": {
"kms:RecipientAttestation:ImageSha384": "ab12cd34ef5678901234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"
}
}
}
]
}
kms:RecipientAttestation:ImageSha384 は nitro-cli build-enclave 実行時に出力される PCR0 値と
完全一致しなければ KMS は Decrypt を拒否する。Enclave イメージを 1 行でも変更して再ビルドすると
PCR0 が変わるため、KMS Key Policy 更新を CI/CD パイプラインに必ず組み込むこと。
Nitro Enclaves Attestation 罠 — 本番でハマる 4 パターン
罠1: PCR 値ミスマッチ (最多トラブル)kms:RecipientAttestation:ImageSha384 に設定した PCR0 値と実際の Enclave 起動時の PCR0 が不一致。
原因は「KMS Key Policy を更新し忘れたまま Enclave イメージを再ビルドした」こと。
対策: CI/CD に nitro-cli build-enclave → PCR0 抽出 → aws kms put-key-policy を組み込む。
罠2: enclave-options 未設定による /dev/nitro_enclaves 不在
既存の EC2 に nitro-cli run-enclave を実行して No such file or directory エラーが出る。aws ec2 run-instances 時に --enclave-options 'Enabled=true' を付けないと後から有効化できない
(インスタンスの再作成が必要)。インスタンス起動時のパラメータとして必ず含めること。
罠3: allocator の CPU/メモリ設定不足/etc/nitro_enclaves/allocator.yaml の memory_mib が Enclave の要件を下回ると run-enclave が失敗する。
また cpu_count は偶数でなければならない。事前にメモリ要件を確認し allocator に余裕を持たせること。
罠4: vsock 接続タイミング (Enclave 起動完了前の接続試行)
Enclave が起動完了前に親インスタンス側の vsock クライアントが接続を試みて connect() failed になる。nitro-cli describe-enclaves で "State": "RUNNING" を確認してから vsock 接続を開始すること。
§6 詰まりポイント7選 図解 (Mermaid01 判断ツリー)
Braket / ParallelCluster / AWS Batch HPC / Nitro System の4領域で現場が実際に遭遇する
7つの詰まりポイントを体系化する。以下の判断ツリーで自分のトラブルを特定し、
各パターンの対処法を参照されたし。
graph TD
A[トラブル発生] --> B{領域を特定}
B --> C[Amazon Braket]
B --> D[ParallelCluster]
B --> E[AWS Batch HPC]
B --> F[Nitro System]
C --> C1{コスト急騰?}
C1 -->|Yes| C1R[パターン1: Braket cost runaway]
C --> C2{コスト高止まり?}
D --> D1{クラスタ全停止?}
D1 -->|Yes| D1R[パターン2: HeadNode failure]
D --> D2{ジョブ滞留?}
D2 -->|Yes| D2R[パターン3: Slurm tuning 不在]
D --> D3{MPI速度低下?}
D3 -->|Yes| D3R[パターン4: EFA driver mismatch]
D --> D4{コスト最適化未着手?}
E --> E1{ジョブ頻繁失敗?}
E1 -->|Yes| E1R[パターン5: Batch Spot interruption]
E --> E2{コスト最適化未着手?}
F --> F1{KMS decrypt失敗?}
F1 -->|Yes| F1R[パターン6: Nitro Enclaves attestation失敗]
C2 & D4 & E2 --> G[パターン7: コスト最適化不在]
パターン1: Braket cost runaway — QPU 利用料金が想定の10倍
症状
Amazon Braket では QPU 利用料金が「タスク1件あたり固定料金 + Shot 単価」の2段階課金である。
Reservation や Budget alert を設定せずに本番ループで無制限実行すると、
Cost Explorer アラートが鳴るまで気づかず月次請求が想定の10倍になるケースがある。
原因
- Per-shot 課金モデルの理解不足 — IonQ Aria は $0.01/shot が基本単価
- 本番ループで
shots=10000を繰り返し実行 → Shot 単価 × ループ回数で急騰 - Reservation / Budget alert 未設定で費用上限ガードがない
- IAM 制限で shots 量を制御していない
対策
# Cost Explorer で Braket monthly budget alert を設定
aws budgets create-budget \
--account-id "${AWS_ACCOUNT_ID}" \
--budget '{
"BudgetName": "braket-monthly",
"BudgetLimit": {"Amount": "500", "Unit": "USD"},
"BudgetType": "COST",
"TimeUnit": "MONTHLY"
}' \
--notifications-with-subscribers '[{
"Notification": {
"NotificationType": "ACTUAL",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 80
},
"Subscribers": [{"SubscriptionType": "EMAIL", "Address": "ops@example.com"}]
}]'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "braket:CreateQuantumTask",
"Resource": "*",
"Condition": {
"NumericGreaterThan": {
"braket:shots": "1000"
}
}
}
]
}
パターン1 対処法: Braket cost runaway
- Budget alert を月次予算の80%で設定 (aws budgets create-budget)
- IAM Condition で
braket:shots上限を制限 (例: ≤1000 shots/task) - 開発時は必ず Local Simulator (SV1/DM1) を使用し QPU 実行は最終検証のみ
- 高頻度利用が確定している場合は Braket Quantum Task Batching を検討
パターン2: ParallelCluster headnode failure — AZ 障害でクラスタ全停止
症状
ParallelCluster の Head node は単一 AZ に配置される。その AZ で障害が発生すると、
Slurm スケジューラごとダウンしクラスタ全体が停止する。
Compute fleet が他 AZ で稼働していても Head node が SPOF になるため全ジョブが失敗する。
原因
- Head node の Multi-AZ 配置はサポートされていない (設計上の SPOF)
- Custom AMI を作成していないため Head node の迅速な再作成ができない
- Hot standby cluster を別途用意していない
対策
# Head node の Custom AMI を定期作成 (週次)
pcluster export-image \
--image-id aws-parallelcluster-3-headnode \
--region ap-northeast-1 \
--bucket my-hpc-backups \
--bucket-key-prefix headnode-ami/
# Head node 障害時の迅速再作成
pcluster create-cluster \
--cluster-name prod-hpc-standby \
--cluster-configuration cluster-config-standby.yaml \
--region ap-northeast-1
HeadNode:
InstanceType: c5.2xlarge
Networking:
SubnetId: subnet-xxxxxxxx
Ami:
Id: ami-xxxxxxxxxx
Iam:
AdditionalIamPolicies:
- Policy: arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
パターン2 対処法: ParallelCluster headnode failure
- Head node の Custom AMI を週次で自動作成・S3 保存 (pcluster export-image)
- 障害時は新 AZ で同一 AMI から迅速再作成できる運用手順を整備
- 本番ワークロードには Hot standby cluster を別途維持し Head node 障害時に切替
- Slurm の Job ステートは共有 FSx for Lustre に保存し再起動後も復元可能にする
パターン3: Slurm tuning 不在 — ジョブ滞留・優先度バッティング
症状
デフォルト設定の Slurm では全ジョブが同一 Partition で同一優先度で実行される。
対話型ジョブとバッチジョブが競合し、重要ジョブが何時間も待機するケースが発生する。
原因
- Partition 分離設計なし — interactive / batch / preemptible の3分類が未設定
- QoS 未定義 — ユーザー別・プロジェクト別の CPU/メモリ制限がない
- Priority weight 未設定 — FairShare が機能せず全ジョブが FIFO 実行
対策
# Slurm Partition を3分類に分離 (設定ファイル確認)
cat /opt/slurm/etc/slurm.conf.d/partitions.conf
PartitionName=interactive Nodes=compute-[001-010] MaxTime=4:00:00 Default=NO Priority=100
PartitionName=batch Nodes=compute-[001-100] MaxTime=7-00:00:00 Default=YES Priority=50
PartitionName=preemptible Nodes=compute-[001-200] MaxTime=12:00:00 Default=NO Priority=10 PreemptMode=requeue
# QoS 設定 (プロジェクト別 CPU 制限)
sacctmgr add qos normal-qos MaxCPUs=1000 MaxWall=7-00:00:00
sacctmgr add qos high-priority MaxCPUs=200 MaxWall=4:00:00 Priority=100
# Priority weight 設定確認
scontrol show config | grep PriorityWeight
パターン3 対処法: Slurm tuning 不在
- Partition を
interactive / batch / preemptibleの3種類に分離し優先度を設定 - QoS でユーザー別・プロジェクト別の CPU/メモリ・ウォールタイム上限を定義
- Priority weight で FairShare を有効化し長期待機ジョブの優先度を自動上昇させる
- preemptible Partition では
PreemptMode=requeueを設定し Spot 連携を実現
パターン4: EFA driver mismatch — MPI ジョブが ENA 経由でフォールバック
症状
EFA 対応インスタンスで MPI ジョブを実行しているにもかかわらず、
通信が EFA ではなく ENA 経由になっている。
MPI 通信のレイテンシが EFA 時の100倍近くになり HPL や WRF が著しく遅くなる。
原因
aws-efa-installerのバージョンが古い (EFA kernel module と libfabric のバージョン不一致)- 対応インスタンスタイプ以外で EFA を試みている (hpc6a / hpc7a / c5n / c6gn / p4d のみ対応)
- Placement Group への配置が設定されていない
FI_PROVIDER=efa環境変数が未設定
対策
# EFA installer 最新版インストール
curl -O https://efa-installer.amazonaws.com/aws-efa-installer-latest.tar.gz
tar -xf aws-efa-installer-latest.tar.gz && cd aws-efa-installer
sudo ./efa_installer.sh -y
# EFA 疎通確認 (同一 Placement Group 内の2ノード間)
fi_info -p efa -t FI_EP_RDM
# MPI 実行時に EFA を明示指定
mpirun --hostfile hostfile \
-x FI_PROVIDER=efa \
-x FI_EFA_USE_HUGE_PAGE=1 \
-np 128 ./hpl_benchmark
# ParallelCluster config: EFA + Placement Group の設定 (抜粋)
Networking:
PlacementGroup:
Enabled: true
Efa:
Enabled: true
パターン4 対処法: EFA driver mismatch
aws-efa-installerを最新版に保ち libfabric / EFA kernel module のバージョンを一致させる- 対応 Instance type (hpc6a / hpc7a / c5n / c6gn / p4d / trn1) 以外では EFA は使用不可
- ParallelCluster config で
PlacementGroup.Enabled: trueとEfa.Enabled: trueを必ず設定 - 実行時に
FI_PROVIDER=efaを環境変数で明示指定しfi_info -p efaで疎通確認
パターン5: Batch Spot interruption — 長時間ジョブが頻繁に中断
症状
AWS Batch で Spot インスタンスを使用した長時間 HPC ジョブが Spot interruption により
頻繁に失敗する。再試行するとまた中断され、ジョブが永遠に完了しない。
原因
- Spot instance type が1種類のみ指定 → 特定 AZ で容量不足時に全停止
- チェックポイント機能がなく、中断時に進捗が全消失する
- Spot interruption notice (2分前通知) のハンドリングがない
対策
# AWS Batch Compute Environment: Mixed instance 設定
ComputeResources:
Type: SPOT
AllocationStrategy: SPOT_CAPACITY_OPTIMIZED
InstanceTypes:
- c5.4xlarge
- c5.9xlarge
- c5n.4xlarge
- c5n.9xlarge
- c6i.4xlarge
- c6i.8xlarge
MinvCpus: 0
MaxvCpus: 2048
SpotIamFleetRole: arn:aws:iam::ACCOUNT_ID:role/AmazonEC2SpotFleetRole
import json
import signal
def checkpoint_handler(signum, frame):
save_checkpoint(current_state)
upload_to_fsx(checkpoint_path)
raise SystemExit(0)
signal.signal(signal.SIGTERM, checkpoint_handler)
def save_checkpoint(state):
checkpoint = {"iteration": state.iteration, "results": state.results}
with open("/fsx/checkpoints/job_checkpoint.json", "w") as f:
json.dump(checkpoint, f)
パターン5 対処法: Batch Spot interruption
- Compute Environment の
AllocationStrategy: SPOT_CAPACITY_OPTIMIZED+ 複数 instance type を指定 - アプリケーションレベルのチェックポイント機能を実装し FSx for Lustre に中間状態を保存
- SIGTERM ハンドラーで Spot interruption notice (2分前通知) を捕捉しチェックポイント保存
- AWS Batch の retry 設定で
attempts: 3+onStatusReason: Host EC2*terminatedを設定
パターン6: Nitro Enclaves attestation 失敗 — KMS Decrypt が AccessDenied
症状
Nitro Enclaves 内で KMS Decrypt を呼び出すと AccessDenied が返される。
KMS Key Policy に kms:RecipientAttestation 条件を設定しているが、
Enclave を再ビルドするたびに PCR 値が変化し条件と不一致になる。
原因
- Enclave を再ビルドするたびに PCR0/PCR1/PCR2 の SHA-384 ハッシュが変化する
- KMS Key Policy に古い PCR 値がハードコードされたまま更新されていない
nitro-cli describe-eifによる PCR 値確認が CI/CD に組み込まれていない
対策
# Enclave ビルド後に PCR 値を確認
nitro-cli build-enclave \
--docker-uri my-enclave-app:latest \
--output-file my-enclave.eif
nitro-cli describe-eif --eif-path my-enclave.eif | \
python3 -c "
import json, sys
eif = json.load(sys.stdin)
print('PCR0:', eif['Measurements']['PCR0'])
print('PCR1:', eif['Measurements']['PCR1'])
print('PCR2:', eif['Measurements']['PCR2'])
"
{
"Sid": "AllowEnclaveDecrypt",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::ACCOUNT_ID:role/enclave-role"},
"Action": "kms:Decrypt",
"Condition": {
"StringEqualsIgnoreCase": {
"kms:RecipientAttestation:ImageSha384": "${PCR0_VALUE}"
}
}
}
パターン6 対処法: Nitro Enclaves attestation 失敗
- Enclave 再ビルドのたびに
nitro-cli describe-eifで PCR0/PCR1/PCR2 を取得する - CI/CD パイプラインに PCR 値更新 + KMS Key Policy 更新ステップを組み込む
- PCR0 (Enclave イメージハッシュ) が最も変動しやすいため最低限 PCR0 を条件に含める
- KMS Key Policy の条件を Enclave ビルド時に自動更新する仕組みを構築する
パターン7: コスト最適化不在 — HPC ジョブ常時稼働 / Reservation 未活用
症状
HPC クラスタが常時稼働しており、ジョブがない時間帯も Compute fleet が起動したまま。
Spot 活用・Savings Plans・Reservation を検討していないため
オンデマンド料金をそのまま支払い続けている。
原因
- ParallelCluster の Idle scale-down が未設定 (ScaledownIdletime デフォルト値のまま)
- AWS Batch の Compute Environment が最小 vCPU > 0 に設定されている
- Spot instance を採用していない
- 長期確定ワークロードへの Savings Plans Compute / HPC Reservation 未検討
対策
# ParallelCluster config: アイドルスケールダウンを設定
Scheduling:
Scheduler: slurm
SlurmSettings:
ScaledownIdletime: 10
SlurmQueues:
- Name: batch-queue
ComputeResources:
- Name: spot-instances
Instances:
- InstanceType: c5.18xlarge
MinCount: 0
MaxCount: 100
Spot: true
# Savings Plans Compute の購入確認 (汎用型 HPC ワークロード向け)
aws savingsplans describe-savings-plans \
--savings-plan-types ComputeSavingsPlans \
--states active
# HPC 専用 Reservation の確認 (hpc6a / hpc7a)
aws ec2 describe-reserved-instances \
--filters "Name=instance-type,Values=hpc6a.48xlarge"
パターン7 対処法: コスト最適化不在
- ParallelCluster の
ScaledownIdletime: 10でアイドル時の Compute node 自動削除を設定 - AWS Batch の Compute Environment で
MinvCpus: 0を設定しアイドル時コストゼロを実現 - Mixed instance strategy +
SPOT_CAPACITY_OPTIMIZEDで Spot を最大限活用 - 長期ワークロードは Savings Plans Compute (汎用) または HPC 専用 Reservation で割引
§7 アンチパターン → 正解パターン変換演習 (5問)
Quantum/HPC 本番運用における代表的なアンチパターンを5問の演習形式で示す。
各問は「❌ アンチパターン」と「✅ 正解パターン」のコード対比で学習する。
コードを読んだ後に「なぜそれがアンチパターンなのか」を自分の言葉で説明できるようになることを目標とする。
Q1: 常時稼働 HPC → Auto-scaling + Spot (ParallelCluster)
月次で実行する CFD ジョブのために、EC2 Compute fleet を24時間常時起動している。
❌ アンチパターン
# EC2 Compute fleet を24h手動起動 (月額数十万円の無駄コスト)
aws ec2 run-instances \
--image-id ami-xxxxxxxxxx \
--instance-type hpc6a.48xlarge \
--count 20 \
--placement '{"GroupName":"hpc-pg","Tenancy":"dedicated"}' \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=hpc-compute}]'
# ジョブがない時間帯も20インスタンスが稼働し続ける
# hpc6a.48xlarge オンデマンド: 約$14.4/h × 20台 × 24h = $6,912/日
✅ 正解パターン
# ParallelCluster config: Idle scale-down + Spot integration
Scheduling:
Scheduler: slurm
SlurmSettings:
ScaledownIdletime: 10
SlurmQueues:
- Name: cfd-queue
ComputeResources:
- Name: hpc-spot
Instances:
- InstanceType: hpc6a.48xlarge
- InstanceType: c5n.18xlarge
- InstanceType: c6gn.16xlarge
MinCount: 0
MaxCount: 50
Spot: true
# ジョブ実行時のみ自動スケールアップ・完了後10分でアイドルノード自動削除
sbatch --partition=cfd-queue --nodes=20 --ntasks-per-node=96 cfd_job.sh
解説
ParallelCluster の ScaledownIdletime は Slurm が「このノードは10分間ジョブなし」と判定した
タイミングで EC2 インスタンスを自動終了する設定である。MinCount: 0 と組み合わせることで
アイドル時のコストをゼロにできる。Spot instance type を複数指定することで容量確保の安定性も向上する。
Q2: 単一 AZ HPC → Multi-AZ FSx for Lustre + S3 backed
HPC ジョブの作業ファイルを FSx for Lustre Scratch に保存しているが、AZ 障害でデータが消失した。
❌ アンチパターン
# FSx for Lustre Scratch を単一 AZ のみに配置 (AZ障害でデータ消失)
aws fsx create-file-system \
--file-system-type LUSTRE \
--storage-capacity 1200 \
--subnet-ids subnet-xxxxxxxx \
--lustre-configuration '{
"DeploymentType": "SCRATCH_2",
"PerUnitStorageThroughput": 200
}'
# SCRATCH_2 は短期作業用: AZ 障害でデータが消えてもよい設計が前提
# 長期データや重要中間結果を SCRATCH に置いているのがアンチパターン
✅ 正解パターン
# FSx for Lustre Persistent + S3 backed で冗長化
aws fsx create-file-system \
--file-system-type LUSTRE \
--storage-capacity 2400 \
--subnet-ids subnet-xxxxxxxx \
--lustre-configuration '{
"DeploymentType": "PERSISTENT_2",
"PerUnitStorageThroughput": 500,
"DataCompressionType": "LZ4",
"AutoImportPolicy": "NEW_CHANGED_DELETED",
"ImportPath": "s3://my-hpc-data/input/",
"ExportPath": "s3://my-hpc-data/output/"
}'
# ジョブ完了後に S3 へ自動エクスポート
aws fsx create-data-repository-task \
--file-system-id fs-xxxxxxxxxx \
--type EXPORT_TO_REPOSITORY \
--paths / \
--report '{"Enabled":true,"Path":"s3://my-hpc-logs/","Format":"REPORT_CSV_20191124"}'
解説
FSx for Lustre には SCRATCH_1/SCRATCH_2 (短期作業用・AZ 障害でデータ消失あり) とPERSISTENT_1/PERSISTENT_2 (長期保存・高耐久・AZ 障害でも保護) の2系統がある。
重要な中間結果・最終出力は PERSISTENT_2 + S3 backed に配置し
S3 エクスポートタスクでバックアップを確保することで AZ 障害に対応する。
Q3: boto3 直接呼出 → Braket SDK + Hybrid Jobs
Amazon Braket での量子タスク実行を boto3.client(‘braket’) で直接記述していた。
❌ アンチパターン
import boto3
import json
braket = boto3.client('braket', region_name='us-east-1')
# boto3 直接呼出: 低レベルAPI・エラーハンドリング・タスク追跡が困難
response = braket.create_quantum_task(
action=json.dumps({
"braketSchemaHeader": {
"name": "braket.ir.openqasm.program",
"version": "1"
},
"source": "OPENQASM 3.0;\nqubit[2] q;\nh q[0];\ncnot q[0], q[1];",
"inputs": {}
}),
deviceArn='arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1',
shots=1000,
outputS3Bucket='my-braket-output',
outputS3KeyPrefix='results/'
)
# タスク追跡・結果取得・エラーリトライを全て手実装が必要
✅ 正解パターン
from braket.aws import AwsDevice
from braket.circuits import Circuit
from braket.devices import LocalSimulator
from braket.jobs import hybrid_job
# Braket SDK を使用した高レベル実装
circuit = Circuit()
circuit.h(0)
circuit.cnot(0, 1)
circuit.probability(target=[0, 1])
# Local Simulator で先に動作確認 (コスト不要)
local_sim = LocalSimulator()
result = local_sim.run(circuit, shots=1000).result()
print("Local Simulator:", result.measurement_probabilities)
# 本番 QPU 実行 (IonQ Aria) — SDK が自動でポーリング管理
device = AwsDevice("arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1")
task = device.run(
circuit,
shots=1000,
s3_destination_folder=("my-braket-output", "results/")
)
result = task.result()
print("QPU Result:", result.measurement_probabilities)
# Hybrid Jobs: 古典最適化ループ + 量子実行の統合 (VQE/QAOA 向け)
@hybrid_job(device="arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1")
def vqe_job(num_qubits=4, max_iterations=50):
import numpy as np
from braket.circuits import Circuit, FreeParameter
theta = FreeParameter("theta")
circuit = Circuit().ry(0, theta).cnot(0, 1)
device = AwsDevice(get_job_device_arn())
for i in range(max_iterations):
angle = np.random.uniform(0, 2 * np.pi)
result = device.run(circuit(theta=angle), shots=100).result()
log_metric(metric_name="energy", value=compute_energy(result), iteration_number=i)
解説
boto3.client('braket') は低レベル API であり、タスク追跡・結果ポーリング・エラーリトライを
全て手実装する必要がある。Braket SDK の AwsDevice.run() は内部でポーリングと
タイムアウト管理を行い、Local Simulator との切り替えも1行で実現できる。
VQE / QAOA などの変分アルゴリズムには @hybrid_job デコレータを使用し
古典最適化ループと量子実行を統合して管理する。
Q4: EC2 手動構成 → ParallelCluster IaC (pcluster CLI)
HPC クラスタを EC2 手動起動 + SSH で Slurm を手動インストールして構築していた。
❌ アンチパターン
# EC2 手動起動 + Slurm 手動インストール (再現性・再構築性ゼロ)
aws ec2 run-instances \
--image-id ami-xxxxxxxxxx \
--instance-type c5.2xlarge \
--key-name my-key \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Role,Value=headnode}]'
# SSH でログインして手動設定 (手順書が人間の記憶頼り)
# sudo yum install slurm ... && sudo vi /etc/slurm/slurm.conf
✅ 正解パターン
# cluster-config.yaml: 宣言型で全構成を定義
Region: ap-northeast-1
Image:
Os: alinux2023
HeadNode:
InstanceType: c5.2xlarge
Networking:
SubnetId: subnet-xxxxxxxx
Ssh:
KeyName: my-hpc-key
Scheduling:
Scheduler: slurm
SlurmQueues:
- Name: compute
ComputeResources:
- Name: c5-spot
Instances:
- InstanceType: c5.18xlarge
MinCount: 0
MaxCount: 100
Spot: true
Networking:
SubnetIds:
- subnet-xxxxxxxx
- subnet-yyyyyyyy
SharedStorage:
- Name: fsx-lustre
StorageType: FsxLustre
MountDir: /fsx
FsxLustreSettings:
StorageCapacity: 1200
DeploymentType: PERSISTENT_2
PerUnitStorageThroughput: 200
# 一発でクラスタ作成 (10-15分で完全な HPC クラスタが構築される)
pcluster create-cluster \
--cluster-name prod-hpc-cluster \
--cluster-configuration cluster-config.yaml \
--region ap-northeast-1
# クラスタ状態確認
pcluster describe-cluster --cluster-name prod-hpc-cluster
解説
ParallelCluster IaC (pcluster CLI + cluster-config.yaml) は CloudFormation をバックエンドとして、
Head node / Compute fleet / Slurm スケジューラ / EFA / FSx for Lustre の全構成を
宣言型で管理する。手動構成と違い cluster-config.yaml を git 管理することで
「誰でも同一クラスタを再現できる」状態になる。障害時の再作成も pcluster create-cluster 1コマンドで完結する。
Q5: 仮想化 EC2 + Hyper-V → Nitro Bare metal
Windows Server 上で Hyper-V を動かし、その上に VM を作成しようとしていたが
PCI パススルーが動作しなかった。
❌ アンチパターン
仮想化 EC2 上での Hyper-V (PCI パススルー不可)
EC2 m6i.xlarge (仮想化)
└── Nitro Hypervisor (AWS の仮想化レイヤー)
└── Windows Server (仮想化 EC2 インスタンス)
└── Hyper-V (ネスト型仮想化)
└── GPU デバイス (PCI パススルー) → 失敗
Nitro Hypervisor がハードウェアを仮想化しているため
その上の Hyper-V は物理デバイスに直接アクセスできない
→ PCI パススルー・SR-IOV・DPDK 等のハードウェア直接利用は全て不可
✅ 正解パターン
# Bare metal インスタンスを起動 (Nitro Hypervisor なし = 物理サーバ直接)
aws ec2 run-instances \
--image-id ami-xxxxxxxxxx \
--instance-type i3.metal \
--placement '{"Tenancy":"host"}' \
--key-name my-key
# Bare metal 確認: virt-what で仮想化レイヤーが存在しないことを確認
sudo virt-what
# (空出力 = 仮想化なし = Bare metal であることの確認)
# Nitro Enclaves も Bare metal で最大性能が得られる
nitro-cli run-enclave \
--eif-path my-enclave.eif \
--memory 4096 \
--cpu-count 2 \
--enclave-cid 16
# エンクレーブの状態確認
nitro-cli describe-enclaves
解説
通常の EC2 インスタンス (m6i.xlarge 等) は Nitro Hypervisor により仮想化されており、
ゲスト OS から物理ハードウェアへの直接アクセスはできない。Hyper-V でネスト型仮想化は動作するが、
PCI パススルー・SR-IOV・DPDK 等は物理レイヤーへのアクセスが必要なため動作しない。
Bare metal インスタンス (i3.metal / c5n.metal / m6i.metal 等) では Nitro Hypervisor が除去されており、
OS が物理ハードウェアに直接アクセスできる。HFT / Oracle DB ライセンス / Hyper-V + PCI パススルー /
Nitro Enclaves 最大性能などがこの特性を必要とする。
§8 まとめ + 第21軸目Quantum/HPCシリーズ起点告知 + 51記事化達成告知 + 全軸クロスリンク (Mermaid02)
§8-1 まとめ — 4領域横断の本番運用原則
本記事 Quantum/HPC本番運用 Vol1 では、AWS の先端領域計算サービス4本柱を
本番運用の視点で体系化してきた。各領域のポイントを改めて整理する。
Amazon Braket 本番運用のポイント
Amazon Braket は IonQ Aria / Rigetti Aspen-M / IQM Garnet / QuEra Aquila の4種類の
量子ハードウェアを統一 API で扱えるマネージドサービスである。
本番運用では「開発フェーズは Local Simulator (SV1/DM1/TN1) で徹底検証し、
最終検証のみ QPU 実行」という原則が重要である。
コスト管理では Budget alert + IAM の braket:shots 上限制限を必ず設定し、
Per-shot 課金モデルに起因するコスト急騰を防ぐ。
VQE / QAOA などの変分アルゴリズムは @hybrid_job デコレータを使用し、
古典最適化ループ (SageMaker) と量子実行 (QPU) を統合管理する。
ParallelCluster 本番運用のポイント
ParallelCluster は CloudFormation をバックエンドに、Slurm スケジューラ + EFA +
FSx for Lustre の HPC クラスタ全体を cluster-config.yaml で宣言的に管理する。
Slurm のチューニングは Partition 分離 (interactive/batch/preemptible) とQoS 定義 と Priority weight の3点が核心である。
EFA を活用するには aws-efa-installer の最新版 + Placement Group + FI_PROVIDER=efa の
明示指定が必須であり、対応インスタンスタイプの確認も忘れてはならない。
Head node は SPOF であるため、Custom AMI の定期バックアップと
Hot standby cluster の維持が本番設計の前提となる。
AWS Batch HPC 本番運用のポイント
AWS Batch HPC は「自律型 HPC ジョブスケジューラ」として、
ParallelCluster (Slurm 手動管理) とは用途を使い分ける。
Compute environment の設計では SPOT_CAPACITY_OPTIMIZED + Mixed instance type が
安定した Spot 容量確保の鍵である。
Long-running ジョブには必ずアプリケーションレベルのチェックポイント機能を実装し、
SIGTERM ハンドラーで Spot interruption notice を捕捉して FSx for Lustre に保存する。
Multi-node parallel job (MPI / NCCL) では EFA 対応インスタンスと
Placement Group を組み合わせることで最大通信性能を引き出せる。
Nitro System 本番運用のポイント
Nitro System は「EC2 の仮想化基盤そのもの」であり、ほとんどの EC2 インスタンスが
Nitro Hypervisor + Nitro Card + Security Chip の上で動作している。
Bare metal インスタンス (i3.metal 等) は Nitro Hypervisor を除去した
物理サーバ直接アクセスを提供し、HFT / Oracle DB / Hyper-V + PCI パススルー /
Nitro Enclaves 最大性能が要求されるワークロードで採用する。
Nitro Enclaves は KMS attestation (PCR 値) が命綱であり、
Enclave 再ビルドのたびに nitro-cli describe-eif で PCR 値を確認し
KMS Key Policy を更新する CI/CD 自動化が必須である。
4領域横断の本番運用3原則
| 原則 | 内容 | 適用領域 |
|---|---|---|
| コスト制御ファースト | Budget alert + Idle scale-down + Spot で常時コストを監視・削減 | Braket / ParallelCluster / Batch HPC |
| 観測性の確保 | CloudWatch + squeue + fi_info + nitro-cli でリアルタイム状態把握 | 全領域 |
| IaC と自動化 | cluster-config.yaml / pcluster CLI / Batch Job definition で全構成を宣言的管理 | ParallelCluster / Batch HPC |
先端領域 (Quantum/HPC/Bare metal) は実験的ワークロードから始まりがちだが、
本番運用に持ち込む際には「コスト暴走防止」「障害設計」「IaC による再現性」の3原則を
一般的なクラウドワークロードと同様に徹底することが求められる。
AWS本番運用シリーズ 第21軸目 Quantum/HPC本番運用シリーズ起点
量子コンピューティング × HPC × Bare metal の先端領域を体系化。
AWS本番運用シリーズは、ここまで20軸にわたって「仮想化された一般的なクラウドワークロード」を中心に
本番運用知見を体系化してきた。本 Vol1 はその延長線上に位置しながら、既存20軸とは質的に異なる
「先端領域計算」を扱う第21軸目の起点となる。
既存20軸 (L3/L4層) との位置付け差分
- 既存20軸の主戦場: L3 (仮想化 EC2) / L4 (マネージドサービス: Lambda / Fargate / DynamoDB)
- 第21軸目の主戦場: L0 (量子: Amazon Braket) / L1 (Bare metal: Nitro System) / L2 (HPC: ParallelCluster + Batch HPC + EFA)
- 扱う計算問題: 創薬・気候シミュレーション・量子化学・金融リスク・ゲノム解析・流体力学・暗号解析
Vol2 / Vol3 / Vol4 ロードマップ
- Vol2: Hybrid Jobs 深掘り — VQE (Variational Quantum Eigensolver) / QAOA (Quantum Approximate Optimization Algorithm) の古典最適化ループ実装。Braket SDK + SageMaker の統合アーキテクチャ。量子回路設計のベストプラクティス。
- Vol3: HPC ジョブ最適化 — Slurm advanced tuning (FairShare / Priority weight / Preemption) / NCCL (NVIDIA Collective Communications Library) / DCGM (Data Center GPU Manager) / HPL / WRF ベンチマーク。
- Vol4 候補: Nitro Enclaves セキュア計算 — KMS attestation 実運用 / vsock 通信設計 / Confidential computing の本番事例 / 金融・医療データの隔離計算パターン。
既存軸から本軸への導線
- SRE ルート: Observability Vol3 (App Signals / SLO) → 本 Vol1 (HPC ジョブ観測性)
- HPC エンジニアルート: Container Vol3 (EKS + Karpenter) → 本 Vol1 (ParallelCluster + EFA)
- Security 担当ルート: Security Vol3 → 本 Vol1 §5 (Nitro Enclaves attestation)
- AI/ML 担当ルート: AI/ML Vol3 (SageMaker MLOps) → 本 Vol1 §2 (Hybrid Jobs × SageMaker)
- Storage 担当ルート: Storage Vol2 (FSx / EBS Multi-Attach) → 本 Vol1 §3 (FSx for Lustre HPC 運用)
- Network 担当ルート: Network Vol2 → 本 Vol1 §3/§4 (EFA / Placement Group)
先端領域への投資判断基準 (経営層・アーキテクト向け)
- Braket 投資判断: 既存古典アルゴリズムで5年以内に解けない問題がある場合のみ PoC 着手。Local Simulator で QPU リソース無しに検証可能なため、まずは月額数万円規模の小さな PoC から始め、QPU 実機実行は最終検証のみに絞る。
- ParallelCluster / Batch HPC 投資判断: オンプレ HPC クラスタの年間 TCO (ハードウェア + 冷却 + 電力 + 運用人件費) と AWS HPC の Spot 中心構成 TCO を比較し、稼働率 70% 以下なら AWS への移行が経済合理性を持つことが多い。
- Nitro Enclaves 投資判断: 機密データの処理コードと結果を分離する強い要請がある場合に限定。CI/CD パイプライン構築の追加投資を上回るセキュリティ価値があるかを事前評価する。
企業内推進ルート — 先端領域チーム立ち上げの典型パターン
- Phase 1 (3〜6ヶ月): 既存 SRE / HPC / Security チーム内で本記事レベルの知見を1〜2名が習得。Local Simulator + Bare metal の小規模 PoC を実施。
- Phase 2 (6〜12ヶ月): 専任チーム (2〜4名) を立ち上げ、Vol2 / Vol3 レベルの深堀り知識を獲得。本番 QPU 実行 / 大規模 HPC ジョブ / Nitro Enclaves 本番投入を順次実施。
- Phase 3 (12ヶ月〜): 全社横断の「先端計算 CoE (Center of Excellence)」として、創薬 / 金融 / 暗号 / 製造シミュレーションなど複数事業部の問い合わせに対応する組織化。
本シリーズの完成度マイルストーン
- Vol1 公開時点 = 4本柱の本番運用初期知見を体系化済 (本記事)
- Vol4 公開時点 (予定) = 量子+HPC+Bare metal 全領域の本番事例網羅完了 / 先端計算 CoE 設計テンプレ提供
51記事化大台達成 — AWS本番運用シリーズ全21軸全容
本記事の公開により、AWS本番運用シリーズは50記事の大台を超え51記事化を達成した。
前回 Observability Vol3 で50記事の節目を迎えた直後、第21軸目の新シリーズを即座に立ち上げた。
AWS本番運用シリーズ 全21軸 完全リスト
- 第1軸: IAM本番運用 (Vol1) — ポリシー設計 / SCP / Permission Boundary / Assume Role 設計
- 第2軸: EKS本番運用 (Vol1) — Pod Identity / Karpenter / Cluster Autoscaler / ノードグループ設計
- 第3軸: 復旧運用編 (Vol1-4) — 障害対応 / Runbook / RTO/RPO 設計 / マルチリージョン冗長
- 第4軸: AI/ML本番運用 (Vol1-3) — SageMaker / Bedrock / Feature Store / MLOps Pipelines / Hybrid Jobs
- 第5軸: Security本番運用 (Vol1-3) — IAM 深掘り / Macie / Detective / Trusted Advisor / Cost Intelligence
- 第6軸: コスト最適化 (Vol1) — Savings Plans / Reserved Instance / Spot / Cost Explorer / Budgets
- 第7軸: Multi-Account (Vol1) — Organizations / SCP / OU 設計 / Control Tower / Account Factory
- 第8軸: Observability本番運用 (Vol1-3) — CloudWatch / X-Ray / App Signals / SLO / Service Map / CodeGuru
- 第9軸: Network本番運用 (Vol1-2) — VPC 設計 / Transit Gateway / Direct Connect / EFA / Placement Group
- 第10軸: DevOps本番運用 (Vol1-3) — CodePipeline v2 / CDK Pipelines / GitOps / Self-mutating Pipeline
- 第11軸: Database本番運用 (Vol1-4) — Aurora / RDS / DynamoDB / ElastiCache / Neptune / DocumentDB
- 第12軸: Serverless本番運用 (Vol1-2) — Lambda / API Gateway / Step Functions / EventBridge / SQS / SNS
- 第13軸: Container本番運用 (Vol1-3) — ECS / EKS / Fargate / Karpenter / Pod Identity / Service Connect
- 第14軸: Storage本番運用 (Vol1-2) — S3 / EBS / EFS / FSx / Backup / DataSync / Storage Gateway
- 第15軸: Edge本番運用 (Vol1) — CloudFront / Lambda@Edge / Global Accelerator / WAF / Shield
- 第16軸: Analytics本番運用 (Vol1) — Athena / Glue / EMR / Kinesis / Redshift / Lake Formation
- 第17軸: Migration本番運用 (Vol1) — Migration Hub / Application Discovery / Database Migration / VM Import
- 第18軸: IoT本番運用 (Vol1-2) — IoT Core / Greengrass / SiteWise / Device Defender / Fleet Hub
- 第19軸: Game-Media本番運用 (Vol1) — GameLift / IVS / MediaLive / MediaConvert / Elemental
- 第20軸: (Observability Vol3 = 50記事達成) — Observability シリーズ完結 / 全20軸50記事の節目
- 第21軸: Quantum/HPC本番運用 (Vol1 = 本記事) — Amazon Braket / ParallelCluster / AWS Batch HPC / Nitro System
50記事の時点で「一般的なクラウドワークロード」の本番運用知見を一通り体系化した。
51記事目となる本 Vol1 からは、量子コンピューティング・HPC・Bare metal という
「次世代先端領域」への深化フェーズに入る。引き続き Vol2 / Vol3 で縦深化を進め、
AWS先端計算の本番運用知見を完成させていく。
21軸を横断する「本番運用の3つの普遍原則」
- 原則1: 全構成を IaC で宣言的に管理 — IAM ポリシー (第1軸) からParallelCluster cluster-config.yaml (第21軸) まで、人手のコンソール操作を排除し再現性と監査性を確保する。CDK / Terraform / CloudFormation のいずれかで全AWSリソースを宣言する文化を全21軸で共通化する。
- 原則2: コスト制御を運用フェーズ前に設計 — Cost Explorer + Budget alert + IAM 制限の3層構造で「予算超過は IAM 側で物理的に止める」設計を全21軸で徹底する。第6軸 (コスト最適化) と第21軸 (Quantum/HPC) は特にこの原則が命綱となる。
- 原則3: 観測性を「メトリクス + ログ + トレース + プロファイル」の4層で構築 — 第8軸 (Observability Vol1-3) で確立した4層観測性パターンを、第21軸の HPC ジョブ / 量子タスク / Bare metal Enclave 通信にも適用する。CloudWatch Metrics + Logs Insights + X-Ray + CodeGuru Profiler の組み合わせは全21軸で共通基盤となる。
21軸の全記事を通読することで、AWS 上で「一般的なクラウドワークロード」と
「先端領域計算ワークロード」の両方を本番品質で運用できる総合力が獲得できる。
特定領域だけを深堀りするのではなく、軸横断で原則を理解することが、
クラウドアーキテクトとしての成熟度を高める近道である。
52記事目以降のロードマップ予告
- 第21軸 Vol2: Hybrid Jobs 深掘り (VQE / QAOA 古典最適化ループ完全実装)
- 第22軸目 候補: AI Native アプリ本番運用 (Bedrock Agents × Knowledge Bases × Prompt Engineering)
- 各既存軸の Vol+1 (例: IAM Vol2 / Migration Vol2) を読者投票で順次拡充予定
§8-4 Mermaid02 — 第21軸目Quantum/HPCマップ + 全軸接続図
graph LR
QH1["Quantum/HPC Vol1<br/>本記事"]
QH2["Vol2: Hybrid Jobs<br/>VQE/QAOA"]
QH3["Vol3: HPC最適化<br/>Slurm/NCCL/DCGM"]
QH4["Vol4候補: Nitro Enclaves<br/>セキュア計算"]
QH1 --> QH2
QH1 --> QH3
QH1 --> QH4
OBS3["Observability Vol3<br/>App Signals / SLO"] --> QH1
CTR3["Container Vol3<br/>EKS / Karpenter"] --> QH1
SEC3["Security Vol3<br/>Macie / Detective"] --> QH1
ML3["AI/ML Vol3<br/>SageMaker MLOps"] --> QH1
STR2["Storage Vol2<br/>FSx / EBS"] --> QH1
NET2["Network Vol2<br/>EFA / Placement"] --> QH1
本記事で扱った4領域の対応サービス早見表
| 領域 | 主要サービス | 本番運用の核心 |
|---|---|---|
| 量子 | Amazon Braket | Local Simulator 優先 / Budget alert / @hybrid_job |
| HPC クラスタ | ParallelCluster | Slurm tuning / EFA / FSx Persistent / IaC |
| HPC バッチ | AWS Batch HPC | SPOT_CAPACITY_OPTIMIZED / Checkpoint / Multi-node |
| Bare metal | Nitro System | i3.metal / Nitro Enclaves / PCR 値 CI/CD 自動化 |
本記事で Quantum/HPC 本番運用の4本柱 (Braket / ParallelCluster / Batch HPC / Nitro System) を
習得した読者が次に読むべき記事を紹介する。
前の記事: AWS Observability本番運用 Vol3
App Signals × SLO × Service Map × CodeGuru Profiler 完全ガイド
関連記事: Container Vol3 (Bare metal × EKS 連携)
EKS Pod Identity × Karpenter × Service Connect 完全ガイド
関連記事: Storage Vol2 (FSx for Lustre 基礎)
FSx / EBS Multi-Attach / Storage Gateway 完全ガイド
次の記事 (Vol2 公開予定): Quantum/HPC本番運用 Vol2
Hybrid Jobs 深掘り — VQE / QAOA 古典最適化ループ実装 [公開予定]
Quantum/HPC × AWS の先端領域は、まだ本番運用事例が少ない開拓フロンティアである。
本記事を読んで「自社ワークロードへの適用方法」「特定の詰まりポイントの解決策」
「Vol2/Vol3 で深掘りすべきトピック」について、ぜひコメント欄でフィードバックをいただきたい。
特に以下の点について読者の声を聞かせてほしい。
- Amazon Braket で試したいアルゴリズムやユースケース (創薬 / 金融 / 物流最適化 など)
- ParallelCluster / AWS Batch HPC への移行を検討しているオンプレ HPC ワークロードの種類
- Nitro Enclaves を活用したいセキュアな計算要件 (医療データ / 金融リスク計算 など)
- Vol2 (Hybrid Jobs) / Vol3 (HPC ジョブ最適化) / Vol4 候補 (Nitro Enclaves) のどれを優先して欲しいか
- 本記事で扱いきれなかった先端領域トピック (FPGA F2 インスタンス / SageMaker HyperPod / Trainium クラスタ など) で深掘りを希望するもの
- 自社で既に本番運用している先端領域ワークロードの事例共有 (匿名希望含む)
フィードバックチャネル
本記事に関するフィードバックや質問は以下のいずれかでお寄せいただきたい。
- ページ末尾コメント欄: 公開コメントとしてやり取りしたい場合
- SNS シェア + メンション: X (Twitter) / Bluesky 等で
#AWS本番運用シリーズハッシュタグを付けて投稿 - 個別問い合わせ: 機密性のある事例や具体的なアーキ相談はサイト問い合わせフォームから
読者アンケート — Vol2 の重点トピック投票
次の Vol2 で優先して扱うべきトピックを以下から選んで頂きたい (複数選択可)。
- A: VQE / QAOA の Python 完全実装例 (古典最適化ループ含む)
- B: Hybrid Jobs の SageMaker Pipelines 統合パターン (CI/CD 含む)
- C: Local Simulator 3種 (SV1 / DM1 / TN1) の選択ベンチマーク実測
- D: Braket Cost制御の本番事例 (Reservation / Budget自動制御)
- E: 量子化学アルゴリズム (Quantum Chemistry) の Braket 実装
量子コンピューティング・HPC・Bare metal は、今後5〜10年で「一般的なクラウドワークロード」に
なっていく可能性がある技術領域である。このシリーズが読者の先端領域への挑戦を支える
一助になれば幸いである。AWS が継続的に投入する先端計算サービス群を、本シリーズが
追随的に体系化していくことで、読者の本番投入意思決定を支える情報源となることを目指す。
次の Vol2 では Hybrid Jobs (VQE / QAOA) の実装を中心に、量子古典ハイブリッドアルゴリズムの
本番運用を深掘りする予定である。引き続きお楽しみいただきたい。
本記事がフロンティアに挑む読者の最初の足がかりとなることを願っている。