Open2
Google Cloud BatchとCloud Run Jobsの徹底比較

Cloud Batch採用のメリット
1. HPC・並列処理の最適化
- 配列ジョブ(Array Jobs)のネイティブサポート: 数千の類似タスクを効率的に並列実行
- MPIサポート: マルチノード間の密結合通信が必要な科学計算に対応
- ジョブ間の依存関係管理: DAG(有向非巡回グラフ)による複雑なワークフロー制御
2. コンピューティングリソースの柔軟性
- GPUの高度な制御: 特定のGPUタイプ(A100、T4等)の選択が容易
- プリエンプティブルVM/Spot VM: 最大91%のコスト削減が可能
- カスタムマシンタイプ: CPU・メモリ比を細かく調整可能
- ローカルSSDの活用: 高速なスクラッチストレージ
3. 長時間実行ジョブへの対応
- 実行時間制限がより緩和的: 数日〜数週間の実行も想定
- 自動リトライとチェックポイント機能: 長時間ジョブの信頼性向上
4. ストレージ統合
- 並列ファイルシステム: Lustre、NFSなどの統合が容易
- 大容量データの効率的な処理: Persistent Diskの柔軟なマウント
5. 既存HPC資産の移行
- 従来のバッチスクリプト互換性: SLURM等からの移行がスムーズ
- Docker以外のコンテナランタイム: Singularityなどにも対応
6. きめ細かいリソース管理
- ノードごとのタスク配置制御: アフィニティ・アンチアフィニティの設定
- リソースプールの予約: 確実なリソース確保
Cloud Batch採用のデメリット
1. サーバーレスではない複雑さ
- インフラ管理の増加: VM起動時間、ネットワーク設定などの考慮が必要
- コールドスタートの遅延: VMプロビジョニングに数分かかることも
2. コスト面での注意点
- 最小課金単位: VMベースのため、短時間ジョブでは割高
- アイドル時間への課金: リソースが確保されている間は課金継続
- ネットワーク帯域幅コスト: 大容量データ転送で高額化の可能性
3. 運用の複雑性
- 設定の学習曲線: Cloud Run Jobsより設定項目が多い
- デバッグの難しさ: 分散環境でのトラブルシューティングが複雑
- モニタリング: より詳細な監視設定が必要
4. スケーラビリティの制約
- クォータ制限: リージョンあたりのCPU/GPU数に上限
- スケールアウトの速度: VMベースのため、Cloud Run Jobsより遅い
- リソース競合: 他の利用者とのリソース競合の可能性
5. 開発・デプロイの煩雑さ
- CI/CDパイプラインの複雑化: デプロイプロセスがより手動的
- バージョン管理: コンテナイメージとジョブ定義の両方を管理
- テスト環境の構築: ローカルでの動作確認が困難
6. ベンダーロックイン
- GCP固有の機能依存: 他クラウドへの移行が困難
- APIの複雑さ: Cloud Run Jobsよりプラットフォーム依存度が高い
選択の判断基準
Cloud Batchが適している場合
- 数千以上の並列タスク実行
- GPU/TPUを使った機械学習トレーニング
- MPI等を使う科学計算・シミュレーション
- 数時間〜数日かかる長時間処理
- 既存のHPCワークロードの移行
- コスト最適化のためSpot VMを活用したい
Cloud Run Jobsが適している場合
- 数分〜数十分の短時間処理
- イベント駆動の単純なバッチ処理
- 完全なサーバーレスを求める
- 迅速なスケールアウトが必要
- シンプルな運用を優先
- 頻繁なデプロイが発生する

DAGとは何か?
DAG = Directed Acyclic Graph(有向非巡回グラフ)
簡単に言うと「タスクの実行順序を矢印で表した図で、ループがないもの」です。
- 有向(Directed): 矢印に方向がある(A→B)
- 非巡環(Acyclic): ぐるぐる回らない(A→B→C→Aのような循環がない)
具体例で理解する
例1: 動画処理パイプライン
[動画アップロード]
↓
[動画分割] ← ここから並列実行
↓
┌──┴──┬──────┬──────┐
↓ ↓ ↓ ↓
[HD変換][4K変換][音声抽出][サムネイル生成]
↓ ↓ ↓ ↓
└──┬──┴──────┴──────┘
↓
[メタデータ統合]
↓
[データベース登録]
↓
[通知送信]
DAGでできること:
- 「動画分割が終わってから」HD変換・4K変換・音声抽出を同時並列実行
- 全ての変換が終わってから、メタデータ統合を実行
- 依存関係を自動管理(親タスクが失敗したら子タスクは実行しない)
例2: 機械学習パイプライン
[データ取得A] [データ取得B] [データ取得C]
↓ ↓ ↓
└───────┬───┴───────────┘
↓
[データ統合]
↓
[前処理・クレンジング]
↓
┌───────┴───────┐
↓ ↓
[モデルA訓練] [モデルB訓練]
↓ ↓
└───────┬───────┘
↓
[モデル評価]
↓
[最良モデル選択]
↓
[デプロイ]
DAGでできること:
- 複数のデータソースから並列取得
- データが揃ってから次のステップへ
- 複数モデルを並列訓練してコスト・時間削減
- 1つのタスクが失敗したら、そこから先は実行しない
DAGがない場合の問題
❌ 単純な順次実行だと...
# シェルスクリプトの例
./task1.sh
./task2.sh
./task3.sh
./task4.sh
問題点:
- 並列化できない → 時間がかかる
- 依存関係が不明確 → task3が実際にはtask1だけに依存していても、task2の完了を待つ
- 失敗時の制御が難しい → どのタスクが失敗しても、次が実行されてしまう
- 再実行が非効率 → 全体をやり直す必要がある
Cloud BatchでのDAG実装例
{
"taskGroups": [
{
"taskSpec": {
"runnables": [{"container": {"imageUri": "データ取得"}}]
},
"taskCount": 3,
"parallelism": 3
},
{
"taskSpec": {
"runnables": [{"container": {"imageUri": "前処理"}}]
},
"taskCount": 1,
"dependencies": [0] // ← タスクグループ0に依存
},
{
"taskSpec": {
"runnables": [{"container": {"imageUri": "訓練"}}]
},
"taskCount": 2,
"parallelism": 2,
"dependencies": [1] // ← タスクグループ1に依存
}
]
}
実務でのメリット
1. コスト削減
- 並列実行可能なタスクを同時実行 → 全体の処理時間を短縮
- 例: 10個のタスクを順次実行(100分)→ 並列実行(20分)
2. 信頼性向上
- 失敗したタスクだけ再実行
- 例: 10ステップ中8ステップ目で失敗 → 8ステップ目から再開
3. 可視化とデバッグ
✓ データ取得A(完了)
✓ データ取得B(完了)
✗ データ取得C(失敗) ← ここで止まる
⏸ データ統合(待機中) ← 依存関係により未実行
⏸ 前処理(待機中)
4. リソース効率
- 必要なタスクだけ実行
- 不要な計算リソースの無駄遣いを防止
Cloud Run Jobsとの違い
項目 | Cloud Run Jobs | Cloud Batch (DAG) |
---|---|---|
ワークフロー | 1ジョブ = 1処理 | 複数タスクの依存関係管理 |
並列制御 | 同一ジョブの並列実行のみ | 異なるタスクの並列制御 |
失敗時 | ジョブ全体を再実行 | 失敗タスクから再実行 |
適用例 | シンプルなバッチ | 複雑なパイプライン |
まとめ
DAGは「料理のレシピ」のようなもの
野菜を切る → 肉を切る → 同時に炒める → 調味料を加える → 盛り付け
↓ ↓ ↓
(並列可能) (並列可能) (前の工程が必要)
- 同時にできる作業は並列実行
- 順番が必要な作業は待機
- 失敗したら、そこから作り直せる
DAGがないと: すべて順番にやるしかなく、非効率で融通が利かない
このような複雑なワークフローが必要ならCloud Batch、シンプルな処理ならCloud Run Jobsという選択になります。