2018年07月13日

コンピュータ囲碁プログラム「Leela Zero」のインストールと使いかた - Ubuntu編

コンピュータ囲碁プログラム「Leela」を開発したベルギーの開発者が、Google DeepMindの「AlphaGo Zero」論文に触発されて、自己対戦による深層学習の手法にもとづくあらたなコンピュータ囲碁プログラム「Leela Zero」を開発し、ユーザがリソースを提供して自己対戦データを収集することで「Leela Zero」を育てていく、というユーザ参加型のプロジェクトが立ち上がっています。
このプロジェクトは2017年11月に開始されましたが、およそ九ケ月たった2018年7月現在までに800万回をこえる自己対戦を積みかさねた結果として、「Leela Zero」はすでに世界最強のコンピュータ囲碁プログラムのひとつといえるまでに成長しているそうです。

「Leela Zero」プロジェクトのサイト
「Leela Zero」GitHubレポジトリ
・ソースからビルド。
・GPUバージョンおよびCPUバージョン。

ほかのオープンソース化されたコンピュータ囲碁プラグラムは、あらかじめ自己対戦を積みかさねてできあがった学習ずみネットワークが公開されますが、プロジェクトとしてはその時点で完結しているため、さらに学習をつづけて学習ずみネットワークが更新されることはありません。
しかしながら「Leela Zero」の場合は、ユーザの協力によって自己対戦データを増やしていってみんなで「Leela Zero」を育てていくプロジェクトなので、はっきりと強くなったことが確認された時点で学習ずみネットワークが更新されます。
「AlphaGo Zero」論文の検証を目的として立ちあげられたプロジェクトですが、人間の棋譜から学ぶことなく独力で学習をつづける「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)
--

「Leela Zero」をインストールするにあたっては、NVIDIA製もしくはAMD製の外部GPUを搭載したコンピュータであればGPUバージョンを動かすことができますが、それ以外の場合はCPUバージョンを使うことになります。
なお、「Leela Zero」を使って対局や棋譜分析をおこないたい場合は、GTPを解釈できる囲碁GUIと連携させる必要があります。
「Leela Zero」専用に開発された「Lizzie」という囲碁GUIを使うのが便利ですが、一般的によく知られた「GoGui」や「Sabaki」などの囲碁GUIにも、問題なく登録できます。

2. 「Leela Zero」インストールの準備とソースの取得
「Leela Zero」の現行バージョンは「v0.15」で、「Leela Zero」GitHubレポジトリでソースが公開されています。
「Leela Zero」をビルドするためには、必要なライブラリなどをあらかじめインストールのうえ、「Leela Zero」のソースを取得します。
「Leela Zero」をホームディレクトリ直下の「~/leela-zero」以下へインストールするものとして、以下のとおり準備作業をおこないます。

$ cd # ホームディレクトリ「~/」から作業開始。
$ sudo apt install clinfo && clinfo # OpenCL対応デバイスの確認。
$ sudo apt install libboost-dev libboost-program-options-dev libopenblas-dev opencl-headers ocl-icd-libopencl1 ocl-icd-opencl-dev zlib1g-dev # ビルドに必要なライブラリのインストール。
$ git clone https://github.com/gcp/leela-zero # ソースの取得。
$ cd leela-zero/src # 「~/leela-zero/src」ディレクトリへ移動。


3. 「Leela Zero」のインストール

CPUバージョンをビルドする場合は、「Requirements」項の「If you do not have a GPU, modify config.h in the source and remove the line that says "#define USE_OPENCL".」という記述にしたがって、ソースに変更をくわえます。
テキストエディタで「config.h」を開き、現行バージョンでは74行めにあたる「#define USE_OPENCL」行を削除します。
GPUバージョンの場合は、なにもする必要はないので、そのまま以下のビルド作業へすすみます。

$ make # 「~/leela-zero/src」ディレクトリでビルド、「~/leela-zero/src/leelaz」生成。
$ cd .. # 「~/leela-zero」ディレクトリへもどる。
$ wget http://zero.sjeng.org/best-network # 学習ずみネットワーク「~/leela-zero/best-network」設置。


上記手順どおりにインストールを実行した場合、囲碁思考エンジン「Leela Zero」本体は「~/leela-zero/src/leelaz」に、ダウンロードした学習ずみネットワークは「~/leela-zero/best-network」に格納されています。

4. 「Leela Zero」の設定
「Leela Zero」はパラメータをあらかじめ指定した設定ファイルをもたず、起動コマンドにパラメータをわたすかたちで動作を制御します。
そのため設定ファイルの準備は必要ありませんが、ユーザが自己対戦データを提供してみんなで「Leela Zero」を育てていくというコンセプトにもとづいて、強くなったらそのぶんの学習ずみネットワークが公開されるので、「Leela Zero」が最新の学習ずみネットワークを使えるように準備しないといけません。
どの学習ずみネットワークを読みこませるかは、やはり起動時にパラメータ指定することになりますが、そのファイルをあらかじめ取得しておく必要があるということです。
基本的には、「~/leela-zero」ディレクトリへ移動して「wget http://zero.sjeng.org/best-network」コマンドを実行すれば、「http://zero.sjeng.org/best-network」で公開されている最新の学習ずみネットワークが「~/leela-zero/best-network」に設置されます。
それにより、起動時に「--weights /home/username/leela-zero/best-network」パラメータを指定することで、「Leela Zero」が最新の学習ずみネットワークを利用できるようになります。

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

人間の棋譜から学んで人間にちかい打ちかたをするもの
上のリンクから「best_v1.txt.zip」ファイルを取得し、それをそのまま「~/leela-zero」ディレクトリに移動して、「human-network」などのわかりやすい名前に変更しておきます。
この学習ずみネットワークを利用したい場合、「Leela Zero」起動時に指定するパラメータは、「--weights /home/username/leela-zero/human-network」になります。

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

この学習ずみネットワークを利用したい場合、「Leela Zero」起動時に指定するパラメータは、「--weights /home/username/leela-zero/ELF-network」になります。


5. GTP対応囲碁GUIとの連携方法
「Leela Zero」として公開されているのはGUIをもたない囲碁思考エンジン部分のみなので、グラフィカルに対局や棋譜分析をおこなうためにはGTPを解釈できる囲碁GUIと連携させる必要があります。
たとえば上記の手順どおり、ホームディレクトリ直下の「~/leela-zero」以下に「Leela Zero」をインストールしたとすれば、「/home/username/leela-zero/src/leelaz」(「username」はお使いのユーザ名)が、囲碁GUIに登録するべきGTP思考エンジンへのパスになります。

5-1. GTP対応囲碁GUI「GoGui」への思考エンジン登録
メニューバーの「プログラム」から「新規プログラム」を選び、あらわれた画面の「コマンド:」欄に囲碁思考エンジンの絶対パスを入力します。
たとえば上記の手順どおり、ホームディレクトリ直下の「~/leela-zero」以下に「Leela Zero」をインストールしたとすれば、「コマンド:」欄に入力する絶対パスは「/home/username/leela-zero/src/leelaz」のようになります。
思考エンジン起動時にわたすパラメータはたとえば「--gtp --threads 2 --playouts 1600 --noponder --weights /home/username/leela-zero/best-network」のようなかたちで指定しますが、「--gtp」がGTP対応囲碁GUIから制御するための必須オプション、「--threads」は使用するスレッド数指定、「--playouts」はプレイアウト数指定で大きいほど強くなる(「--playouts」オプション無指定でプレイアウト数無制限)、「--noponder」は相手の手番でも思考する「ponder」機能を使わない(プレイアウト数を指定するときは必須)、「--weights」は利用する学習ずみネットワークファイルを絶対パスで指定、といった意味をもちます。
上記パスとパラメータは、一行にまとめて「コマンド:」欄に記述するので、全体として入力するべきコマンドは「/home/username/leela-zero/src/leelaz --gtp --threads 2 --playouts 1600 --noponder --weights /home/username/leela-zero/best-network」のようになります。
「OK」ボタンを押下して何度か「待機」をクリックしながら待っていると、ステイタスバーに表示されていた「プログラムの開始中」メッセージが消えて新規プログラム登録画面が開くので、「ラベル:」欄にたとえば「Leela Zero」などと入力して「OK」ボタンを押下します。
これで登録完了となるので、次回以降はメニューバーの「プログラム」 -> 「プログラムの起動」とすすんで「Leela Zero」を選ぶと、「Leela Zero」が起動して対局や棋譜分析に利用できるようになります。
登録した囲碁思考エンジン「Leela Zero」と対局するには、「Leela Zero」を起動した状態で、メニューバーの「対局」から「碁盤サイズ」「置石」「コンピュータの手番」を指定したうえで、「新規対局」をクリックします。
検討したい局面を指定して、そこで「Leela Zero」がどう打つかをみることもできます。
「Leela Zero」を起動したあと、メニューバーから「コンピュータの手番」を「なし」にして、どんどん石を置いていって対象となる局面をつくり、黒番の局面なら「Leela Zeroに黒を打たせる」、白番の局面なら「Leela Zeroに白を打たせる」アイコンをクリックします。
そのさい「GTPシェル」を開いておけば、読み筋や評価値も表示されるので、着手の意味を考えるときに参考になります。

5-2. 「Sabaki」への思考エンジン登録
メニューバーの「Engines」から「Manage Engines」を選び、あらわれた画面で「Add」をクリックします。
「(Unnamed Engine)」と表示されている欄にカーソルをもっていって、わかりやすい表示名を、そして「Path」欄に囲碁思考エンジンの絶対パスを入力します。
たとえば上記の手順どおりホームディレクトリ直下の「~/leela-zero」以下に「Leela Zero」をインストールした場合、「(Unnamed Engine)」欄にカーソルをもっていって「Leela Zero」と入力、「Path」欄に絶対パス「/home/username/leela-zero/src/leelaz」を指定します。
その下の「No arguments」と表示されている欄には、思考エンジンに渡してやるパラメータを入力します。
パラメータはたとえば「--gtp --threads 2 --playouts 1600 --noponder --weights /home/username/leela-zero/best-network」のようなかたちで指定しますが、「--gtp」がGTP対応囲碁GUIから制御するための必須オプション、「--threads」は使用するスレッド数指定、「--playouts」はプレイアウト数指定で大きいほど強くなる(「--playouts」オプション無指定でプレイアウト数無制限)、「--noponder」は相手の手番でも思考する「ponder」機能を使わない(プレイアウト数を指定するときは必須)、「--weights」は利用する学習ずみネットワークファイルを絶対パスで指定、といった意味をもちます。
さらにその下の「Initial command (;-separated)」と表示されている欄で、考慮時間の設定などが可能です。
たとえば「持ち時間なし、一手20秒以内で着手」という条件にしたい場合は、ここに「time_settings 0 20 1;」と入力してやればO.K.です。
基本的には、プレイアウト数と考慮時間が強さに影響する要素なので、うまく強さと対局時間のバランスがとれる条件を見つける必要があります。
登録した「Leela Zero」と対局するには、メニューバーの「File」から「New」をクリックします。
開いた画面で「Board Size」「Handicap」「Komi」を指定のうえ、黒番と白番それぞれの担当者を選択します。
自分が担当する手番は「Manual」を選択、「Leela Zero」に担当させる手番は登録されている思考エンジンの表示名から「Leela Zero」を選んで、「OK」ボタンを押下します。
「Sabaki」にほかの囲碁思考エンジンを登録しておいて、「Leela Zero」をほかの思考エンジンと対局させることもできます。
その場合は、対局させる思考エンジンの両方について「ponder」機能を無効化するように設定し、互いの思考をさまたげないかたちで対局をおこなう必要があります。


参考ウェブページ一覧表(順不同)

http://zero.sjeng.org/
https://github.com/gcp/leela-zero
https://github.com/gcp/leela-zero/releases
https://github.com/gcp/leela-zero/issues/1329
posted by hatakazu at 22:54| Comment(0) | 囲碁ソフトのこと | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください