PhoenixGo is an Go AI program which implement the AlphaGo Zero paper "Mastering the game of Go without human knowledge". It is also known as "BensonDarr" in FoxGo, "cronus" in CGOS, and the champion of "World AI Go Tournament 2018" held in Fuzhou China.
If you use PhoenixGo in your project, please consider mentioning in your README.
If you use PhoenixGo in your research, please consider citing the library as follows:
@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}}
}
- GCC with C++11 support
- Bazel (0.11.1 is known-good)
- (Optional) CUDA and cuDNN (for GPU support)
- (Optional) TensorRT (for accelerating computation on GPU, 3.0.4 is known-good)
Clone the repository and configure the building:
$ git clone https://github.com/Tencent/PhoenixGo.git
$ cd PhoenixGo
$ ./configure
./configure
will ask where CUDA and TensorRT have been installed, specify them if need.
Then build with bazel:
$ bazel build //mcts:mcts_main
Dependices such as Tensorflow will be downloaded automatically. The building prosess may take a long time.
Download and extract the trained network:
$ 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
Run in gtp mode with a config file (depend on the number of GPUs and using TensorRT or not):
$ bazel-bin/mcts/mcts_main --config_path=etc/{config} --gtp --logtostderr --v=1
The engine supports the GTP protocol, means it could be used with a GUI with GTP capability, such as Sabaki.
--logtostderr
let mcts_main
log messages to stderr, if you want to log to files,
change --logtostderr
to --log_dir={log_dir}
You could modify your config file following #configure-guide.
PhoenixGo support running with distributed workers, if there are GPUs on different machine.
Build the distribute worker:
$ bazel build //dist:dist_zero_model_server
Run dist_zero_model_server
on distributed worker, one for each GPU.
$ CUDA_VISIBLE_DEVICES={gpu} bazel-bin/dist/dist_zero_model_server --server_address="0.0.0.0:{port}" --logtostderr
Fill ip:port
of workers in the config file (etc/mcts_dist.conf
is an example config for 32 workers),
and run the distributed master:
$ bazel-bin/mcts/mcts_main --config_path=etc/{config} --gtp --logtostderr --v=1
Note: Tensorflow stop providing GPU support on macOS since 1.2.0, so you are only able to run on CPU in macOS.
Same as Linux.
Add libtensorflow_framework.so
to LD_LIBRARY_PATH
first:
$ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:{project_root}/bazel-bin/external/org_tensorflow/tensorflow"
Rest steps should be same as Linux.
Work in progress.
Here are some important options in the config file:
num_eval_threads
: should equal to the number of GPUsnum_search_threads
: should a bit larger thannum_eval_threads * eval_batch_size
timeout_ms_per_step
: how many time will used for each movemax_simulations_per_step
: how many simulations will do for each movegpu_list
: use which GPUs, sperated by commamodel_config -> train_dir
: directory where trained network storedmodel_config -> checkpoint_path
: use which checkpoint, get fromtrain_dir/checkpoint
if not setmodel_config -> enable_tensorrt
: use TensorRT or notmodel_config -> tensorrt_model_path
: use which TensorRT model, ifenable_tensorrt
max_search_tree_size
: the maximum number of tree nodes, change it depends on memory sizemax_children_per_node
: the maximum children of each node, change it depends on memory sizeenable_background_search
: pondering in opponent's timeearly_stop
: genmove may return beforetimeout_ms_per_step
, if the result would not change any moreunstable_overtime
: thinktimeout_ms_per_step * time_factor
more if the result still unstablebehind_overtime
: thinktimeout_ms_per_step * time_factor
more if winrate less thanact_threshold
Options for distribute mode:
enable_dist
: enable distribute modedist_svr_addrs
:ip:port
of distributed workers, multiple lines, oneip:port
in each linedist_config -> timeout_ms
: RPC timeout
Options for async distribute mode:
Async mode is used when there are huge number of distributed workers (more than 200), which need too many eval threads and search threads in sync mode.
etc/mcts_async_dist.conf
is an example config for 256 workers.
enable_async
: enable async modeenable_dist
: enable distribute modedist_svr_addrs
: multiple lines, comma sperated lists ofip:port
for each linenum_eval_threads
: should equal to number ofdist_svr_addrs
lineseval_task_queue_size
: tunning depend on number of distribute workersnum_search_threads
: tunning depend on number of distribute workers
Read mcts/mcts_config.proto
for more config options.
mcts_main
accept options from command line:
--config_path
: path of config file--gtp
: run as a GTP engine, if disable, gen next move only--init_moves
: initial moves on the go board--gpu_list
: overridegpu_list
in config file--listen_port
: work with--gtp
, run gtp engine on port in TCP protocol--allow_ip
: work with--listen_port
, list of client ip allowed to connect--fork_per_request
: work with--listen_port
, fork for each request or not
Glog options are also supported:
--logtostderr
: log message to stderr--log_dir
: log to files in this directory--minloglevel
: log level, 0 - INFO, 1 - WARNING, 2 - ERROR--v
: verbose log,--v=1
for turning on some debug log,--v=0
to turning off
mcts_main --help
for more command line options.
Print in the log, something like:
I0514 12:51:32.724236 14467 mcts_engine.cc:157] 1th move(b): dp, winrate=44.110905%, N=654, Q=-0.117782, p=0.079232, v=-0.116534, cost 39042.679688ms, sims=7132, height=11, avg_height=5.782244, global_step=639200
Passing --v=0
to mcts_main
will turn off many debug log.
Moreover, --minloglevel=1
and --minloglevel=2
could disable INFO log and WARNING log.
Or, if you just don't want to log to stderr, replace --logtostderr
to --log_dir={log_dir}
,
then you could read your log from {log_dir}/mcts_main.INFO
.
Modify your config file. early_stop
, unstable_overtime
, behind_overtime
and
time_control
are options that affect the search time, remove them if exist then
each move will cost constant time/simulations.
Add these lines in your config:
time_control {
enable: 1
c_denom: 20
c_maxply: 40
reserved_time: 1.0
}
c_denom
and c_maxply
are parameters for deciding how to use the "main time".
reserved_time
is how many seconds should reserved (for network latency) in "byo-yomi time".