基于 Sabaki 搭建围棋 AI

Sabaki + Leela-Zero + Leelasabaki

本文主要阐述在 Windows/Linux 环境下搭建围棋 AI 的过程。使用到的软件栈为:

Based on Windows (Play for fun)

下载如下软件的 Windows 版本和相关权值文件:

执行如下安装过程

  1. 安装 Sabaki 到路径 C:\MyPrograms\Sabaki【注意:安装路径避免空格】;
  2. 安装 LeelaSabaki 到路径 C:\MyPrograms\leesabaki;
  3. 安装 Leela-Zero CPU Only 到路径 C:\MyPrograms\leela-zero-0.15-cpuonly-win64;
  4. 解压权值文件到 C:\MyPrograms\leeazero。

启动 Sabaki,配置 Engines->Manage Engines,如下图所示

配置 Engine 参数为 --flat C:\MyPrograms\leela-zero-0.15-cpuonly-win64\leelaz.exe -t 6 -w C:\MyPrograms\leeazero\leelaz-model-swa-12-96000_quantized.txt --noponder,其中

  • -t:表示使用CPU的6线程;
  • -w:表示调用权重文件;
  • --noponder:表示对手时间内不思考;

然后,执行 Engines -> Attach 启动对弈程序,选择黑/白为 leelazero Engine,如下图所示

关于 leela-zero 的参数如下所示

Based on Linux (Research)

编译安装 Leela-Zero

1
2
3
git clone https://github.com/gcp/leela-zero
cd leela-zero
git submodule sync && git submodule update --init --recursive

使用 Dockerfile 安装 Leela-Zero

nvidia/cuda 开始构建 docker image,如下为 Dockerfiles/Dockerfile.gpu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
FROM nvidia/opencl:devel-ubuntu16.04

RUN echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse" > /etc/apt/sources.list && \
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse" >> /etc/apt/sources.list

# Install
RUN apt-get -qq update
RUN apt-get install -y apt-utils cmake g++ curl
RUN apt-get install -y libboost-all-dev libopenblas-dev opencl-headers ocl-icd-libopencl1 ocl-icd-opencl-dev zlib1g-dev
RUN apt-get install -y qt5-default qt5-qmake

RUN mkdir -p /src/build/
COPY . /src/
WORKDIR /src/build/

# GPU build
RUN CXX=g++ CC=gcc cmake ..
RUN make all -j$(nproc)

# CMD cmake --build . --target leelaz --config Release -- -j2

leela-zero 根目录执行

1
nvidia-docker build -t leelaz:gpu -f Dockerfiles/Dockerfile.gpu .

运行自对弈程序(Self Play)

通过 nvidia-docker 启动自对弈程序(nvidia-docker 安装参考 NVIDIA/nvidia-docker),执行如下命令

1
2
3
4
5
nvidia-docker run -it \
-v $HOME/data/leelaz/self_play:/data \
-v $HOME/data/leelaz/weights:/src/build/networks \
leelaz:gpu \
./autogtp/autogtp -u 4 -k /data/sgf -d /data/debug

命令解释:

  • -v:挂载自对弈棋面数据的存储路径;挂载权重文件。autogtp 默认在启动路径下找到 networks 路径加载权值。实际执行如下命令启动 leelaz

    1
    ./leelaz --tune-only -w networks/ --gpu=...
  • -u:Index of the GPU to use for multiple GPUs support

  • -k:存储每局自对弈数据的路径。默认情况下,自对弈的数据会先上传到 http://zero.sjeng.org/submit-match,然后再存储到本地。 如果没有指定 -k 参数,自对弈数据直接被删除。

使用 Tensorflow 训练模型(Training)

生成训练数据有如下两种方法

  1. 运行自对弈程序,得到对弈数据,如下所示

    1
    2
    $ ls ~/data/leelaz/self_play/
    257fab047b414591b6d2f1a8eb435516.sgf

    将自对弈数据转变为训练数据

    1
    2
    3
    4
    5
    6
    7
    8
    nvidia-docker run -it \
    -v $HOME/data/leelaz/self_play:/data \
    -v $HOME/data/leelaz/weights:/src/build/networks \
    leelaz:gpu ./leelaz \
    -w /src/build/networks/dec5b9d88877fe876a308b42370335c8f5465235d0104c889bdda3b42993aa28

    dump_supervised /data/257fab047b414591b6d2f1a8eb435516.sgf /data/train.out
    <CTRL+C exit>
  2. 在自对弈过程中设置 debug 目录,运行

    1
    ./autogtp/autogtp -u 4 -k /data/sgf -d /data/debug

    在 /data/debug 目录下,除开以 .debug.txt.0.gz 结尾的数据,以 .txt.0.gz 结尾的数据为训练数据。

启动 tensorflow-py3 进行训练

1
2
3
4
5
6
7
8
9
LEELAZ_HOME=`pwd`
nvidia-docker run -it --rm \
-v $HOME/data/leelaz:/data \
-v $LEELAZ_HOME:/src \
tensorflow/tensorflow:1.10.1-gpu-py3 /bin/bash

cd /src/training/tf
python parse.py /data/self_play/debug/*[!debug].txt.0.gz \
--test /data/self_play/debug/*[!debug].txt.0.gz

在 Leelaz 中使用新模型

启动 leelaz 加载新模型进行对弈,如下所示

1
2
3
4
./leelaz --gpu=0 --noponder -w ../training/tf/leelaz-model-2000.txt
genmove b
genmove w
...

Errors

  1. 更新 apt 源出现网络错误。

    修改 Dockerfile,添加国内的 apt source,例如 tsinghua 的 ubuntu 源。

  2. clinfo 没有找到 GPU device

    • 选择安装了 OpenCL 驱动的镜像,在 nvidia/opencl hub 中,选择合适的镜像源,在本文中选择 devel-ubuntu16.04 作为基础镜像

    • 使用 nvidia-docker 启动镜像,如下所示

      1
      nvidia-docker run -it --rm nvidia/opencl:devel-ubuntu16.04 /bin/bash