2018年07月22日

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

「PhoenixGo」は、Tencent社が開発しオープンソース化した、自己対戦による深層学習の手法にもとづくコンピュータ囲碁プログラムです。
2018年1月にTencent社の囲碁対局プラットフォーム「野狐」で「BensonDarrz」という名前で打ちはじめましたが、同4月に「世界囲碁AIトーナメント2018」で優勝してより広く知られるようになった、とのことです。

「PhoenixGo」GitHubレポジトリ
・Linuxバイナリ配布なし、ソースからコンパイル必須。
・64bit対応。
・GPUバージョンおよびCPUバージョン。

関連記事
Tencent unveils China's first open source Go AI, made on spare WeChat server processing power

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) + 1TB 5400rpm HDD (Ubuntu18.04)
--

「PhoenixGo」の動作要件は、「PhoenixGo」GitHubレポジトリの記述によれば、以下のようになっています。

・GCC with C++11 support
・Bazel (0.11.1 is known-good)
・(Optional) CUDA and cuDNN (for GPU support)
・(Optional) TensorRT (for accelerating computation on GPU, 3.0.4 is known-good)

「PhoenixGo」はGoogle開発の機械学習フレームワーク「TensorFlow」を利用しており、おなじくGoogle開発のビルドツール「Bazel」をもちいて、「TensorFlow」ソースからビルドする仕組みになっています。
「TensorFlow」を「CUDA」と連携させることで、GPUバージョン「PhoenixGo」をビルドすることができ、GPU演算の高速化のために「TensorRT」を使うオプションもあります。
ここでは、推奨されている「Bazel 0.11.1」インストールずみ、GPU対応としては「CUDA 9.0」+「cuDNN 7.0」+「NCCL 2.1」環境構築ずみ、推奨されている「TensorRT 3.0.4」インストールずみ(オプション)として、「Ubuntu 18.04 LTS 日本語 Remix」に「PhoenixGo」をインストールする手順について記述していきます。
「TensorFlow」ソースについては、「PhoenixGo」ビルド処理のなかで「TensorFlow 1.8.0」が自動的にダウンロードされるので、特別になにか準備する必要はありません。

*****「gcc-4.8」「g++4.8」の準備*****
(必要な環境がすでに構築されている場合、もしくはCPUバージョンを使う場合は、このセクションは無視して先へすすんでください。)

Ubuntu18.04標準の「gcc-7」では、GPU版「TensorFlow」をソースからビルドすることはできず、かわりに「gcc-4.8」を使う必要があります。
そのため、「gcc-4.8」「g++-4.8」をインストールのうえ「update-alternatives」コマンドを使って「gcc-7」「g++-7」より優先順位をあげて、一時的に自動モードで「gcc-4.8」「g++-4.8」が使われるように設定します。

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 70

$ sudo apt-get install gcc-4.8 g++-4.8

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 80
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 80


なお「gcc-4.8」でビルドするさいには、エディタで「/usr/include/x86_64-linux-gnu/c++/4.8/bits/c++config.h」ファイルをひらいて、以下の二行を追加しておきます。

#define _GLIBCXX_USE_C99 1
#define _GLIBCXX_USE_C99_MATH 1


上記はGPU版「TensorFlow」をソースからインストールするさいに必要な特殊設定なので、「PhoenixGo」のインストール作業が終わったら「gcc-4.8」「g++-4.8」の優先順位をさげて、自動モードでシステム標準の「gcc-7」「g++-7」が使われるように設定をもどしておきます。

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 48
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 48


最終的に、「PhoenixGo」インストールまえにととのえた環境は、以下のようになっています。

・Ubuntu 18.04 LTS 日本語 Remix
・CUDA 9.0 -> /usr/local/cuda-9.0
・cuDNN 7.0.5 -> /usr/lcoal/cuda-9.0
・NCCL 2.1.15 -> /usr/local/nccl-2.1
・TensorRT 3.0.4 -> /usr/local/TensorRT-3.0.4(オプション)
・Bazel 0.11.1
・TensorFlow 1.8.0 -> 「PhoenixGo」インストール過程で自動的にダウンロードされる。
・GCC 4.8

2. 「PhoenixGo」インストールの準備とソースの取得
「PhoenixGo」の現行バージョンは「v1」で、「PhoenixGo」GitHubレポジトリでソースが公開されています。
「PhoenixGo」のCPUバージョンをビルドするなら、「TensorFlow」をソースからビルドするための「Bazel」ツールがインストールされていること、GPUバージョンをビルドするなら、それにくわえてGPU対応として「CUDA 9.0」+「cuDNN 7.0」+「NCCL 2.1」環境構築、GPU演算高速化のため「TensorRT 3.0.4」インストール(オプション)、「gcc-4.8」設定が完了していることを確認します。
今回はホームディレクトリに「PhoenixGo」ディレクトリを作成し、そこにソースをダウンロードして、インストール作業をすすめることにします。

$ cd
$ git clone https://github.com/Tencent/PhoenixGo
$ cd PhoenixGo


以上で、「PhoenixGo」のソースを「PhoenixGo」ディレクトリにダウンロードし、インストール作業をすすめる準備がととのいました。

3. 「PhoenixGo」のインストール
まずは「TensorFlow」の設定を実行します。

$ ./configure


Pythonのバージョンとライブラリのパスを指定したあと、たくさん質問がつづきますが、以下の項目だけはしっかりと確認してください。

・CPUバージョン:「jemalloc」と「XLA」を有効化する。
・GPUバージョン:「CUDA」サポートを有効化し、「CUDA 9.0 /usr/local/cuda-9.0」「cuDNN 7.0 /usr/local/cuda-9.0」「NCCL 2.1 /usr/local/nccl-2.1」「TensorRT 3.0.4 /usr/local/TensorRT-3.0.4」のバージョンとパスを指定する。

上記の設定が終わったら、「PhoenixGo」ビルド処理にすすみます。

・CPUバージョン:「--config=opt」スイッチを指定してビルド。
$ bazel build --config=opt //mcts:mcts_main


・GPUバージョン:「--config=opt」「--config=cuda」スイッチを指定してビルド。
$ bazel build --config=opt --config=cuda //mcts:mcts_main


ビルド処理が終わったら、公開されている学習ずみネットワークを「PhoenixGo」ディレクトリにダウンロードのうえ解凍してから、「PhoenixGo」を走らせてみます。

$ wget https://github.com/Tencent/PhoenixGo/releases/download/trained-network-20b-v1/trained-network-20b-v1.tar.gz
$ tar xvzf trained-network-20b-v1.tar.gz
$ scripts/start.sh


CPUバージョン起動時に出るメッセージ。
current directory: '/home/username/PhoenixGo'
mcts_main wasn't built with CUDA support
mcts_main wasn't built with TensorRT support
use config file 'etc/mcts_cpu.conf'
log to '/home/username/PhoenixGo/log'
start mcts_main
XXXX-XX-XX XX:XX:XX.XXXXXX: I model/zero_model.cc:72] Read checkpoint state succ
XXXX-XX-XX XX:XX:XX.XXXXXX: I model/zero_model.cc:80] Read meta graph succ
XXXX-XX-XX XX:XX:XX.XXXXXX: I model/zero_model.cc:100] Create session succ
XXXX-XX-XX XX:XX:XX.XXXXXX: I model/zero_model.cc:107] Create graph succ
XXXX-XX-XX XX:XX:XX.XXXXXX: I model/zero_model.cc:119] Load checkpoint succ


GPUバージョン起動時に出るメッセージ。「CUDA」「TensorRT」が有効化され、GPUが検出されている。
mcts_main was built with CUDA support
mcts_main was built with TensorRT support
found 1 GPU(s)
use config file 'etc/mcts_1gpu.conf'
log to '/home/username/PhoenixGo/log'
start mcts_main


上のようなメッセージが出れば、ビルドは正常に完了しています。

4. 「PhoenixGo」の設定
GPUを一個搭載したコンピュータでGPUバージョン(「TensorRT」有効)を動かす場合は「PhoenixGo」ディレクトリの「etc/mcts_1gpu.conf」ファイルが、CPUバージョンの場合は「PhoenixGo」ディレクトリの「etc/mcts_cpu.conf」ファイルが、「PhoenixGo」の動作条件を制御する設定ファイルとなっています。
「PhoenixGo」起動コマンドを「$ scripts/start.sh etc/mcts_1gpu.conf」のようにして、明示的に設定ファイルを渡すこともできるし、各種パラメータを指定して直接「bazel-bin/mcts/mcts_main」を起動してもO.K.です。
以下に、編集する可能性のある項目だけ抜き出して、各項目の意味と設定方法を記述します。

num_eval_threads: 1 # 使用するGPUの個数。
num_search_threads: 4 # 「num_eval_threads」と「eval_batch_size」をかけた値よりもちょっと大きい値に設定するらしい。
timeout_ms_per_step: 10000 # 一手ごとの考慮時間をミリ秒で指定。
max_simulations_per_step: 0 # 一手ごとのシミュレーション数。「0」で無指定。
gpu_list: "0" # 使用するGPUの認識番号をコンマで区切って登録。CPUバージョンの設定ファイルには行じたい存在しない。
model_config -> train_dir: "pkct" # 学習ずみネットワークが保管されているフォルダを指定。
max_search_tree_size: # ツリーノードの最大サイズ。メモリ容量によって指定する。
max_children_per_node: # 各ノードがもてる子ノードの最大サイズ。メモリ容量によって指定する。
enable_background_search: 0 # 「ponder」機能を使うときは「1」、使わないときは「0」に設定。
early_stop -> enable: 0 # 勝敗が確定してしまったあとはすぐに打つ。一定ペースで打たせたいときは「0」に設定。
unstable_overtime -> enable: 0 # 次の手が確定しないときは余計に考える。一定ペースで打たせたいときは「0」に設定。
behind_overtime -> enable: 0 # 形成がよくないときは余計に考える。一定ペースで打たせたいときは「0」に設定。
time_control -> enable: 0 # GTPコマンド「time_settings」への対応。一定ペースで打たせたいときは「0」に設定。


5. GTP対応囲碁GUIとの連携方法
「PhoenixGo」として公開されているのはGUIをもたない囲碁思考エンジン部分のみなので、グラフィカルに対局や棋譜分析をおこなうためにはGTPを解釈できる囲碁GUIと連携させる必要があります。
「PhoenixGo」ディレクトリをたとえば「~/PhoenixGo」に設置したとして、「/home/username/PhoenixGo/start.bat」が、囲碁GUIに登録するべきGTP思考エンジンのパスになります。

5-1. GTP対応囲碁GUI「GoGui」への思考エンジン登録
メニューバーの「プログラム」から「新規プログラム」を選び、あらわれた画面の「コマンド:」欄に囲碁思考エンジンの絶対パスを入力します。
たとえば「PhoenixGo」ディレクトリを「~/PhoenixGo」に設置した場合、「コマンド:」欄に入力する絶対パスは「/home/username/PhoenixGo/start.bat」のようになります。
「OK」ボタンを押下して何度か「待機」をクリックしながら待っていると、ステイタスバーに表示されていた「プログラムの開始中」メッセージが消えて新規プログラム登録画面が開くので、「ラベル:」欄にたとえば「PhoenixGo」などと入力して「OK」ボタンを押下します。
これで登録完了となるので、次回以降はメニューバーの「プログラム」 -> 「プログラムの起動」とすすんで「PhoenixGo」を選ぶと、「PhoenixGo」が起動して対局や棋譜分析に利用できるようになります。
登録した囲碁思考エンジン「PhoenixGo」と対局するには、「PhoenixGo」を起動した状態で、メニューバーの「対局」から「碁盤サイズ」「置石」「コンピュータの手番」を指定したうえで、「新規対局」をクリックします。
検討したい局面を指定して、そこで「PhoenixGo」がどう打つかをみることもできます。
「PhoenixGo」を起動したあと、メニューバーから「コンピュータの手番」を「なし」にして、どんどん石を置いていって対象となる局面をつくり、黒番の局面なら「PhoenixGoに黒を打たせる」、白番の局面なら「PhoenixGoに白を打たせる」アイコンをクリックします。
そのさい「GTPシェル」を開いておけば、読み筋や評価値も表示されるので、着手の意味を考えるときに参考になります。

5-2. 「Sabaki」への思考エンジン登録
メニューバーの「Engines」から「Manage Engines」を選び、あらわれた画面で「Add」をクリックします。
「(Unnamed Engine)」と表示されている欄にカーソルをもっていって、わかりやすい表示名を、そして「Path」欄に囲碁思考エンジンの絶対パスを入力します。
たとえば「PhoenixGo」ディレクトリを「~/PhoenixGo」に設置した場合、「(Unnamed Engine)」欄にカーソルをもっていって「PhoenixGo」と入力、「Path」欄に絶対パス「/home/username/PhoenixGo/start.bat」を指定します。
登録した「PhoenixGo」と対局するには、メニューバーの「File」から「New」をクリックします。
開いた画面で「Board Size」「Handicap」「Komi」を指定のうえ、黒番と白番それぞれの担当者を選択します。
自分が担当する手番は「Manual」を選択、「PhoenixGo」に担当させる手番は登録されている思考エンジンの表示名から「PhoenixGo」を選んで、「OK」ボタンを押下します。
「Sabaki」にほかの囲碁思考エンジンを登録しておいて、「PhoenixGo」をほかの思考エンジンと対局させることもできます。
その場合は、対局させる思考エンジンの両方について「ponder」機能を無効化するように設定し、互いの思考をさまたげないかたちで対局をおこなう必要があります。


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

https://github.com/Tencent/PhoenixGo
https://github.com/Tencent/PhoenixGo/releases
https://qiita.com/take-iwiw/items/0bf12bec9c3bade2e331
https://stackoverflow.com/questions/50213089/linking-error-with-gcc-g-7-3-0-on-ubuntu-18-04/50232797
posted by hatakazu at 15:32| Comment(0) | 囲碁ソフトのこと | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください