微信團隊開源圍棋AI技術PhoenixGo,復現AlphaGo Zero論文

dd發表於2018-05-14

本文介紹了騰訊微信翻譯團隊開源的人工智慧圍棋專案 PhoenixGo,該專案是對 DeepMind AlphaGo Zero 論文《Mastering the game of Go without human knowledge》的實現。

PhoenixGo 是騰訊微信翻譯團隊開發的人工智慧圍棋程式。據介紹,該專案由幾名工程師在開發機器翻譯引擎之餘,基於 AlphaGo Zero 論文實現,做了若干提高訓練效率的創新,並利用微信伺服器的閒時計算資源進行自我對弈,緩解了 Zero 版本對海量資源的苛刻需求。

4 月底,在 2018 世界人工智慧圍棋大賽上,PhoenixGo 取得冠軍。參賽隊伍包括絕藝,LeelaZero、TSGo、石子旋風、Golois,HEROZ Kishi、Baduki 等來自中、日、韓、歐美等國家和地區的人工智慧圍棋高手。

5 月 11 日,PhoenixGo 在 Github 上正式開源,以下是技術細節:

專案地址:https://github.com/Tencent/PhoenixGo

如果你在研究中使用 PhoenixGo,請按以下方式引用庫:

@misc{PhoenixGo2018,
 author = {Qinsong Zeng and Jianchang Zhang and Zhanpeng Zeng and Yongsheng Li and Ming Chen and Sifan Liu}
 title = {PhoenixGo},
 year = {2018},
 journal = {GitHub repository},
 howpublished = {\url{https://github.com/Tencent/PhoenixGo}}
}

構建和執行

在 Linux 上

1 要求

  • 支援 C++11 的 GCC;

  • Bazel(0.11.1);

  • (可選)CUDA 和 cuDNN(支援 GPU);

  • (可選)TensorRT(加速 GPU 上的計算,建議使用 3.0.4 版本)。

2 構建

複製庫,並進行構建配置:

git clone https://github.com/Tencent/PhoenixGo.git
cd PhoenixGo
./configure

./configure 將詢問 CUDA 和 TensorRT 的安裝位置,如果必要指定二者的位置。

然後使用 bazel 進行構建:

bazel build //mcts:mcts_main

TensorFlow 等依賴項將會自動下載。構建過程可能需要很長時間。

3 執行

下載和提取訓練好的網路:

wget https://github.com/Tencent/PhoenixGo/releases/download/trained-network-20b-v1/trained-network-20b-v1.tar.gz
tar xvzf trained-network-20b-v1.tar.gz

以 gtp 模式執行,使用配置檔案(取決於 GPU 的數量和是否使用 TensorRT):

bazel-bin/mcts/mcts_main --config_path=etc/{config} --gtp --logtostderr --v=1

該引擎支援 GTP 協議,這意味著它可以和具備 GTP 能力的 GUI 一起使用,如 Sabaki。

--logtostderr 使 mcts_main 向 stderr 寫入日誌訊息,如果你想將訊息寫入檔案,將 --logtostderr 改成 --log_dir={log_dir} 即可。

你可以按照此說明更改配置檔案:https://github.com/Tencent/PhoenixGo#configure-guide

4 分佈模式

如果不同的機器上有 GPU,PhoenixGo 支援分散式 worker。

構建分散式 worker:

bazel build //dist:dist_zero_model_server

在分散式 worker 上執行 dist_zero_model_server,每個 worker 對應一個 GPU:

CUDA_VISIBLE_DEVICES={gpu} bazel-bin/dist/dist_zero_model_server --server_address="0.0.0.0:{port}" --logtostderr

在 config 檔案中填充 worker 的 ip:port(etc/mcts_dist.conf 是 32 個 worker 的配置示例),並執行分散式 master:

bazel-bin/mcts/mcts_main --config_path=etc/{config} --gtp --logtostderr --v=1

在 macOS 上

注意:TensorFlow 在 1.2.0 版本之後停止支援 macOS 上的 GPU,因此在 macOS 上的操作只能在 CPU 上執行。

1 要求 & 構建

同 Linux。

2 執行

首先新增 libtensorflow_framework.so 到 LD_LIBRARY_PATH 中:

$ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:{project_root}/bazel-bin/external/org_tensorflow/tensorflow"

在 Windows 上

正在進行。

配置指南

以下是 config 檔案中的一些重要選項:

  • num_eval_threads:應與 GPU 的數量一致;

  • num_search_threads:應比 num_eval_threads * eval_batch_size 大一些;

  • timeout_ms_per_step:每步使用的時間;

  • max_simulations_per_step:每步要做多少模擬;

  • gpu_list:使用哪塊 GPU,用逗號隔開;

  • model_config -> train_dir:訓練好的網路的儲存目錄;

  • model_config -> checkpoint_path:使用哪個檢查點,如果沒設定,則從 train_dir/checkpoint 中獲取;

  • model_config -> enable_tensorrt:是否使用 TensorRT;

  • model_config -> tensorrt_model_path:如果 enable_tensorrt,使用哪個 TensorRT 模型;

  • max_search_tree_size:樹節點的最大數量,根據儲存容量進行更改;

  • max_children_per_node:每個節點的子節點的最大數量,根據儲存容量進行更改;

  • enable_background_search:在對手下棋的時候思考;

  • early_stop:如果結果不再更改,則 genmove 可能在 timeout_ms_per_step 之前返回;

  • unstable_overtime:如果結果仍然不穩定,則更多地考慮 timeout_ms_per_step * time_factor;

  • behind_overtime:如果贏率低於 act_threshold,則更多地考慮 timeout_ms_per_step * time_factor。

分佈模式的選項:

  • enable_dist:啟動分佈模式;

  • dist_svr_addrs:分散式 worker 的 ip:port,多條線,每條線中有一個 ip:port;

  • dist_config -> timeout_ms:RPC 超時。

async 分佈模式的選項:

Async 模式是在有大量分散式 worker 的時候使用的(多餘 200),而在 sync 模式中需要過多的 eval 執行緒和搜尋執行緒。

etc/mcts_async_dist.conf 是 256 個 worker 模式的 config 示例。

  • enable_async:開啟 async 模式

  • enable_dist:開啟分佈模式

  • dist_svr_addrs:每個命令列 ip:port 的多行、用逗號分開的列表

  • eval_task_queue_size:根據分佈 worker 的數量調整

  • num_search_threads:根據分散式 worker 的數量調整

參看 mcts/mcts_config.proto 更詳細的瞭解 config 選項。

命令列選項

mcts_main 接受以下命令列選項:

  • --config_path:配置檔案路徑;

  • --gtp:作為 GTP 引擎來執行,如果停用,則只能進行 genmove;

  • --init_moves:圍棋棋盤上最初的落子;

  • --gpu_list:覆寫配置檔案中的 gpu_list;

  • --listen_port:與 --gtp 一起使用,在 TCP 協議埠上執行 gtp 引擎;

  • --allow_ip:與 --listen_port 一起使用,是允許連線的客戶端 ip 列表;

  • --fork_per_request:與 --listen_port 一起使用,表示是否 fork 每個請求。

Glog 選項還支援:

  • --logtostderr:向 stderr 寫入日誌訊息;

  • --log_dir:向該資料夾中的檔案寫入日誌訊息;

  • --minloglevel:記錄級別:0 - INFO、1 - WARNING、2 - ERROR;

  • --v:詳細記錄,--v=1 即記錄除錯日誌,--v=0 即關閉記錄。

mcts_main --help 支援更多命令列選項。微信團隊開源圍棋AI技術PhoenixGo,復現AlphaGo Zero論文

相關文章