将棋プログラムでPUCTアルゴリズムを試すため、囲碁プログラムのRayを元にCNTKを使って、ディープラーニングに対応させたRnのソースを調べています。
RnはPUCTアルゴリズムを実装しているので、参考になります。
以下、Windowsでビルドして、ソースをステップ実行するまでの手順です。
ビルド環境
- Windows Home 64bit
- Visual Stuido 2015 Community
CNTKダウンロード
以下のサイトからCNTK2.0をダウンロードする。
Releases · microsoft/CNTK · GitHub
Windows→CNTK for Windows v.2.0 GPU
のリンクからダウンロードする。
ダウンロードした「CNTK-2-0-Windows-64bit-GPU.zip」を任意のフォルダに解凍する。
環境変数PATHに
(CNTKを解凍したフォルダ)\cntk
を追加する。
Rnのソースをgit clone
Rnのソースをgit cloneする。
git clone -b nn https://github.com/zakki/Ray
プロジェクトのパス修正
Ray\win\ray\ray.vcxprojをテキストエディタで開く。
「C:\programs\CNTK-2-0-beta12-0-Windows-64bit-GPU」をCNTKを解凍したフォルダに置換する。
「EvalDll.lib」を「Cntk.Eval-2.0.lib」に置換する。
ビルド
Ray\win\ray.slnをVisual Studio 2015で開く。
デバッグビルドだとCNTKが動かなかったため、Releaseビルドにする。
Releaseビルドでは最適化されているため、ステップ実行が行いにくい。
そこで、プロジェクトの構成をコピーして、Release_NoOptを作成し、プロジェクトの設定で、C/C++→最適化を無効(/Od)に設定する。
プロジェクトの構成をRelease_NoOpt/x64にする。
ソリューションをビルドする。
Ray\win\x64\Release_NoOpt\ray.exeを
Rya\直下にコピーする。
プロセスにアタッチしてデバッグ
Visual Studioで、デバッグ→プロセスにアタッチを選択し、ray.exeにアタッチする。
ソースを調べたい箇所にブレークポイントを設定する。
UCTで探索を行っている箇所は、UctSearch.cppのParallelUctSearchあたりとなる。
CNTKで方策ネットワークを実行しているのは、UctSearch.cppのEvalPolicyあたりとなる。
PUCTのUCB値を計算しているのは、UctSearch.cppのSelectMaxUcbChildあたりとなる。
対局を開始する。
ブレークポイントで止まるので、ステップ実行してソースを調べる。