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で同様のことができる。)
- Visual Studio 2015の拡張機能から「Python Tools for Visual Studio」をインストールする。
- メニューからツール→Python Tools→Python Emvironmentsを選んで、Python環境を追加する。
- メニューからツール→オプションを選び、オプションダイアログからPython Tools→Debuggingを選び、「Enable debugging of the Python standard library」にチェックする。(これをチェックしないとライブラリの内部のソースのデバッグができない。)
- プロジェクトの新規作成を選び、Python→From Exsisting Python codeを選んで、Chainerで実行するPythonスクリプト(imagenetなど)のあるディレクトリを指定してプロジェクトを作成する。
- ソリューションエクスプローラで実行するスクリプトを右クリックしてSet as Startupをクリックする。
- プロジェクトを右クリックしてオプションを選び、General→Working Directoryに作業ディレクトリを、Debug→Script Argumentsにスクリプトの引数を設定する。
- スクリプトの適当な位置にブレークポイントを設定する。
- デバッグモードで実行する。
- ブレークポイントで止まったら、後はステップ実行して、Chainerのソース内部へもステップインできる。
なお、Cythonのコード(拡張子が.pyx)まではステップインできない。Cythonのコードは直接ソースを見るしかないが、cuDNNの直接的なラッパーになっているのでPythonのコード側の引数を調べられればほぼ問題ない。
この方法を使えば、convolution_2d.pyあたりのソースを実行しながら調べられるので、cuDNNの使い方の参考にできそうである。