[[使い方]] (準備中) #contents * これは何? [#q48143b4] USIプロトコルに対応したプログラムを少し改変したクライアントをsshで複数起動して、手分けして探索を行うための枠組み。 参考: - http://www.graco.c.u-tokyo.ac.jp/~kaneko/papers/IPSJ-GPWS2010024-1.pdf - http://www.graco.c.u-tokyo.ac.jp/~kaneko/papers/gpw2010-slide.pdf * 準備 [#f5d21cae] ** 推奨環境: (vmware等でも可) [#ie34aa28] - Ubuntu 10.04 以降 - Debian squeeze 以降 - それ以外の場合 -- perl v5.10.1 以降 (usi.plを動かす機器1台のみ) --- ソースコードからビルドする場合はthreadを有効にする必要あり -- gpsusi をコンパイルできる環境(g++4.3以降推奨、boost 1.38以降推奨) ** GPS将棋(gpsusi)の準備 [#t929860d] + ツールのインストール sudo apt-get install g++ libboost-xxx.dev (xxxは可能なパッケージで一番新しいもの) libcppunit-dev + ダウンロード -- http://gps.tanaka.ecc.u-tokyo.ac.jp/cgi-bin/viewvc.cgi/trunk/osl.tar.gz?view=tar -- http://gps.tanaka.ecc.u-tokyo.ac.jp/cgi-bin/viewvc.cgi/trunk/gpsshogi.tar.gz?root=gpsshogi&view=tar -- gzip -d < osl.tar.gz | tar xvf - -- gzip -d < gpsshogi.tar.gz | tar xvf - (同じディレクトリ内に兄弟で展開すると便利) +おまじない (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を用いた分散探索 [#za5cccbc] + 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とは関係ありません) -- io-0.txt が雑要用のスレーブの入出力。io-1.txt 移行が探索用スレーブの入出力。 * ステップ2: 探索部分を自作プログラムに置き換える [#g97b406d] configの1行目をgpsusiにしたまま2行目以降を自作プログラムを指定すると、基本的に自作プログラムでの探索となる。ステップ1で動かした時のio-1.txtと同じ文法で応答できればOK. 対応が必要な入力: - position USI通り - 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を返す。bestmoveを返す前にinfo pvを出力する。また、合法手が一手だけでも、探索して評価値を出力する必要がある。 - go infinite: stopが来るまで探索する。 - go mate msec: msecミリ秒だけ詰みを探索し、checkmate を返す (現在のusi.plでは未使用) 対応しない場合は常に checkmate nomateを返せばよい。 期待される出力: - info -- bestmoveが更新されたらpvを評価値等とともに出力する info depth 6 score cp 903 nodes 59044 pv 4b4c -- 1秒に1回程度ノード数等を出力する info time 827324090 nodes 411790 nps 406907 - bestmove move -- moveは最善手。何を指しても詰みの時と、合法手がない時はresign * ステップ3: すべてを自作プログラムに置き換える [#d1acc824] configの1行目を置き換えると、gpsusiを完全に排除した分散探索となる。1行目の担当は、定跡、合法手生成、勝ち宣言など。ステップ1で動かした時のio-0.txtと同じ文法で応答できればOK. - 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 と割り当てる。 * 使い方 [#ud59ec48] ** 問題を解く [#h434069a] ./usi.pl -f problems/001.usi ** shogi-server でyowai_gpsと対戦 [#e3f0906e] ./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=1000等 - 読み筋をサーバに送らない --nosend_pv * その他 [#e9dbc37c] - ssh接続でkeepalive例 cat .ssh/config Host * ServerAliveInterval 15 (後日記述追加予定)