2020年05月16日

Windows 10上に囲碁勉強環境を構築する - 「Lizzie」応用編

「Lizzie」はいろいろな要素を自分なりに設定して自由に楽しめる設計になっていますが、なかでもおもしろいのが「設定」 -> 「エンジン」で「Leela Zero」や「KataGo」にべつのネットワークファイルを読みこませたり、「Leela Zero」とおなじ方法で「Lizzie」と情報をやりとりできるほかのコンピュータ囲碁プログラムを登録したりできるところです。
つまり、ネットワークを変更したり(「Lizzie」と通信できる機能をそなえているかぎりにおいて)ほかのコンピュータ囲碁プログラムを登録したりすることで、自分の好みの棋風をもつコンピュータ囲碁プログラムを「Lizzie」のフレンドリーなインタフェースを介して利用できるということです。
「Lizzie」に最初からふくまれている「Leela Zero」および「KataGo」についても、すこしだけ設定を変更するだけで、いろいろな使いかたがを実現することができます。
ここでは「Leela Zero」のネットワークファイルを変更する方法から、「KataGo」でネットワークファイルのみならずプログラム本体まで置きかえて、日本ルールで囲碁を勉強するのに最適な環境をととのえるところまでを記述していきます。

1. 「Leela Zero」の設定
「Lizzie」をインストールすると、「Lizzie」とのやりとりのために特別に設計された「Leela Zero」と、「Leela Zero」が利用するネットワークファイルがついてきます。
このネットワークファイルは「lznetwork.gz」という名前で「lizzie」フォルダに置かれており、標準エンジン設定「エンジン0: ./leelazero/leelaz --gtp --lagbuffer 0 --weights lznetwork.gz」の「--weights lznetwork.gz」部分によって、呼び出される仕組みになっています。
ということは、「lznetwork.gz」という名前はそのままに中身をべつのネットワークファイルに置きかえてしまうか、あるいはべつの名前のネットワークファイルを用意してそれを呼び出すようにエンジンを設定すれば、「Leela Zero」はいろいろなネットワークファイルを利用して思考することができるわけです。
いくつか特徴的なものを紹介しておきます。

・常に最新=最強の学習ずみネットワークを使う
たとえば「Leela Zero」プロジェクトでは「https://leela.online-go.com/networks/」に歴代のネットワークファイルが保管されており、ここから最新のネットワークファイル「best-network.gz」をダウンロードできるので、それを「lizzie」フォルダに置いて「エンジンX: ./leelazero/leelaz --gtp --lagbuffer 0 --weights best-network.gz」と設定すれば「エンジンX:」は「best-network.gz」を呼び出すことになります。
定期的に「best-network.gz」ファイルを更新するだけで、「Lizzie」を立ち上げれば常に最新=最強の「Leela Zero」で対局および棋譜分析を楽しむことができる、と考えただけでもわくわくしてきませんか。

・人間の棋譜から学んで人間にちかい打ちかたをするネットワーク
人間の対局データを使って学習したネットワーク「best_v1.txt.zip」ファイルを取得し、展開してえられる「weights.txt」ファイルを「lizzie」フォルダに移動して、「human-network」などのわかりやすい名前に変更しておきます。
「エンジンX: ./leelazero/leelaz --gtp --lagbuffer 0 --weights human-network」のように設定すれば、より人間に打ちかたに近い打ちかたをする「Leela Zero」と対局できることになります。
Leela Master Weight」のどれかを使ってみるのもおもしろいでしょう。

・Facebook「ELF OpenGo」プロジェクトで公開されているネットワーク
Facebook「ELF OpenGo」のGitHubレポジトリから学習ずみネットワークをダウンロード、公開されているpythonスクリプトで処理して「Leela Zaro」で読み込めるネットワークファイルに変換し、「ELF-network-v2」などのわかりやすい名前に変更しておきます。
歴史的な意味のある「v0」「v1」「v2」の三つが公開されており、強い弱い以前にそれぞれかなり棋風がちがうようなのですが、ふつうはいちばん新しい「v2」を使えば問題ありません。

pretrained-go-19x19-v0.bin」 -> ファイル名の例「ELF-network-v0」
pretrained-go-19x19-v1.bin」 -> ファイル名の例「ELF-network-v1」
pretrained-go-19x19-v2.bin」 -> ファイル名の例「ELF-network-v2」

「ELF-network-v2」ファイルを「lizzie」フォルダに置いて、「エンジンX: ./leelazero/leelaz --gtp --lagbuffer 0 --weights ELF-network-v2」と設定すれば、「Lizzie」は「Leela Zero」経由で「ELF OpenGo」のネットワークファイルを使って思考します。

「ELF OpenGo」のネットワークは「Leela Zero」のネットワークファイル保管庫にも取りこまれているので、それをダウンロードしてくるだけでおなじことを実現することもできます。
「v0」を「Leela Zero」で利用できるように変換したもの -> ファイル名の例「ELF-network-v0.gz」
「v1」を「Leela Zero」で利用できるように変換したもの -> ファイル名の例「ELF-network-v1.gz」
「v2」を「Leela Zero」で利用できるように変換したもの -> ファイル名の例「ELF-network-v2.gz」


2. 「KataGo」の設定
「KataGo」はコンピュータ囲碁プログラムとしては比較的新しいプロジェクトで、プログラムの完成度においても囲碁の強さという点においても、急速に改善を重ねてきたといっていいでしょう。
プログラムについていえば2019年10月の時点で「KataGo」のバージョンは「v1.2」で、「Lizzie 0.7.2」にはOpenCLバージョン「KataGo v1.2」が採用されているわけですが、利用できるネットワーク形式に制限があったり、このあとに追加された機能(なかでも日本ルール対応は重要)を使えない不便があったりします。
また、そのときに同梱されたネットワークファイルはまだそれほど学習を経ておらず、それから半年たったいま公開されている最新ネットワークのほうがはるかに強くなっています。

Warning: the version of KataGo packaged directly with Lizzie is fairly OLD. The net is quite weak compared to the latest nets, and the executable may not support the latest models or features. Download a newer version of both the net and executable from the releases page.


そこでここではまず、「KataGo」プログラムじたいを新しいものと交換することで機能の強化をはかったうえで、ネットワークファイルを置きかえてかんたんに「KataGo」を強くする作業をおこないます。
「Leela Zero」のときのようにとっととネットワークファイルを置きかえてしまわないのは、前述したとおり古い「KataGo」では利用できるネットワーク形式に制限があり、そのままでは現在提供されている最新=最強のネットワークファイルを使えないからです。

2.1 「KataGo」プログラムの更新
作者がすすめにしたがって素直に「Releases」ページへいき、最新バージョン「v1.4.2」を探して、OpenCLバージョンの圧縮ファイル「katago-v1.4.2-opencl-windows-x64.zip」をダウンロードします。
ダウンロードしたファイルを展開すると、「katago-v1.4.2-opencl-windows-x64」フォルダができるので、このフォルダをそのまま「lizzie」フォルダに移動します。
ここからすこし注意を要する作業になりますが、現時点で「lizzie」フォルダには、①最初からはいっていた「katago」フォルダと②たったいま移動してきた「katago-v1.4.2-opencl-windows-x64」フォルダが存在します。
この状態でまず、もう使わない古い「KataGo v1.2」の①「katago」フォルダを「katago-old」のような別名に変えてしまい、そのあとで、これから使う新しい「KataGo v1.4.2」の②katago-v1.4.2-opencl-windows-x64」フォルダを「katago」に変更します。

①「katago」フォルダ -> 「katago-old」フォルダ
②「katago-v1.4.2-opencl-windows-x64」フォルダ -> 「katago」フォルダ

これによって「KataGo v1.2」が「KataGo v1.4.2」に置きかえられ、それ以外の変更はないので、次に「Lizzie」を起動したときから「エンジン1: ./katago/katago gtp -model katanetwork.gz -config katago-gtp10.cfg」は「KataGo v1.4.2」を呼び出すことになります。
問題なく動作するようなら、古い「KataGo v1.2」をふくむ「katago-old」フォルダは、そのうち削除してしまってもかまいません。

2.2 「KataGo」ネットワークの更新
ようやく準備がととのったので、次は「KataGo」にべつのネットワークを利用して思考させる設定をすすめます。
「KataGo」でも「Leela Zero」の場合とおなじように「katanetwork.gz」という名前の標準ネットワークファイルが「lizzie」フォルダに置かれており、標準エンジン設定「エンジン1: ./katago/katago gtp -model katanetwork.gz -config katago-gtp10.cfg」の「-model katanetwork.gz」部分によって、呼び出されています。
「katanetwork.gz」という名前はそのままに中身をべつのネットワークファイルに置きかえてしまうか、あるいはべつの名前のネットワークファイルを用意してそれを呼び出すようにエンジンを設定すれば、「KataGo」にべつのネットワークファイルを使って思考させることができるのもおなじです。
「KataGo」の歴代ネットワークファイルは「katago-public/g170/neuralnets」に保管されているので、そこからダウンロードしてきたネットワークファイルを自由に使うことができます。
ここでは最近「KataGo v1.4.0」と同時に公開された、117日間トレーニングずみの最新ネットワークファイルをダウンロードして、読みこませてみることにします。
それぞれことなる設計のネットワークファイルで、コンピュータの性能によっても強さに差が出てくるので、試してみて自分の環境に合いそうなものを採用するといいでしょう(基本的にはGPU性能が上がるほど下のものが強くなるはず)。

g170-b20c256x2-s4384473088-d968438914.bin.gz - The latest and final semi-zero 20-block net (continuing extended training on games from the bigger nets). -> ファイル名の例「kata20x256.bin.gz」
g170-b30c320x2-s3530176512-d968463914.bin.gz - The latest and final semi-zero 30-block net. -> ファイル名の例「kata30x320.bin.gz」
g170-b40c256x2-s3708042240-d967973220.bin.zp - The latest and final semi-zero 40-block net. -> ファイル名の例「kata40x256.bin.gz」

こうしてダウンロードした「kata20x256.bin.gz」「kata30x320.bin.gz」「kata40x256.bin.gz」を「lizzie」フォルダへ移動し、エンジン設定で「KataGo」がこのネットワークを呼び出すように、以下のように登録しておきます。

「エンジンx: ./katago/katago gtp -model kata20x256.bin.gz -config ./katago/default_gtp.cfg」
「エンジンy: ./katago/katago gtp -model kata30x320.bin.gz -config ./katago/default_gtp.cfg」
「エンジンz: ./katago/katago gtp -model kata40x256.bin.gz -config ./katago/default_gtp.cfg」


もともとの標準エンジン設定標準エンジン設定「エンジン1: ./katago/katago gtp -model katanetwork.gz -config katago-gtp10.cfg」と比べると、「-confg ./katago/default_gtp.cfg」部分も同時に変更していますが、それについては次の日本ルールのところで説明します。

2.3 「KataGo」に日本ルールを適用
最新のネットワークファイルを使うために最新の「KataGo」をインストールしましたが、「KataGo」では「v1.3」で日本ルールへの対応を打ち出し、「lizzie」フォルダにある「katago-gtp10.cfg」でその挙動を制御できるようになっています。
すばらしい!
設定ファイルはエンジン設定の「-config katago-gtp10.cfg」部分で指定していますが、「Lizzie」標準のこの設定ファイルは古い(つまり日本ルール対応以前の)「KataGo v1.2」用のものなので、ここを「-config katago/default_gtp.cfg」のように変更することで新しい(つまり日本ルール対応可能な)「KataGo v1.4.2」についてくる設定ファイルを使えるようになります。
基本ルールにかかわる設定ファイルの変更は以下の赤字部分で、日本ルールの適用はデフォルトの「rules = tromp-taylor」をコメントアウトして、「rules = japanese」と宣言するだけです。
個別に指定するなら、青字で示した三行のコメントをはずし、指定を有効化する方法もあります。

# Default rules------------------------------------------------------------------------------------
# See https://lightvector.github.io/KataGo/rules.html for a description of the rules.
# These rules are defaults and can be changed mid-run by several custom GTP commands.
# See https://github.com/lightvector/KataGo/blob/master/docs/GTP_Extensions.md for those commands.

# Some other legal values are: "chinese", "japanese", "korean", "aga", "chinese-ogs", "new-zealand".
# KataGo does not claim to exactly match any particular human ruleset, but KataGo will try to behave
# as closely as possible given the rules it has implemented.
# rules = tromp-taylor
rules = japanese

# Use the below instead to specify an arbitrary combination of individual rules.

# koRule = SIMPLE # Simple ko rules (triple ko = no result)
# koRule = POSITIONAL # Positional superko
# koRule = SITUATIONAL # Situational superko

# scoringRule = AREA # Area scoring
# scoringRule = TERRITORY # Territory scoring (uses a sort of special computer-friendly territory ruleset)

# taxRule = NONE # All surrounded empty points are scored
# taxRule = SEKI # Eyes in seki do NOT count as points
# taxRule = ALL # All groups are taxed up to 2 points for the two eyes needed to live

# multiStoneSuicideLegal = true #Is multiple-stone suicide legal? (Single-stone suicide is always illegal).


設定ファイルを上記のように変更したあとで「Lizzie」から「KadoGo」を起動し、対局するなら「n」キーを押して新規対局を設定する画面、棋譜分析するなら「i」キーを押して棋譜情報を設定する画面を開いて、コミを「6.5」に指定してやります。

3. 「KataGo」をOpenCLバージョンからCUDAバージョンに切り替える
Windows 10上に囲碁勉強環境を構築する - 準備編」の記述のとおりに「CUDA 10.2」+「cuDNN 7.6.5」+「TensorRT 7.0.0」環境が構築されていれば、「KataGo」については「Lizzie」に標準添付されているOpenCLバージョンだけではなくて、あらたにCUDAバージョンをインストールして「Lizzie」から利用することができます。
ダウンロードできる「KataGo」の実行ファイルは、「CUDA 10.1」+「CUDNN 7.6.1」環境でコンパイルされたようですが、より新しい「CUDA 10.2」+「cuDNN 7.6.5」環境で問題なく動作することは確認ずみです。
CUDAバージョン「KataGo」のインストールは、「2.1 『KataGo』プログラムの更新」でまとめた手順をそのまま、「katago-v1.4.2-opencl-windows-x64」をすべて「katago-v1.4.2-cuda10.1-windows-x64」に読みかえて実行するだけです。
ネットワーク更新については「2.2」で、日本ルール適用についても「2.3」で記述した手順が、そのまま使えます。
posted by hatakazu at 08:30| Comment(7) | 囲碁ソフトのこと | 更新情報をチェックする
この記事へのコメント
こんにちは、hope366と申します、よろしくお願い致します。
こちらのサイトには多くの有用な情報が掲載されており大変勉強になります、有難うございます。

さて本題ですが、少し前にlizzieでLeelaを使用可能にするためのソースコードが発表されました。https://github.com/featurecat/lizzie/issues/815
これを使ってlizzieをコンパイルして何とかLeelaを使うことができました。
https://github.com/hope366/Lizzie-improvements/releases/tag/v2.1
↑Leela以外にも多くの修正や機能追加がされているlizzie改良版です。
しかし、分析状況がやや不安定なのと、自動分析がどうやらできないみたいです。
https://github.com/kaorahi/Leela/tree/lz-analyze
これはLeelaのソースコードにlz-analyzeを採用させたもので、分析状況が改善されているようです。しかし私はLeelaのコンパイルができません。GitHubのLeelaの説明を読んだのですが、あまり詳しく書かれていないため私の力では無理でした。
そこで、もしhatakazuさんがLeelaのコンパイルの方法をご存じでしたら、こちらのサイトで詳しく紹介して頂くことはできないかとコメントを書かせていただいた次第です。

コメントを読んでいただき有難うございました。

Posted by hope366 at 2021年01月05日 08:33
>hope366さん

>https://github.com/kaorahi/Leela/tree/lz-analyze
>これはLeelaのソースコードにlz-analyzeを採用させたもので、分析状況が改善されているようです。

上記Leelaソースをコンパイルして、

>https://github.com/hope366/Lizzie-improvements/releases/tag/v2.1
>↑Leela以外にも多くの修正や機能追加がされているlizzie改良版です。

これから呼び出して動かしてみると、たしかにLeela Zeroのように分析結果が表示されますね。
もともとのLeelaの振る舞いとどう違うのか、どう改善されているのかは、LeelaをLizzieで動かしたことがなかったのでわかりませんが・・・。
hope366さんのLizzie改善版はすばらしいですね、ぼくも本家Lizzieの代わりに、hope366さんのものを使わせてもらいます。
Posted by hatakazu at 2021年01月09日 08:05
>上記Leelaソースをコンパイルして、

Leelaをコンパイルできるのですね、素晴らしいです!!
もし可能であれば、コンパイルするための具体的な手順を教えて頂きたいです。
面倒であればコンパイルして出来上がった「Leela0110GTP.exe」及び「Leela0110GTP_OpneCL.exe」をアップロードして頂けると嬉しいです。

Posted by hope366 at 2021年01月09日 16:33
>hope366さん
>
>面倒であればコンパイルして出来上がった「Leela0110GTP.exe」及び「Leela0110GTP_OpneCL.exe」をアップロードして頂けると嬉しいです。

以下のURLへアクセスしてダウンロードしたファイルを解凍のうえ、Lizzie改良版から呼び出して動かしてみてください。
とりあえずOpenCL版のみです、リンクは短期間のみ有効としますので、ダウンロード完了したらお知らせください。

https://hatakazublog.up.seesaa.net/image/Leela-compiled.7z

ぼくはこれで動かせているのですが、hope366さんの環境でも動くといいのですが。
Posted by hatakazu at 2021年01月10日 17:09
ダウンロード完了しました、有難うございました。
lizzieで動作はしましたが、ノーマルバージョンと同じく自動分析はできませんでした。
また、分析を開始して数秒で分析速度が1/10程度にまで落ちてしまう現象も改善されていませんでした。
そもそも修正コードを用いてコンパイルしたLeela.exeを使えば、このような不具合が解消されるという確証はないのですが・・・
念のために確認させて頂きたいのですが、hatakazuさんの環境でもこのような不具合は起きていますか?
Posted by hope366 at 2021年01月10日 18:26
>hope366さん
>
>念のために確認させて頂きたいのですが、hatakazuさんの環境でもこのような不具合は起きていますか?

分析スピードについてはきちんと調べていませんが、棋譜の自動分析は開始後ずっと先にすすまず、正常に動作してないようですね。
Posted by hatakazu at 2021年01月12日 07:04
hatakazuさん
検証して頂き有難うございました。
どうやら私が期待していたようなものではないようですね。
修正コードの説明に「パフォーマンスを低下させることなく通常のlizzieで動作する」と書かれています。つまり、Leela-0.11.0が動作するように修正されたlizzie(例えば私のlizzie改良版)でなく、公式版の普通のlizzieでLeela-0.11.0が動く、ということなのかもしれません。
hatakazuさんにコンパイルしてもらったLeela.exeを、公式版のLizzie-v0.7.4で試してみたのですが、
「Lizzie requires version 0.15 or later of Leela Zero for analysis (found 0.11.0)」
というエラーが出ました。Lizzie-v0.7.4には最新版のLeela Zeroが使われているはずですが何故でしょうか?

Posted by hope366 at 2021年01月12日 12:52
コメントを書く
コチラをクリックしてください