2018年08月09日

コンピュータ囲碁プログラム「FLE OpenGo」のインストールと使いかたの変更点

Facebookがオープンソース化しているコンピュータ囲碁プログラム「ELF OpenGo」について、インストール手順と使いかたにいくつか変更がありました。

a) 「PyTorch」バイナリインストール環境で動作可能に
「ELF OpenGo」はおなじFacebookが開発している機械学習ライブラリ「PyTorch」に依存していますが、「ELF OpenGo」がオープンソース化された当時の最新版「PyTorch 0.4.0」バイナリには必要な機能がふくまれていなかったため、「ELF OpenGo」を動作させるためには「PyTorch」をソースからインストールするか、あるいは「PyTorch Nightly Build」をインストールするかしないといけませんでした。
しかしこのたび、「PyTorch 0.4.1」以降の「PyTorch」バイナリをインストールすることで、「ELF OpenGo」を動作させることが可能になりました。
そのため、別途「PyTorch」をソースからインストールするか「 Nightly Build」バイナリをインストールするかしていた作業が不要になり、今後は標準の「PyTorch」バイナリインストール環境でそのまま「ELF OpenGo」を走らせることができるようになりました。

b) 「ELF OpenGo」学習ずみネットワークの更新
「ELF OpenGo」学習ずみネットワーク更新版が、オープンソース化された当初いっしょに公開されたオリジナルの「v0」におよそ25万ミニバッチを追加してじゃっかんの微調整をくわえたかたちで、「v1」として公開されていました。
そのため、これまで「pretrained-go-19x19-v0.bin」と記述していた部分を「pretrained-go-19x19-v1.bin」に変更することで、学習ずみネットワーク更新版を使って「ELF OpenGo」を動かすことができるようになります。

上記の変更点を反映すると、現時点で「ELF OpenGo」をインストールのうえ、GTP対応囲碁GUI「GoGui」で動かす方法は、以下のように記述されることになります。
これまでの「ELF OpenGo」を動作させるのとおなじ要件(「CUDA 9.0」+「cuDNN 7.0」+「NCCL 2.1」、「Anaconda3」環境)は、あらかじめ満たしているものとします。

1. 「ELF OpenGo」インストールの準備
「Python 3.6」仮想環境「pytorch」を作成、有効化したうえで、「ELF OpenGo」インストールのために必要とされるライブラリをインストールしていきます。

$ sudo apt-get install cmake g++ gcc libboost-all-dev libzmq3-dev
$ conda create --name pytorch python=3.6
$ conda activate pytorch
(pytorch) $ conda install numpy zeromq pyzmq


別途「PyTorch」バイナリをインストールします。

・CPU版「PyTorch」バイナリのインストール
(pytorch) $ conda install --channel pytorch pytorch-cpu


・GPU版「PyTorch」バイナリのインストール
(pytorch) $ conda install --channel pytorch pytorch cuda90


2. 「ELF OpenGo」ソースの取得とビルド
ここでは、「~/ELF」ディレクトリにソースを取得のうえ、ビルドしていきます。

(pytorch) $ cd
(pytorch) $ git clone https://github.com/pytorch/ELF
(pytorch) $ cd ELF
(pytorch) $ git submodule sync && git submodule update --init --recursive
(pytorch) $ make
(pytorch) $ make test


3. 学習ずみネットワーク更新版の取得
あらかじめパスをとおすためのスクリプトを実行したうえで、「gtp.sh」スクリプトがある「~ELF/scripts/elfgames/go」ディレクトリへ移動し、そこに学習ずみネットワーク更新版をダウンロードします。

(pytorch) $ source scripts/devmode_set_pythonpath.sh
(pytorch) $ cd scripts/elfgames/go
(pytorch) $ wget https://github.com/pytorch/ELF/releases/download/pretrained-go-19x19-v0/pretrained-go-19x19-v1.bin


4. 「ELF OpenGo」起動
ここまでの準備が終わったら、以下のコマンドをたたいて、「ELF OpenGo」を走らせてみます。

・CPUバージョン
(pytorch) $ ./gtp.sh ./pretrained-go-19x19-v1.bin --verbose --num_block 20 --dim 224 --mcts_puct 1.50 --batchsize 16 --mcts_rollout_per_batch 16 --mcts_threads 2 --mcts_rollout_per_thread 256 --resign_thres 0.05 --mcts_virtual_loss 1


・GPUバージョン
(pytorch) $ ./gtp.sh ./pretrained-go-19x19-v1.bin --verbose --gpu 0 --num_block 20 --dim 224 --mcts_puct 1.50 --batchsize 16 --mcts_rollout_per_batch 16 --mcts_threads 2 --mcts_rollout_per_thread 1024 --resign_thres 0.05 --mcts_virtual_loss 1


5. 「GoGui」と連携させる設定
以下の内容を記述したスクリプトを作成してそれを「~/ELF/scripts/elfgames/go/ELF-OpenGo.sh」として保存、実行権限を付与したうえで「GoGui」の新規プログラム画面で「/home/username/ELF/scripts/elfgames/go/ELF-OpenGo.sh」コマンドを指定してやれば、「ELF OpenGo」学習ずみネットワーク更新版を「GoGui」経由で利用できるようになります。
この場合でも、「PyTorch」がインストールされている仮想環境から「GoGui」を起動する、という点には注意が必要です。
「ELF OpenGo」のふるまいを変更したい場合、この「ELF-OpenGo.sh」スクリプトの「--mcts_rollout_per_thread」の値を編集することで、考慮時間を調節したりできるようになります。

#!/bin/bash
cd /home/username/ELF/
source scripts/devmode_set_pythonpath.sh
cd /home/username/ELF/scripts/elfgames/go/
./gtp.sh ./pretrained-go-19x19-v1.bin --verbose --gpu 0 --num_block 20 --dim 224 --mcts_puct 1.50 --batchsize 16 --mcts_rollout_per_batch 16 --mcts_threads 2 --mcts_rollout_per_thread 1024 --resign_thres 0.05 --mcts_virtual_loss 1

※CPUバージョン「ELF OpenGo」の場合は、「--gpu 0」を削除し、考慮時間短縮のために「--mcts_rollout_per_thread」の値を非常にちいさく(たとえば「256」など)設定します。


参考:「ELF OpenGo」学習ずみネットワーク更新版を「Leela Zero」で使う
作業用ディレクトリに「ELF OpenGo」学習ずみネットワーク更新版と変換スクリプトをダウンロードし、「ELF OpenGo」学習ずみネットワーク更新版を「Leela Zero」で利用できる形式に変換します。

$ wget https://github.com/pytorch/ELF/releases/download/pretrained-go-19x19-v0/pretrained-go-19x19-v1.bin
$ wget https://github.com/gcp/leela-zero/blob/master/training/elf/elf_convert.py
$ ./elf_convert.py pretrained-go-19x19-v1.bin


上記の処理により作業用ディレクトリに「elf_converted_weights.txt」が生成しているので、「ELF-network-v1」のようにわかりやすい名前をつけて、「Leela Zero」から利用しやすい場所(たとえば「~/leela-zero」ディレクトリなど)へ移動しておきます。
あとは、「Leela Zero」起動時に「--weights ~/leela-zero/ELF-network-v1」のようにして、この学習ずみネットワークを使うようにパラメータ指定すればO.K.です。


posted by hatakazu at 20:26| Comment(0) | 囲碁ソフトのこと | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください