使い方
(準備中)
#index
これは何? †
USIプロトコルに対応したプログラムを少し改変したクライアントをsshで複数起動して、手分けして探索を行うための枠組み。
参考:
準備 †
推奨環境: (vmware等でも可) †
- Ubuntu 10.04 以降
- Debian squeeze 以降
- それ以外の場合
- perl v5.10.1 以降 (usi.plを動かす機器1台のみ)
- gpsusi をコンパイルできる環境(g++4.3以降推奨、boost 1.38以降推奨)
GPS将棋(gpsusi)の準備 †
- ツールのインストール
sudo apt-get install g++ libboost-xxx.dev (xxxは可能なパッケージで一番新しいもの) libcppunit-dev
- ダウンロード
- おまじない
(cd osl; ln -s ../gpsshogi/data)
- コンパイル (逐次版)
n=コアの数
(cd osl/lib/third_party/tcmalloc-0.93; make -j $n)
(cd osl/release; make -j $n)
(cd gpsshogi/bin; make -j $n gpsusi RELEASE=t)
- 実行
./gpsshogi/bin/gpsusi --benchmark
ステップ1: gpsusiを用いた分散探索 †
- cd gpsshogi/sample/perl-cluster
- config を編集 (config.sample あり)
- #がコメント
- 1行目が、定跡や合法手生成等の思考以外の機能のためのコマンド
- 2行目以降に思考を行うslaveの指定 (速さが異なる場合は速い順を想定)
たとえば、 /path/to/gpsusi を3行ほど書いておくと、2並列で探索します。
- 起動 ./usi.pl -c config
usi.pl が(一部の機能のみに対応した)USIエンジンとしてふるまいます
usi
isready
position startpos
go infinite
stop
quit
等
- debug
log 以下に、各slaveとのやりとりの記録がファイルに残されます。
サーバのログはstderr に出ますが、一部は log/job_queue.txt に書かれます。
(ファイル名は歴史的なもので内容はqueueとは関係ありません)
ステップ2: 探索部分を自作プログラムに置き換える †
configの1行目をgpsusiにしたまま2行目以降を自作プログラムを指定すると、基本的に自作プログラムでの探索となる。
必要な機能:
- stop がいつ来ても複数来ても対応する (bestmoveとgoの回数を比較して、goの方が多い場合だけとまる)
- echo 文字列
に対して、渡された文字列を標準出力に出力する (keep aliveやログの区切りのため)
探索中でも応える必要がある。応答が2.5秒遅れると通信が切れたとみなされて探索から切り離される。
他のinfo pv等の出力と途中で混ざらない用な仕組み(例えばロック)が必要
- ignore_moves 文字列
文字列で渡された指手を無視して探索する。ignore_moves 7g7f 2g2f などのように指し手が複数の場合は空白で区切られて一行で表現される。
position の指定の後に最大一回与えられる。
新たなpositionを与えられたり一度goが行わればその後は無効。
- go byoyomi msec
msecミリ秒だけ探索し、bestmoveを返す
- go mate msec
msecミリ秒だけ詰みを探索し、checkmate を返す (現在のusi.plでは未使用)
対応しない場合は常に checkmate nomateを返せばよい。
ステップ3: すべてを自作プログラムに置き換える †
configの1行目を置き換えると、gpsusiを完全に排除した分散探索となる。1行目の担当は、定跡、合法手生成、勝ち宣言など
- go book
定跡があれば、その手をbestmove コマンドで返す。なければbestmove passを返す。
- go declarewin
%KACHIを指すべき状況であれば、bestmove winを返す。そうでなければbestmove passを返す。
- genmove_probability
指し手を実現確率とともに生成する。現在は確率としては使われず、指し手の探索すべき順序の予想のみに用いられるので、評価値順等適当で良い。
genmove_probability
genmove_probability 3b4b 100 4c4d 186 3b2b 186
等、指し手と数値(小さいほど良い手)を空白で区切って一行で返す。
合法手がない場合や1手のみの局面は特別な処理がなされるので、打ち不詰めや王手千日手の反則負け等を考慮して合法手のみを出力する必要がある。数値は正の整数が望ましい。
具体的な使われ方は、splitすべき有力な指し手を1秒の探索で決める際に、現在利用可能なslaveの数nだけ並列に探索するが、
- 親の探索での最善応手手順で対応するものに一つのslave
- 確率順に上位n-2個のslave
- 「その他」に1つのslave
と割り当てる。
使い方 †
問題を解く †
./usi.pl -f problems/001.usi
shogi-server でyowai_gpsと対戦 †
./csa2usi.pl --csa_host wdoor.c.u-tokyo.ac.jp --usi_engine "./usi.pl" --csa_id your_name --csa_pw yowai_gps-1500-0 --sec_limit=1500 --sec_limit_up=0
- 歩の値を1000にした場合は--pawn_value=100等
(後日記述追加予定)