将棋エンジンAperyをCentOS7.1でビルドする

apery-l.png
 
将棋エンジンAperyをCentOS7.1でビルドする手順を記載します。

(本記事の続編として、将棋所(GUIソフト)の動作環境(Mono)をインストールし、Aperyを登録して対局する手順を公開予定です。)
⇒続編書きました
CentOS7.1で将棋GUIソフト「将棋所」を動作させる



公式ドキュメント


http://hiraokatakuya.github.io/apery/ に各種ドキュメントが公開されています。
 

コンパイラのバージョン確認


g++ 4.8が必要です。

[loft@hoge ~]$ g++ --version
g++ (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

[loft@hoge ~]$

g++が入っていない、もしくはバージョンが4.8未満の場合はインストールして下さい。
CentOS6.7にg++4.8をインストールする手順を、以下記事に記載しています。
CentOS6.7にgcc、g++ 4.8をインストールする
 

ソースコードの入手


githubから入手します。

[loft@hoge ~]$ cd /home/loft/apery/git/
[loft@hoge git]$ git clone https://github.com/HiraokaTakuya/apery.git
[loft@hoge git]$ cd ./apery/
[loft@hoge apery]$ ls -al
total 64
drwxrwxr-x. 7 loft loft  4096 Nov  9 21:34 .
drwxrwxr-x. 3 loft loft    18 Nov  9 21:32 ..
drwxrwxr-x. 2 loft loft    49 Nov  9 21:36 bin
-rw-rw-r--. 1 loft loft 35147 Nov  9 21:33 Copying.txt
drwxrwxr-x. 8 loft loft  4096 Nov  9 21:33 .git
-rw-rw-r--. 1 loft loft    87 Nov  9 21:33 .gitmodules
drwxrwxr-x. 2 loft loft  4096 Nov  9 21:35 obj
-rw-rw-r--. 1 loft loft  5454 Nov  9 21:33 Readme.txt
drwxrwxr-x. 2 loft loft  4096 Nov  9 21:35 src
drwxrwxr-x. 6 loft loft    72 Nov  9 21:33 utils
[loft@hoge apery]$

なお、今回ビルドしたバージョンは以下よりハッシュ値685720d3204527ae3848b206310663bde64745c6です。

[loft@hoge apery]$ git log
commit 685720d3204527ae3848b206310663bde64745c6
Author: HiraokaTakuya <hiraoka64@gmail.com>
Date:   Sat Aug 29 11:34:08 2015 +0900

    △7八角対策

commit 9da6354be5e580a03b8d8c55095ff8ee6eab2314
Author: HiraokaTakuya <hiraoka64@gmail.com>
Date:   Tue Aug 11 00:46:08 2015 +0900

    searchmoves 対応

commit 18090bd93cec284f37b27e6ccd1d314692647079
Author: HiraokaTakuya <hiraoka64@gmail.com>
Date:   Tue Aug 11 00:09:49 2015 +0900

    比較順序変更による高速化

 

ビルド


srcディレクトリに移動しmakeコマンドでビルドします。

[loft@hoge apery]$ cd ./src/
[loft@hoge src]$ make
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/main.o -c main.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/bitboard.o -c bitboard.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/init.o -c init.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/mt64bit.o -c mt64bit.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/position.o -c position.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/evalList.o -c evalList.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/move.o -c move.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/movePicker.o -c movePicker.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/square.o -c square.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/usi.o -c usi.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/generateMoves.o -c generateMoves.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/evaluate.o -c evaluate.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/search.o -c search.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/hand.o -c hand.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/tt.o -c tt.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/timeManager.o -c timeManager.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/book.o -c book.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/benchmark.o -c benchmark.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/thread.o -c thread.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/common.o -c common.cpp
g++ -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp  -o ../obj/pieceScore.o -c pieceScore.cpp
g++ -o apery ../obj/main.o ../obj/bitboard.o ../obj/init.o ../obj/mt64bit.o ../obj/position.o ../obj/evalList.o ../obj/move.o ../obj/movePicker.o ../obj/square.o ../obj/usi.o ../obj/generateMoves.o ../obj/evaluate.o ../obj/search.o ../obj/hand.o ../obj/tt.o ../obj/timeManager.o ../obj/book.o ../obj/benchmark.o ../obj/thread.o ../obj/common.o ../obj/pieceScore.o -lpthread  -std=c++11 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fopenmp
[loft@hoge src]$

make完了後、実行ファイル(apery)が生成されたことを確認します。

[loft@hoge src]$ ls -al
total 984
drwxrwxr-x. 2 loft loft   4096 Nov  9 21:35 .
drwxrwxr-x. 7 loft loft   4096 Nov  9 21:34 ..
-rwxrwxr-x. 1 loft loft 463585 Nov  9 21:35 apery
             ( : 略 )

AperyをCentOS7.1でビルドする手順は以上です。
続いて、動作確認手順を記載します。

*_synthesized.binの準備


実行ファイルは/apery/bin/配下にコピーしておきます。

[loft@hoge src]$ cp ./apery ../bin/

Readme.txtに記載されているように、bin/配下に*_synthesized.binがない場合、
エンジンの起動に時間がかかります。

以下のようにエンジンを起動後、”info string start setting eval table”と表示される場合は、
エンジン起動からUSIプロトコルの通信ができるようになるまで数分かかる状態です。
この状態のまま将棋所にエンジンとして登録しようとするとエンジンとの通信ができないため失敗します。
(「これは USI エンジンではありません。」とダイアログが出る)。
エンジン起動後すぐにUSIプロトコルの通信ができるよう、予め*_synthesized.binを準備しておく必要があります。

[loft@hoge apery]$ cd /home/loft/apery/git/apery/bin/
[loft@hoge bin]$ ./apery
info string start setting eval table
     (数分かかる)
info string end setting eval table
     (ここまで処理が進むとUSIプロトコル文字列の入出力が可能となる。
      上記処理をスキップさせるために*_synthesized.binの準備が必要。)

*_synthesized.binの準備方法はいくつかありそうです。
(より適切な方法がありましたら是非コメント欄にてご指摘宜しくお願い致します。)

方法1 WCSC25 versionのzipに入っているファイルを使う

http://hiraokatakuya.github.io/apery/から、WCSC25 version (for Windows 64bit)のzipファイル(apery_wcsc25.zip)をダウンロードし、任意のディレクトリに格納、解凍します。

[loft@hoge bin]$ cd /home/loft/apery/
[loft@hoge apery]$ unzip apery_wcsc25.zip

apery_wcsc25.zipを解凍したディレクトリのbin/配下に20150501というフォルダがありますので、
今回ソースコードからビルドした実行ファイル(bin/apery)のあるbin/配下にコピーします。

[loft@hoge apery]$ cp ./apery_wcsc25/bin/20150501/ ./git/apery/bin/ -rfp
[loft@hoge apery]$ cd .git/apery/bin/
[loft@hoge bin]$ ls -al
total 464
drwxrwxr-x. 3 loft loft     64 Nov  9 23:51 .
drwxrwxr-x. 7 loft loft   4096 Nov  9 21:34 ..
drwxrwxr-x. 2 loft loft     83 May  6  2015 20150501
-rwxrwxr-x. 1 loft loft 463585 Nov  9 23:05 apery
[loft@hoge bin]$

20150501というディレクトリ名は、*_synthesized.bin格納ディレクトリ名のデフォルト値として定義されているようです。
この状態でエンジンを起動します。
今度はすぐにUSIプロトコルの入出力が可能な状態になっていますので、
以下のようにusiと入力すると、エンジンがusiokと出力します。

[loft@hoge apery]$ cd /home/loft/apery/git/apery/bin/
[loft@hoge bin]$ ./apery
usi
id name Apery Debug Build
id author Hiraoka Takuya

option name Best_Book_Move type check default false
option name Book_File type string default book/20150503/book.bin
option name Byoyomi_Margin type spin default 500 min 0 max 2147483647
option name Clear_Hash type button
option name Emergency_Base_Time type spin default 200 min 0 max 30000
option name Emergency_Move_Horizon type spin default 40 min 0 max 50
option name Emergency_Move_Time type spin default 70 min 0 max 5000
option name Eval_Dir type string default 20150501
option name Max_Book_Ply type spin default 32767 min 0 max 32767
option name Max_Random_Score_Diff type spin default 0 min 0 max 32600
option name Max_Random_Score_Diff_Ply type spin default 40 min 0 max 32767
option name Max_Threads_per_Split_Point type spin default 5 min 4 max 8
option name Min_Book_Ply type spin default 32767 min 0 max 32767
option name Min_Book_Score type spin default -180 min -32601 max 32601
option name Minimum_Thinking_Time type spin default 1500 min 0 max 2147483647
option name MultiPV type spin default 1 min 1 max 594
option name OwnBook type check default true
option name Skill_Level type spin default 20 min 0 max 20
option name Slow_Mover type spin default 100 min 10 max 1000
option name Threads type spin default 1 min 1 max 64
option name Use_Sleeping_Threads type check default false
option name USI_Hash type spin default 32 min 1 max 65536
option name USI_Ponder type check default true
option name Write_Synthesized_Eval type check default false
usiok

この状態ならばエンジン起動後すぐにUSIプロトコルの入出力ができていますので、
将棋所にエンジンとして登録することができます。

方法2 WCSC25 versionのzipに入っているスクリプトを使う

こちらは当ブログ管理人は未確認の方法です。
apery_wcsc25.zipを解凍したディレクトリのbin/配下にmake_synthesized_eval.shというスクリプトがあり、
今回ソースコードからビルドした実行ファイル(bin/apery)のあるbin/配下にコピーします。
chmod +xで実行権を付与し、実行すると、恐らく*_synthesized.binファイルが生成されるものと思われます。
 

将棋所を使用した対局や棋譜解析


対局や棋譜解析を行うには、将棋所のようなUSIプロトコルに対応したGUIソフトに
今回ビルドした実行ファイル(bin/apery)をエンジンとして登録する必要があります。
また、将棋所をCentOSで動作させるためにMonoのインストールも必要です。
次回の記事に手順を記載します。
⇒続編書きました
CentOS7.1で将棋GUIソフト「将棋所」を動作させる

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です