2018年07月14日

「Leela Zero」専用囲碁GUI「Lizzie」のインストールと使いかた - Ubuntu編

せっかく「Leela Zero」をインストールしても対局しかできないのは残念なことで、できることならこのどんどん強くなっていくコンピュータ囲碁プログラムが考えていることを学んで、棋力の向上に役だてたいものです。
そうした目的にぴったりな「Leela Zero」専用囲碁GUIとして、「Lizzie - Leela Zero Interface」が公開されています。

「Lizzie」GitHubレポジトリ
・ソースからビルド(Linuxバイナリ配布あり)。
・GPUバージョンおよびCPUバージョン。

「Lizzie」を使うことで、「Leela Zero」と対局するだけではなく、「Leela Zero」の思考エンジンを利用して棋譜を分析することもできるようになります。
棋譜分析では勝率の推移はもちろん、候補手とそれぞれの勝率、そのあとの読み筋などを表示させることが可能で、hatakazuのように囲碁の勉強に「Leela Zero」を使ってみたいひとにとってはたいへん役にたつツールになっています。

1. 前提となる環境
インストールするコンピュータの仕様は以下のとおり。

--
Dell Inspiron 14 7472 Core i7モデル 18Q42P
OS:Ubuntu 18.04 LTS 日本語 Remix
CPU:インテル Core i7-8550U (4Mキャッシュ、最大4.0GHz)
GPU:NVIDIA GeForce MX150 GDDR5 2GB
メモリー:8GB DDR4 2400MHz(最大16GB)
保存装置:128GB SSD (Windows10 Home 64bit) + 1TB 5400rpm HDD (Ubuntu 18.04 LTS 日本語 Remix)
--

「Lizzie」をインストールするさいの動作要件ですが、ハードウェア的には特別な要請はなく、Ubuntuが動いているコンピュータならたいてい問題なく動かせるはずです。
ただし、「Lizzie」はようするに「Leela Zero」を思考エンジンとしてもちいる囲碁GUIなので、「Leela Zero」を動かすさいの条件を考慮する必要があります。
NVIDIA製もしくはAMD製の外部GPUを搭載したコンピュータであれば、GPUバージョンの「Leela Zero」を動かすことができますが、それ以外の場合はCPUバージョンを使うことになります。
ソフトウェア的には、「Lizzie」は「Javaランタイム」をあてにしているので、「Javaランタイム」をあらかじめインストールしておく必要があります。

*****「Java」ランタイムインストール*****
(必要な環境がすでに構築されている場合は、このセクションは無視して先へすすんでください。)

Java SE Downloads」ページから「Java SE 8u171/ 8u172」 -> 「JDK」のボタンを押して、「Java SE Development Kit 8 Downloads」へすすみ、Linux版圧縮ファイル「jdk-8u171-linux-x64.tar.gz」をクリックしてインストールファイル「jdk-8u171-linux-x64.tar.gz」をダウンロードします。
ダウンロードしたディレクトリへ移動して、このファイルを解凍すると「jdk1.8.0_171」ディレクトリができるので、それを「/usr/lib/jdk1.8.0_171」に設置します。

$ tar xzvf jdk-8u171-linux-x64.tar.gz
$ sudo mv jdk1.8.0_171 /usr/lib


そのあと、エディタで「~/.bashrc」に以下二行を追記して、パスをとおしておきます。

export JAVA_HOME=/usr/lib/jdk1.8.0_171/
export PATH=$PATH:$JAVA_HOME/bin


「$ java -version」コマンドを実行して、バージョン情報が正しく表示されれば、パスの設定はO.K.です。

$ java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)


もうひとつ、「Lizzie」ではソースからビルドするにさいして、「Maven」を使用することが推奨されています。
「Maven」もまた「Java」ランタイムがインストールされていることを動作要件とするため、上記「Java」ランタイムインストールを実行してから、「Maven」インストールへすすんでください。

*****「Maven」インストール*****
(必要な環境がすでに構築されている場合は、このセクションは無視して先へすすんでください。)

Download Apache Maven」ページで「apache-maven-3.5.4-bin.tar.gz」をクリックし、インストールファイル「apache-maven-3.5.4-bin.tar.gz」を取得します。

ファイルをダウンロードしたディレクトリへ移動して、「apache-maven-3.5.4-bin.tar.gz」を解凍し、生成した「apache-maven.3.5.4」ディレクトリを「~/apache-maven.3.5.4」へ移動します。
最後に、パスのとおったディレクトリ(たとえば「~/bin」など)に、「~/apache-maven-3.5.4/bin/mvn」からシンボリックリンクを貼ります。
$ tar zxvf apache-maven-3.5.4-bin.tar.gz
$ mv apache-maven-3.5.4 ~/
$ ln -s ~/apache-maven-3.5.4/bin/mvn ~/bin


ターミナルを再起動(もしくはあらたなターミナルを起動)して、「mvn -v」コマンドを実行し、正しくインストールされていることを確認します。


2. 「Lizzie」インストールの準備とソースの取得
「Lizzie」の現行バージョンは「v0.5」で、「Leela Zero」のあたらしい機能であるリアルタイム分析に対応しており、「Leela Zero」公式ソースからビルドした「leelaz」をそのまま使うことができるようになっています。
(以前は、「Leela Zero」に思考内容を常に出力する機能をもたせるために、ソースに変更をくわえてから「leelaz」をビルドする必要がありました。)
以下の手順にしたがって、「Leela Zero」GitHubレポジトリ「next」ブランチから「~/leelaz-lizzie」以下にソースを取得し、「Lizzie」と連携できる「Leela Zero」をビルドします。

$ cd
$ sudo apt install clinfo && clinfo
$ sudo apt install libboost-dev libboost-program-options-dev libopenblas-dev opencl-headers ocl-icd-libopencl1 ocl-icd-opencl-dev zlib1g-dev
$ git clone -b next http://github.com/gcp/leela-zero leelaz-lizzie
$ cd leelaz-lizzie/src

CPUバージョンをビルドする場合は、ここでテキストエディタで「config.h」を開き、現行バージョンでは74行めにあたる「#define USE_OPENCL」行を削除します。


$ make
$ cd ..
$ wget http://zero.sjeng.org/best-network


つづいて、ホームディレクトリへもどったうえで、「Lizzie」のソースを取得します。

$ cd
$ git clone https://github.com/featurecat/lizzie
$ cd lizzie


これで、「Lizzie」をビルドするのに必要なソースが「~/lizzie」ディレクトリにコピーされ、そこへ移動してビルド作業をすすめる準備がととのいました。

3. 「Lizzie」のインストール
「Lizzie」をビルドするには、Javaベースのプロジェクトを管理するためのツール、「Maven」を使います。
ビルド処理が終わったら、さきほど「~/leelaz-lizzie」ディレクトリ以下に用意した「leelaz」と「best-network」を、「~/lizzie」にコピーします。

$ mvn package
$ cp ~/leelaz-lizzie/src/leelaz ./
$ cp ~/leelaz-lizzie/best-network ./network.gz


以上で、「Lizzie」のインストール作業は完了です。

4. 「Lizzie」の設定
まずは、「~/lizzie」ディレクトリから以下のコマンドを実行して、「Lizzie」が正常に起動することを確認します。

$ java -jar "target/lizzie-0.5-shaded.jar"


はじめて「Lizzie」を起動する場合は、連携する「Leela Zero」が「OpenCL」チューニングを設定する必要があるため、じゃっかん時間がかかります。
左下に「Leela Zero is loading...」というメッセージが表示された状態で、しばらく待たされますが、このメッセージが消えたら「Lizzie」は問題なく起動しています。
「Lizzie」の正常起動を確認したら「Lizzie」をいったん終了し、「lizzie」フォルダのなかに生成している設定ファイル「config.txt」を開きます。
以下に、編集する可能性のある項目だけ抜き出して、各項目の意味と設定方法を記述します。

{ # 全体設定開始。
"leelaz": { # エンジン設定開始。
"automatically-download-latest-network": false, # 「true」にすると、起動するたびに最新の学習ずみネットワークを確認にいく。
"max-analyze-time-minutes": 5, # 思考モードを継続する最大分数。
"analyze-update-interval-centisec": 10, # エンジンから分析情報を送る間隔を1/100秒単位で指定。
"network-file": "network.gz", # 利用する学習ずみネットワークファイルを指定。
"max-game-thinking-time-seconds": 10, # 対局時に考える一手あたりの最大秒数。
"engine-start-location": ".", # パスの起点を指定する。
"engine-command": "./leelaz --gtp --lagbuffer 0 --weights %network-file --threads 4", # エンジンのパスと、起動時にわたすパラメータ。
"print-comms": false # 「true」にすると、エンジンとやりとりするGTPコマンドを出力する。
}, # エンジン設定終了
"ui": { # GUI設定開始
"shadows-enabled": true,
"board-color": [
217,
152,
77
],
"shadow-size": 100,
"show-winrate": true, # 勝率を表示する。
"fancy-board": true,
"show-variation-graph": true, # 「true」にすると、画面右に分岐ツリーを表示する。
"win-rate-always-black": false, # 「true」にすると、つねに黒番からみた勝率を表示する。
"confirm-exit": false, # 「true」にすると、「lizzie」を終了するときにデータ保存の確認をする。
"handicap-instead-of-winrate": false, # 「true」にすると、実力差を勝率ではなく、置石の数で表示する。
"large-subboard": false, # 画面左下の第二碁盤を大きなサイズで表示する。
"show-move-number": false, # 「true」にすると、石の上に手順を表示する。
"show-next-moves": true, # 次の手を表示する。
"show-leelaz-variation": true, # 変化図を表示する。
"show-subboard": true, # 画面左下に第二碁盤を表示する。
"theme": "DefaultTheme",
"fancy-stones": true,
"show-best-moves": true, # 最善手をハイライト表示する。
"board-size": 19
} # GUI設定終了
} # 全体設定終了


上記は「http://zero.sjeng.org/best-network」から最新の学習ずみネットワークを取得し、それを「~/lizzie」フォルダに置いて、「network.gz」という名前に変更したものを利用する設定です。

*****そのほかの学習ずみネットワークの利用方法*****
「Leela Zero」が各局面でどう打つかは過去に学習してきたことに依存するので、ことなる学習ずみネットワークを読みこませることで、ことなるふるまいをすることが期待できます。

人間の棋譜から学んで人間にちかい打ちかたをするもの
上のリンクから「best_v1.txt.zip」ファイルを取得し、展開してえられる「weights.txt」ファイルを「~/lizzie」フォルダに移動して、「human-network」などのわかりやすい名前に変更しておきます。
この学習ずみネットワークを利用したい場合、「Lizzie」フォルダにある設定ファイル「config.txt」の該当部分を、「"network-file": "human-network",」に変更します。

Facebook「ELF OpenGo」の学習ずみネットワークを「Leela Zero」で利用できるように変換したもの
上のリンクからgzファイルを取得し、「~/lizzie」フォルダに移動して、「ELF-network」などのわかりやすい名前に変更しておきます。
Facebook「ELF OpenGo」のGitHubレポジトリから学習ずみネットワーク「pretrained-go-19x19-v0.bin」をダウンロードして、公開されているpythonスクリプトで変換することもできます。

この学習ずみネットワークを利用したい場合、「Lizzie」フォルダにある設定ファイル「config.txt」の該当部分を、「"network-file": "ELF-network",」に変更します。


以上の設定が終わったら、「Lizzie」の起動をかんたんにするために、スクリプトを作成して「~/lizzie/lizzie.sh」に保存します。

#!/bin/bash
cd ~/lizzie
java -jar "target/lizzie-0.5-shaded.jar"


「$ ln -s ~/lizzie/lizzie.sh ~/bin/lizzie」コマンドで、パスのとおったディレクトリ「~/bin」にシンボリックリンクをはっておけば、「$ lizzie」コマンドでかんたんに「Lizzie」を起動できるようになります。

5. 「Lizzie」の使いかた
デフォルトであらわれるのは、白黒両方を手動入力するかたちで、「Leela Zero」エンジンの思考内容を表示させていく画面です。
「x」キーを押すことで、入力できるコマンドの一覧表が表示されます。
「Leela Zero」との対局を開始するためには、「n」キーを押下します。
対局条件としては手番と置石は設定できますが、コミは七目半固定で、日本ルールでの対局はできなそうなのが残念なところです。
「Leela Zero」に棋譜分析させるためには、「o」キーを押して、分析したいSGFファイルを読みこみます。
「s」キーで保存、「i」キーで棋譜情報編集、「m」キーで手順番号表示、「.」キーで地を数えて形成判断します。
上下矢印キーで手順操作、左右矢印キーで分岐ツリーを移動、「home」キーで棋譜の最初へ、「end」キーで棋譜の最後へ飛びます。
棋譜分析では、考えられる候補手が勝率および思考深さとともに表示され、候補手のどれかにカーソルを重ねるとそのあとの読み筋が表示される仕組みになっています。
「space」キーで「Leela Zero」の思考開始/停止をコントロールできるほか、「enter」キーで「Leela Zero」に次の手を打たせてみることもできます。
posted by hatakazu at 22:59| Comment(0) | 囲碁ソフトのこと | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください