何週間か前に、Chainerをアップデートしようとしたときのメモを整理したので公開します。かたりぃなです。
Windows上のPython環境が壊れていたので修復していたら一日潰れました。
環境はいつものです。
結論
手元の環境でおかしかったのは次のとおりでした。
- 自前でインストールしたAnacondaとVisualStudio2017 CommunityのPythonToolsのパスと重複してた
- cuDNNが入っていない
原因1, 環境変数の競合(pythontools for vs と自前でインストールしたanaconda)
単純に環境の競合でした。
まず、自前インストールしたAnacondaは、たぶんこいつですね。 自前でやったって書いてますね。。。
windows10でchainer+CUDA+cuDNNをGPUで動かしてみた - catalinaの備忘録
次に、PythonTools for visual studioです。 これはVisualStudioでPython開発できるツール一式です。 インストール時にごちゃごちゃ聞かれますが、これを入れるとAnacondaが入りました。
この時点で何か環境壊してないか気づくべきでしたね。。。
何が競合するの?
Windows10には「システム環境変数」と「ユーザー環境変数」があります。 この両方に"pythonのパス"が入っているとpython環境がおかしくなります。
手元の環境では次の3つが重複していました。
システム環境変数
- C:\Program Files\Anaconda3
- C:\Program Files\Anaconda3\Scripts
- C:\Program Files\Anaconda3\Library\bin
ユーザー環境変数
- C:\Users\ユーザー名\Anaconda3
- C:\Users\ユーザー名\Anaconda3\Scripts
- C:\Users\ユーザー名\Anaconda3\Library\bin
chainer1.x時代に色々試していたのはユーザー環境変数側のpythonです。Anacondaをデフォルト設定でインストールすればこちらを向きます。
システム環境変数側はVisualStudio2017のpythontoolsが作ったやつだと思います。 visualstudioのpythontoolsのアンインストールでいなくなってくれましたし。
というわけで、この競合が起きた状態だと「耳から悪魔」みたいなよくわからないことになってしまいます。
ざっとこんな現象が起きてました。
というわけで、こういうふうに動きが妖しいときはpythonの設定を見直しましょう。
原因2, CuDNNがインストールされていない
上記のPython環境の競合と相まって、正しくインストールできてませんでした。
これに気づかずにchainerの適当なexampleを–gpuで動かすとこうなりました。
RuntimeError: CUDA environment is not correctly set up
pipからcupyインストールに成功するときは、ダウンロードが終わってから少々時間かかるので、「ファイルダウンロードしただけ」みたいなインストールの終わり方のときは疑ったほうが良いかもしれません。
ダウンロード後に時間かかるのは、裏でCUDAカーネルをビルドしてるっぽい?
cuDNNをインストールしてからcupyをインストールすれば解決です。 もちろんCUDA本体はインストールしたうえでcupyをインストールする必要があります。
https://developer.nvidia.com/cudnn からダウンロードしてcudaのディレクトリに置いてから
pip install cupy
です。
ついでに
chainercvの最新版では、ssdあたりにも学習サンプルがついてます。 動かすならcv2が必要なので、入れておくとよいです。 (opencv3なのに名前空間がcv2になってるのは気にしたら負けかなと思っている。) pipだとパッケージ見つけられなかったのでcondaでいきました。
conda install -c http://conda.binstar.org/menpo opencv3
chainercvの動作確認
以前試した時(http://catalina1344.hatenablog.jp/entry/2017/06/03/000314) はそれっぽく検出できたのですが、最新版(0.6.0)ではなぜか検出できなくなりました。 テスト用のデータが違うからうまくいかないのかも。
今回は「インストールが成功して動いていること」を確認したいだけなので、検出したオブジェクトのスコアが低いものも出すようにすればいいです。
やっつけですが、こんな感じで。
rcnn_model = SSD300( n_fg_class=len(voc_detection_label_names), pretrained_model='voc0712') rcnn_model.use_preset('evaluate')
これでスコアが低いオブジェクトも全部列挙されます。出力画像ファイルがごちゃごちゃした感じになりますが、無事に最新版に移行できました。
感想
今回はくだらないところで躓いてしまいました。
ニュースでchainer開発元のPFNがMSと協業みたいなのを見たので、そのうち安定して環境構築できるパッケージとか提供されたりするのかなと期待していたりします。
では今回はこれくらいで。