Leela Zero
是什么?
一个没有人类知识的围棋程序。使用 MCTS(但没有蒙特卡罗播报)和深度残差卷积神经网络堆栈。
这是对 Alpha Go Zero 论文“不用人类知识就能精通围棋”中所述系统的忠实重新实现。无论出于何种目的,它都是一个开源的 AlphaGo Zero。
等等,什么!
如果你想知道问题所在:你仍然需要网络权重。这个存储库中没有网络权值。如果你设法获得 AlphaGo Zero 权重,这个程序也会同样强大,只要你也获得一些张量处理单元。如果没有这些 TPUs,我建议使用顶级 GPU -- 虽然它与顶级 GPU 不尽相同,但其结果仍然是一个比顶级人类强大得多的引擎。
给我权重
在普通硬件上,重新计算 AlphaGo Zero 权重大约需要1700年。
发布这个程序的一个原因是,我们正在运行一个公共的、分布式的工作来重复这项工作。共同努力,尤其是在小范围内开始时,需要不到1700年的时间才能形成一个良好的网络(您可以将其引入该程序,突然变得强大)。
我想帮忙
使用自己的硬件
您需要一台带有 GPU 的 PC,即由 NVIDIA 或 AMD 制造的独立显卡,最好不要太旧,并安装最新的驱动程序。
可以在没有 GPU 的情况下运行该程序,但性能会低得多。如果您的 CPU 不是很新(Haswell 或更新的版本,Ryzen 或更新的版本),那么性能将非常糟糕,尝试加入分布式工作可能毫无用处。但是您仍然可以玩,特别是如果您有耐心的话。
Windows
前往位于 https://github.com/leela-zero/leela-zero/releases 的 Github 发布页面,下载最新版本,解压缩并启动 autogtp.exe。它将自动连接到服务器并在后台执行其工作,并在每次游戏后上载结果。您只需关闭 autogtp 窗口即可将其停止。
macOS 和 Linux
请按照以下说明在 build 子目录中编译 leelaz 和 autogtp 二进制文件。然后按照以下说明中的说明运行 autogtp。当您运行 autogtp 时,将启动贡献。
使用云提供商
许多云公司提供免费试用版(或付费解决方案,此处未讨论),可用于帮助实现 leela-zero 项目。
这里有社区维护的说明:
- 在 Tesla V100 GPU 上免费运行 Leela Zero 客户端(Google 云免费试用)
- 在 Tesla V100 GPU 上免费运行 Leela Zero 客户端(Microsoft Azure 云免费试用)
我现在只想和 Leela Zero 一起玩
从这里下载最著名的网络权重文件,或者,如果您更喜欢人类风格,请从此处从人类游戏中训练(较弱)的网络。
如果您使用的是 Windows,请从此处下载正式版本,然后转到本自述文件的“用法”部分。
如果您使用的是 macOS,则可以通过事实上的标准软件包管理器 Homebrew 获得 Leela Zero。您可以使用以下方法安装它:
brew install leela-zero
如果您使用的是 Unix,则必须自己编译程序。请遵循下面的编译说明,然后阅读“用法”部分。
编译 AutoGTP 和/或 Leela Zero
要求
- GCC,Clang 或 MSVC,任何 C++ 14 编译器
- Boost 1.58.x 或更高版本,headers 和 program_options,文件系统和系统库(Debian/Ubuntu 上的 libboost-dev,libboost-program-options-dev 和 libboost-filesystem-dev)
- zlib 库(Debian/Ubuntu 上的 zlib1g 和 zlib1g-dev)
- 标准 OpenCL C headers(Debian/Ubuntu 上的 opencl-header 或 https://github.com/KhronosGroup/OpenCL-Headers/tree/master/CL)
- OpenCL ICD 加载器(Debian/Ubuntu 上的 ocl-icd-libopencl1 或在 https://github.com/KhronosGroup/OpenCL-ICD-Loader 上的参考实现)
- 强烈建议使用支持 OpenCL 的设备,最好是非常快的 GPU,并带有最新的驱动程序(对 OpenCL 1.1 的支持就足够了)。如果这部分是由 Linux 发行版单独打包的(例如 nvidia-opencl-icd),请不要忘记安装 OpenCL 驱动程序。如果没有 GPU,请添加定义“USE_CPU_ONLY”,例如,通过在 cmake 命令行中添加 -DUSE_CPU_ONLY=1。
- 可选:BLAS库:OpenBLAS(libopenblas-dev)或英特尔 MKL
- 该程序已在 Windows、Linux 和 macOS 上经过测试。
编译示例 -- Ubuntu 和 类似的
# Test for OpenCL support & compatibility sudo apt install clinfo && clinfo # Clone github repo git clone https://github.com/leela-zero/leela-zero cd leela-zero git submodule update --init --recursive # Install build depedencies sudo apt install cmake g++ libboost-dev libboost-program-options-dev libboost-filesystem-dev opencl-headers ocl-icd-libopencl1 ocl-icd-opencl-dev zlib1g-dev # Use a stand alone build directory to keep source dir clean mkdir build && cd build # Compile leelaz and autogtp in build subdirectory with cmake cmake .. cmake --build . # Optional: test if your build works correctly ./tests
编译示例 -- macOS
# Clone github repo git clone https://github.com/leela-zero/leela-zero cd leela-zero git submodule update --init --recursive # Install build depedencies brew install boost cmake zlib # Use a stand alone build directory to keep source dir clean mkdir build && cd build # Compile leelaz and autogtp in build subdirectory with cmake cmake .. cmake --build . # Optional: test if your build works correctly ./tests
编译示例 -- Windows
# Clone github repo git clone https://github.com/leela-zero/leela-zero cd leela-zero git submodule update --init --recursive cd msvc Double-click the leela-zero2015.sln or leela-zero2017.sln corresponding to the Visual Studio version you have. # Build from Visual Studio 2015 or 2017
贡献
对于 Windows,可以使用发行包,请参阅“我想帮助”。
Unix和macOS,在完成编译后并在build目录中:
# Copy leelaz binary to autogtp subdirectory cp leelaz autogtp # Run AutoGTP to start contributing ./autogtp/autogtp
玩游戏或分析游戏的用法
Leela Zero 不能直接使用。您需要一个图形界面,它将通过 GTP 协议与 Leela Zero 交互。
该引擎支持 GTP 协议版本2。
Lizzie 是专门为 Leela Zero 提供的一个客户端,它可以显示实时的搜索概率,一个胜率图,并且有一个自动的游戏分析模式。有适用于 Windows、Mac 和 Linux 的二进制文件。
Sabaki 是具有 GTP 2 功能的非常漂亮的 GUI。
LeelaSabaki 进行了修改,以显示游戏树中的变化和获胜统计数据,以及游戏棋盘上的热图。
GoReviewPartner 是使用机器人(保存为 .rsgf 文件)自动审查和分析游戏的工具,支持 Leela Zero。
很多 go 软件都可以通过 GTP 与引擎连接,所以你也可以看看。
在引擎命令行上添加 --gtp 命令行选项,以启用 Leela Zero 的 GTP 支持。您将需要一个权重文件,并使用 -w 选项指定该文件。
支持所有必需的命令,以及比赛子集和“loadsgf”。全套可以通过“list_commands”看到。可以通过 time_settings 命令在 GTP 上指定时间控制。还支持 kgs-time_settings 扩展名。这些必须由 GTP 2 接口提供,而不是通过命令行提供!
权重格式
权重文件是一个文本文件,每行包含一行系数。网络的布局与 AlphaGo Zero 论文中的相同,但是允许任何数量的剩余块,并且每层可以有任意数量的输出(滤波器),只要后者对于所有层都是相同的即可。该程序将在启动时自动检测金额。第一行包含版本号。
卷积层有2个权重行:
卷积权重
渠道偏差
Batchnorm图层具有2个权重行:
批处理标准
批处理方差
内部产品(完全连接)层具有2个重量行:
层权重
输出偏差
卷积权重按 [output, input, filter_size, filter_size] 顺序,完全连接的层权重按 [output, input] 顺序。首先是残差塔,其次是策略头,然后是值头。除策略开始处和值头处的滤波器为1x1外,所有卷积滤波器为 3x3(如本文所示)
第一层有18个输入,而不是本文中的17个。原始的 AlphaGo Zero 零点设计有一点不平衡,因为黑棋玩家更容易看到棋盘边缘(由于填充在神经网络中的工作原理)。此问题已在 Leela Zero 中修复。输入是:
1) Side to move stones at time T=0 2) Side to move stones at time T=-1 (0 if T=0) ... 8) Side to move stones at time T=-7 (0 if T<=6) 9) Other side stones at time T=0 10) Other side stones at time T=-1 (0 if T=0) ... 16) Other side stones at time T=-7 (0 if T<=6) 17) All 1 if black is to move, 0 otherwise 18) All 1 if white is to move, 0 otherwise
每个都形成一个 19x19 位平面。
在 training/caffe 目录中,有一个 zero.prototxt 文件,其中包含(NVIDIA)-Caffe protobuff 格式的全部40个残留块设计的描述。它可以用来设置 nv-caffe 来训练合适的网络。 zero_mini.prototxt 文件描述了较小的12个剩余块的情况。 training/tf 目录在 tfprocess.py 文件中包含 TensorFlow 格式的网络构建。
专家说明:通道偏差在网络拓扑中似乎是多余的,因为它们后面紧跟着一个 batchnorm 层,该层应规范化均值。实际上,它们对批处理规范层中的中心/比例操作的“beta”参数进行了编码,并针对批处理规范均值/方差调整的效果进行了校正。在推断时,Leela Zero 会将通道偏差融合到 Batchnorm 平均值中,从而抵消它并执行中心操作。这种回旋结构仅是为了向后兼容而存在。如果该段对您没有任何意义,请忽略其存在,仅像通常那样添加通道偏置层,输出将是正确的。
训练
获取数据
在游戏结束时,您可以向 Leela Zero 发送“dump_training”命令,然后发送游戏获胜者(“白色”或“黑色”)和文件名,例如:
dump_training white train.txt
这将以下面描述的格式将训练数据保存(追加)到磁盘,并使用 gzip 压缩。
训练数据在新游戏上重置。
监督学习
Leela 可以将连接的 SGF 游戏的数据库转换为适合学习的数据文件:
dump_supervised sgffile.sgf train.txt
这将导致生成一系列 gzip 压缩文件,以名称 train.txt 开头,并包含从指定 SGF 生成的训练数据,适用于深度学习框架。
训练数据格式
训练数据由带有以下数据的文件组成,所有文件均为文本格式:
16行十六进制字符串,每条361位长,对应于上一节中的前16个输入平面
1行带有1个数字,指示要移动的人,0 =黑色,1 =白色,可以从中重建最后2个输入平面
1行包含362(19x19 +1)个浮点数,表示搜索到的移动结束时的搜索概率(访问计数)。最后一个数字是通过的概率。
1行或1或-1,对应于游戏结果,玩家可以移动
进行训练
为了训练新的网络,您可以使用现有的框架(Caffe,TensorFlow,PyTorch,Theano)以及如上所述的一组训练数据。您仍然需要构造模型描述(为 Caffe 提供了2个示例),解析输入文件格式,并以正确的格式输出权重。
在 training/tf 目录中有 TensorFlow 的完整实现。
使用 TensorFlow 进行监督学习
这需要 TensorFlow 1.4 或更高版本的有效安装:
src/leelaz -w weights.txt dump_supervised bigsgf.sgf train.out exit training/tf/parse.py 6 128 train.out
这将运行并定期将 Leela Zero 权重文件(具有6个块和128个过滤器的网络的文件)以及学习状态的快照转储到磁盘上,该快照由批号编号。如果中断,可以使用以下方法恢复培训:
training/tf/parse.py 6 128 train.out leelaz-model-batchnumber
待完成事项
- 进一步优化 Winograd 转换。
- 在搜索中改善 GPU 批处理。
- 差点玩法的根过滤。
- 更多后端:
- 基于 MKL-DNN 的后端。
- 使用 cuDNN 或 cuBLAS 的 CUDA 特定版本。
- 使用 MIOpen/ROCm 的 AMD 特定版本。
相关链接
- 分布式工作量的状态页: https://zero.sjeng.org
- Leela Zero 的 GUI 和学习工具: https://github.com/featurecat/lizzie
- 在 GUI 中观看Leela Zero的训练比赛:https://github.com/barrybecker4/LeelaWatcher
- 原始 Alpha Go (Lee Sedol) 论文: https://storage.googleapis.com/deepmind-media/alphago/AlphaGoNaturePaper.pdf
- Alpha Go Zero 论文: https://deepmind.com/documents/119/agz_unformatted_nature.pdf
- Alpha Zero (Go, Chess, Shogi) 论文: https://arxiv.org/pdf/1712.01815.pdf
- AlphaGo Zero 在一张图表中给出了解释: https://medium.com/applied-data-science/alphago-zero-explained-in-one-diagram-365f5abf67e0
- Stockfish 国际象棋引擎移植到 Leela Zero 框架: https://github.com/LeelaChessZero/lczero
- Leela Chess Zero (国际象棋优化客户端) https://github.com/LeelaChessZero/lc0
许可
该代码在 GPLv3 或更高版本下发布,但 ThreadPool.h,cl2.hpp,half.hpp 以及 eigen 和 clblast_level3 子目录除外,它们具有在这些文件中提到的特定许可证(与 GPLv3 兼容)。
根据 GNU GPL版本3第7节的附加许可
如果您通过与 NVIDIA CUDA 工具包和/或 NVIDIA CUDA 深度神经网络库和/或 NVIDIA TensorRT 推理库(或这些工具的修改版)中的 NVIDIA Corporation 库链接或组合来修改本程序或任何涵盖的工作,库),其中包含各自许可协议的条款所涵盖的部分,则本程序的许可人授予您额外的许可,以传达所产生的作品。
(The first version translated by vz on 2020.07.19)