メインコンテンツまでスキップ

分散システムと TPU

AlphaGo の成功は、アルゴリズムの勝利だけでなく、エンジニアリングの勝利でもあります。合理的な時間内に人類を超える囲碁 AI を学習させるには、精巧に設計された分散システムと専用ハードウェアのサポートが必要です。

本記事では、AlphaGo を支えるシステムアーキテクチャを詳しく解説します。学習フロー、推論アーキテクチャ、並列 MCTS、そして TPU の重要な役割について説明します。


学習アーキテクチャの概要

オリジナル AlphaGo の学習アーキテクチャ

オリジナル AlphaGo(李世乭を破ったバージョン)の学習は複数の段階に分かれ、各段階で異なるリソース構成を使用しました:

AlphaGo Zero の学習アーキテクチャ

AlphaGo Zero は学習フローを大幅に簡略化し、単一のエンドツーエンド学習ループを使用しました:

このアーキテクチャの利点:

  1. 継続的学習:Self-play と Training が同時に進行し、待機が不要
  2. リソース効率:すべてのリソースが有用な作業を行う
  3. 高速イテレーション:ネットワーク更新後、すぐに新しいデータの生成に使用

自己対局ワーカー(Self-play Workers)

タスク割り当て

Self-play Workers は、現在最強のネットワークを使用して自己対局を行い、学習データを生成します。

構成AlphaGo Zero
Worker 数数十個
各 Worker1-4 TPU
各局の MCTS1600 回シミュレーション
1日の生成数~100,000 局

ワークフロー

各 Self-play Worker のワークフロー:

while True:
# 1. 最新のネットワーク重みをダウンロード
network = download_latest_checkpoint()

# 2. 複数局の自己対局を実行
for game in range(batch_size):
positions = []
board = EmptyBoard()

while not board.is_terminal():
# MCTS を実行
mcts = MCTS(network, board)
policy = mcts.search(num_simulations=1600)

# 着手を選択
action = sample(policy)

# 記録
positions.append((board.state, policy))

# 着手
board = board.play(action)

# 3. 勝敗結果を取得
result = board.get_result()

# 4. データをアップロード
upload_to_replay_buffer(positions, result)

負荷分散

複数の Worker には負荷分散が必要です:

  • ネットワーク同期:すべての Worker が同じバージョンのネットワークを使用
  • データバランス:異なる Worker のデータがすべて使用されることを保証
  • フォールトトレランス:単一の Worker の障害が全体の学習に影響しない

学習ワーカー(Training Workers)

タスク割り当て

Training Workers は Replay Buffer からデータをサンプリングし、ニューラルネットワークを学習します。

構成AlphaGo Zero
Worker 数1-4
各 Worker4 TPU
Batch Size2048(各 TPU 512)
学習ステップ毎日数万ステップ

分散学習

大規模学習では**データ並列(Data Parallelism)**を使用します:

各 TPU は異なる mini-batch を処理し、ローカル勾配を計算し、その後グローバルパラメータを集約更新します。

同期 vs. 非同期更新

更新方式利点欠点
同期安定、再現可能Worker が最も遅いものを待つ必要がある
非同期スループットが高い勾配が古くなる可能性

AlphaGo Zero は同期更新を使用し、学習の安定性を確保しました。


TPU の役割

TPU とは?

TPU(Tensor Processing Unit) は Google が深層学習専用に設計したアクセラレータです:

特性TPUGPUCPU
設計目標行列演算汎用並列汎用計算
精度FP16/BF16 最適化FP32/FP16FP64/FP32
消費電力比較的低い高い最も高い
レイテンシ低い中程度高い

TPU のアーキテクチャ

TPU の核心は MXU(Matrix Multiply Unit) です:

MXU は各サイクルで 16K 回の乗加算演算を実行でき、ニューラルネットワークの行列乗算にとって極めて重要です。

なぜ AlphaGo は TPU を必要とするのか?

囲碁 AI の計算ボトルネックはニューラルネットワーク推論です:

操作割合
ニューラルネットワーク順伝播~95%
MCTS ツリー操作~4%
その他~1%

各手の MCTS には 1600 回のニューラルネットワーク推論が必要です。TPU の高スループットがこれを可能にしました。

TPU 使用の進化

バージョン学習 TPU推論 TPU
AlphaGo Lee50 GPU48 TPU(v1)
AlphaGo Master4 TPU(v2)4 TPU(v2)
AlphaGo Zero4 TPU(v2)4 TPU(v2)(スケーラブル)

AlphaGo Zero は使用する TPU 数が大幅に減少しました。これはより効率的なアーキテクチャと新しい TPU バージョンのおかげです。


並列 MCTS と仮想損失

並列化の課題

MCTS の標準実装はシリアルです:

for i in range(num_simulations):
1. Selection:ルートから下に選択
2. Expansion:リーフノードを展開
3. Evaluation:ニューラルネットワーク評価
4. Backup:逆伝播で更新

しかしニューラルネットワーク評価は GPU/TPU フレンドリーなバッチ処理です。複数のシミュレーションを同時に行うにはどうすればよいでしょうか?

リーフ並列化(Leaf Parallelization)

最も単純な並列化方式:複数の完全なシミュレーションを同時に実行し、最後に結果をマージします。

問題:各シミュレーションがルートから始まるため、同じパスを繰り返し探索してしまいます。

仮想損失(Virtual Loss)

DeepMind はツリー並列化(Tree Parallelization)を実現するために仮想損失技術を採用しました。

基本概念

あるスレッドがあるノードを探索中の時、そのノードの価値を一時的に下げ、他のスレッドが別のパスを選択するようにします。

通常の UCB:Q(s,a) + c * P(s,a) * sqrt(N(s)) / (1 + N(s,a))

仮想損失を加えた後:
(Q(s,a) * N(s,a) - v * n_virtual) / (N(s,a) + n_virtual) + c * P(s,a) * sqrt(N(s)) / (1 + N(s,a) + n_virtual)

ここで:

  • n_virtual はそのノードを探索中のスレッド数
  • v は仮想損失の値(通常 1 または勝率に対応する値)

動作フロー

時間 T1:
Thread 1 がパス A → B → C を選択
ノード C に仮想損失 -1 を付与

時間 T2:
Thread 2 がパス A → B → D を選択(C が「ペナルティ」を受けているため)
ノード D に仮想損失 -1 を付与

時間 T3:
Thread 1 が評価を完了し、C の実際の値を更新し、仮想損失を除去
Thread 3 は今 C を選択する可能性がある(実際の値が十分良ければ)

仮想損失の効果

側面効果
探索の多様性異なるパスの探索を強制
バッチ効率複数のリーフノードを同時に評価可能
収束性仮想損失は最終的に真の値で上書きされ、収束に影響しない

バッチニューラルネットワーク評価

仮想損失により、評価待ちの複数のリーフノードを収集し、バッチ推論を行えます:

TPU のバッチ推論効率は個別推論よりはるかに高く、並列 MCTS を可能にしました。


推論アーキテクチャ

対局時の構成

AlphaGo の公式対局時の推論アーキテクチャ:

バージョンハードウェア構成
AlphaGo Fan176 GPU
AlphaGo Lee48 TPU + 複数サーバー
AlphaGo Master4 TPU
AlphaGo Zero4 TPU(スケーラブル)

分散推論フロー

対局時の推論フロー(AlphaGo Lee を例に):

思考時間管理

AlphaGo の時間管理戦略:

局面思考時間MCTS 回数
序盤(定石あり)短め~10,000
中盤(複雑)長め~100,000
単純な局面短め~5,000
秒読み固定~1,600

より多くの MCTS シミュレーションは通常、より良い着手の質を意味します。


通信と同期

データ形式

学習データの転送形式:

message TrainingExample {
// 盤面状態(17 × 19 × 19)
repeated float board_planes = 1;

// MCTS 探索結果(362)
repeated float mcts_policy = 2;

// 勝敗結果(1 = 現在側の勝ち、-1 = 現在側の負け)
float game_result = 3;
}

ネットワーク帯域幅要件

データフローサイズ頻度
学習サンプル~10 KB/サンプル毎秒数千サンプル
ネットワーク重み~200 MB毎時数回
制御メッセージ< 1 KB継続的

総帯域幅要件:~100 Mbps(内部ネットワークで十分)

障害処理

分散システムの障害処理:

障害タイプ処理方法
Worker ダウン再起動し、最新の checkpoint から継続
ネットワーク切断データをバッファリングし、再接続後に続けて転送
TPU 障害自動的にバックアップ TPU に切り替え
データ破損検証後に破棄し、再生成

コスト分析

ハードウェアコスト見積もり

Google Cloud の TPU 価格で AlphaGo Zero の学習コストを見積もり:

リソース数量単価/時間総額/日
TPU v2 Pod4~$32~$3,000
大容量メモリ VM数台~$5~$500
ストレージ10 TB~$0.02/GB~$200
ネットワーク-含む-

1日あたり約 3,700、完全な学習(40日)で約3,700**、完全な学習(40日)で約 **150,000

注意:これは 2017 年の見積もりで、DeepMind は Google の子会社として内部割引がある可能性があります。

人間の学習との比較

側面AlphaGo Zero人間のプロ棋士
プロレベル到達2日10-15年
学習コスト~$7,500数百万(学費、生活費、機会費用)
継続コスト電気代生活費
複製可能性完璧に複製可能複製不可能

もちろん、この比較は完全に公平ではありません——人間は碁を学ぶ過程で囲碁だけでなく多くのことを学びます。

推論コスト

公式対局の推論コスト:

構成1局あたりのコスト
48 TPU(AlphaGo Lee)~$500
4 TPU(AlphaGo Zero)~$50
単一 GPU(KataGo)~$1

推論コストは技術の進歩とともに大幅に低下しました。


技術の進化

AlphaGo から AlphaZero へ

側面AlphaGo LeeAlphaGo ZeroAlphaZero
学習 TPU50+ GPU → TPU4 TPU4 TPU
推論 TPU48 TPU4 TPU4 TPU
MCTS/手~100,000~1,600~800
学習時間数ヶ月40日数時間〜数日

効率は約 100 倍向上しました。

オープンソースコミュニティへの影響

AlphaGo のアーキテクチャは複数のオープンソースプロジェクトにインスピレーションを与えました:

プロジェクト特徴
Leela Zeroコミュニティ分散学習、AlphaGo Zero を再現
KataGo単一 GPU 高効率学習、AlphaGo Zero を超越
ELF OpenGoFacebook オープンソース、PyTorch 使用
MinigoGoogle オープンソース、TensorFlow 使用

これらのプロジェクトにより、一般の研究者も強力な囲碁 AI を学習できるようになりました。


アニメーション対応

本記事で扱った核心概念とアニメーション番号:

番号概念物理/数学対応
🎬 C9並列 MCTS多体問題
🎬 E9分散学習分散コンピューティング
🎬 C5仮想損失斥力ポテンシャル
🎬 D15バッチ推論ベクトル化計算

関連記事


参考文献

  1. Silver, D., et al. (2017). "Mastering the game of Go without human knowledge." Nature, 550, 354-359.
  2. Jouppi, N., et al. (2017). "In-Datacenter Performance Analysis of a Tensor Processing Unit." ISCA 2017.
  3. Dean, J., et al. (2012). "Large Scale Distributed Deep Networks." NeurIPS 2012.
  4. Chaslot, G., et al. (2008). "Parallel Monte-Carlo Tree Search." CIG 2008.
  5. Segal, R. (2010). "On the Scalability of Parallel UCT." CIG 2010.