TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

Chainerをデバッグする

WindowsでVisual C++で作成したC++のプログラムからDCNNを実行したいが、C++に対応したライブラリを動かすのに苦労している。
Caffeを試しているがビルドはできて、CPUでは実行できたが、GPUで実行すると謎の

check failed: error == cudasuccess (8 vs. 0) invalid device function

というエラーがでてうまく動かない。

Caffeは依存ライブラリが多く、Windowsで動かそうとビルドだけで苦労する。

ライブラリと格闘するのは不毛な作業に思えてきたので、cuDNNを直接使うことを考えている。

cuDNNを使って、サンプル的に初期化とバージョン情報の取得のみ行うコードは問題なくビルドできたが、DCNNを実装しようとすると、「User Guide」だけで開発するのはかなり難しい。
いちおうサンプルはついていたが、Visual Studio 2012用のコードで動かすことができない。
ネット上にも情報は皆無で、結構苦労しそうである。

ChainerはcuDNNに対応しているので、Chainerのソースを見ながら調べているが、動いているときのパラメータとか調べたくなる。
そこで、Chainerのソースのデバッグを行ってみた。

Visual Studio 2015の「Python Tools for Visual Studio」を使えば簡単にデバッグすることができる。

以下に、手順を示しておく。

Python 3.5でChainerを実行している前提で、Visual Studio 2015を使用するものとする。
(Python 2.7の場合は、Visual Studio 2013で同様のことができる。)

  1. Visual Studio 2015の拡張機能から「Python Tools for Visual Studio」をインストールする。
  2. メニューからツール→Python Tools→Python Emvironmentsを選んで、Python環境を追加する。
  3. メニューからツール→オプションを選び、オプションダイアログからPython Tools→Debuggingを選び、「Enable debugging of the Python standard library」にチェックする。(これをチェックしないとライブラリの内部のソースのデバッグができない。)
  4. プロジェクトの新規作成を選び、Python→From Exsisting Python codeを選んで、Chainerで実行するPythonスクリプト(imagenetなど)のあるディレクトリを指定してプロジェクトを作成する。
  5. ソリューションエクスプローラで実行するスクリプトを右クリックしてSet as Startupをクリックする。
  6. プロジェクトを右クリックしてオプションを選び、General→Working Directoryに作業ディレクトリを、Debug→Script Argumentsにスクリプトの引数を設定する。
  7. スクリプトの適当な位置にブレークポイントを設定する。
  8. デバッグモードで実行する。
  9. ブレークポイントで止まったら、後はステップ実行して、Chainerのソース内部へもステップインできる。

なお、Cythonのコード(拡張子が.pyx)まではステップインできない。Cythonのコードは直接ソースを見るしかないが、cuDNNの直接的なラッパーになっているのでPythonのコード側の引数を調べられればほぼ問題ない。


この方法を使えば、convolution_2d.pyあたりのソースを実行しながら調べられるので、cuDNNの使い方の参考にできそうである。