TadaoYamaokaの日記

山岡忠夫 Home で公開しているプログラムの開発ネタを中心に書いていきます。

Ray+Rnのソースを調べる

将棋プログラムで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\直下にコピーする。

GoGuiで実行

GoGuiをダウンロードしてインストールする。
GoGuiを実行し、ray.exeをプログラムに登録する。

プログラムを起動する。

プロセスにアタッチしてデバッグ

Visual Studioで、デバッグ→プロセスにアタッチを選択し、ray.exeにアタッチする。

ソースを調べたい箇所にブレークポイントを設定する。

UCTで探索を行っている箇所は、UctSearch.cppのParallelUctSearchあたりとなる。

CNTKで方策ネットワークを実行しているのは、UctSearch.cppのEvalPolicyあたりとなる。

PUCTのUCB値を計算しているのは、UctSearch.cppのSelectMaxUcbChildあたりとなる。

対局を開始する。
ブレークポイントで止まるので、ステップ実行してソースを調べる。

それぞれ別スレッドで動いているので、デバッグ→表示→並列スタックで、各スレッドのスタックトレースを見るとよい。
f:id:TadaoYamaoka:20170604155838p:plain