业界 | 微信团队开源围棋AI技术PhoenixGo,复现AlphaGo Zero论文

机器之心编译

参与:李亚洲、路

本文介绍了腾讯微信翻译团队开源的人工智能围棋项目 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 中:

在 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 支持更多命令行选项。

原文发布于微信公众号 - 机器之心(almosthuman2014)

原文发表时间:2018-05-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

安卓新型恶意木马Xavier的发展过程和技术分析

近日,一个名为Xavier的安卓系统广告库木马被发现,它会在用户不知情的情况下窃取和泄露用户的信息,同时还可以在root过的安卓设备上静默安装任何APK。 据统...

35670
来自专栏芋道源码1024

视频 | 如何构建链路追踪 SkyWalking 5.x 的源码并运行

来源:https://github.com/JaredTan95/skywalking-tutorials

33410
来自专栏后端云

compute node ha 主流开源实现

nova evacuate和热迁移很像。都是想实例从一个节点转移到另外一个节点。区别主要是热迁移在正常状态下进行的,疏散时在异常状态下进行的。用一个形象的比如就...

22530
来自专栏Python中文社区

Github|Python开源项目漫游指南(一)

Scikit-learn Scikit-learn是基于Scipy为机器学习建造的的一个Python模块,他的特色就是多样化的分类,回归和聚类的算法包括支持向量...

24670
来自专栏小白课代表

Autodesk Revit 2014安装教程

Revit是Autodesk公司一套系列软件的名称。Revit系列软件是专为建筑信息模型(BIM)构建的,可帮助建筑设计师设计、建造和维护质量更好、能效更高的建...

51720
来自专栏企鹅号快讯

理解正向代理与反向代理的区别

我们介绍了Nginx主要用来做反向代理,可能有些朋友并不很清楚什么是反向代理,本篇文章会介绍下反向代理和正向代理的不同之处: (一)正向代理 正向代理是一个位于...

40050
来自专栏小白课代表

Autodesk Revit 2016安装教程

Revit是Autodesk公司一套系列软件的名称。Revit系列软件是专为建筑信息模型(BIM)构建的,可帮助建筑设计师设计、建造和维护质量更好、能效更高的建...

53340
来自专栏崔庆才的专栏

爬虫代理哪家强?十大付费代理详细对比评测出炉!

前言 随着大数据时代的到来,爬虫已经成了获取数据的必不可少的方式,做过爬虫的想必都深有体会,爬取的时候莫名其妙 IP 就被网站封掉了,毕竟各大网站也不想自己的...

919120
来自专栏安恒信息

LOCKY勒索者新花样:通过PDF投递

摘 要 最近安恒APT团队截获一个新版的LOCKY勒索者病毒样本,区别之前大多数样本采用WORD文档投递并用宏代码远程下载执行的方式,该样本在原有的WORD文档...

30360
来自专栏java一日一条

多种负载均衡算法及其 Java 代码实现

负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展 网络设备和 服务器的带宽、增加 吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

25610

扫码关注云+社区

领取腾讯云代金券