【失敗】Kepler環境でNeural Network Consoleを動かす

SONYのニューラルネットワークを直観的に構築するツール「[Neural Network Console](https://dl.sony.com/ja/)」は、GPUを利用することで速く学習が可能になります。
ただしGPUの世代がKepkerだと、ちょっといじらないと動きません。

※ここではクラウド版ではなく、Windows版の「Neural Network Console」について書いています

**【注意】
私の環境では、まだうまく動いていないので、真似しないほうがいいです。**

# エラーメッセージ
いじる前は、こんな感じでエラーになります。

```
2018-08-08 18:56:48,681 Training process is started.

・・・途中省略・・・

forward_function
    func.variable_inputs, func.variable_outputs)
  File "nnabla\function.pyx", line 188, in nnabla.function.Function.forward (D:\gitlab-ci\builds\862e82a9\2\nnabla\nnabla-builder\nnabla\python\src\nnabla\function.cpp:5145)
RuntimeError: target_specific error in nbla::cublas_gemm
C:\ci\builds\f124a89d\3\nnabla\nnabla-builder\nnabla-ext-cuda\src\nbla\cuda\cublas.cpp:50
Failed `status == CUBLAS_STATUS_SUCCESS`: ARCH_MISMATCH
```

# CUDAのインストール
[CUDA 8](https://developer.nvidia.com/cuda-80-ga2-download-archive)をインストールします。（バージョンは重要です）
インストール方法等は省略。

# cuDNNのインストール
[cuDNN 7](https://developer.nvidia.com/rdp/cudnn-archive)をインストールします。（バージョンは重要です）
インストール方法等は省略。
※ログインが必要
※CUDA毎、Windows毎に異なるので注意

# ライブラリの入れ替え
「Neural Network Console」から呼んでいるGPU呼び出しモジュールを入れ替えます。

## パスの設定
linux環境ではおなじみのpipでモジュールのインストールを行いますので、「Neural Network Console」の以下の2つのフォルダにパスを通します。

- （インストールフォルダ）\libs\Miniconda3
- （インストールフォルダ）\libs\Miniconda3\Scripts

コマンドプロンプトを開き、以下のように実行します。

```
c:\hoge\nnc> set path=%path%;c:\hoge\nnc\libs\Miniconda3;c:\hoge\nnc\libs\Miniconda3\Scripts
```

## 入れ替え
pipを使って、古いライブラリを消し、新しいライブラリ（古いバージョンのライブラリ）をインストールします。

```
c:\hoge\nnc> pip uninstall nnabla-ext-cuda
c:\hoge\nnc> pip install nnabla-ext-cuda80==1.0.0
```

【参考】
ライブラリとCUDA/cuDNNの関係は以下の通りとのこと。

- nnabla-ext-cuda80 (CUDA 8.0 x cuDNN 7.1)
- nnabla-ext-cuda90 (CUDA 9.0 x cuDNN 7.1)
- nnabla-ext-cuda91 (CUDA 9.1 x cuDNN 7.1)
- nnabla-ext-cuda92 (CUDA 9.2 x cuDNN 7.1)

# 確認
ちゃんと動作するか、サンプルプロジェクトで確認してみます。

```
2018-08-08 19:05:18,694 Training process is started.

・・・途中省略・・・

2018-08-08 19:05:24,755 [nnabla]: Train with contexts ['cpu']
2018-08-08 19:05:24,770 [nnabla]: Training epoch 1 of 100 begin
2018-08-08 19:05:24,973 [nnabla]: epoch 1 of 100 cost=0.670640  {train_error=0.601071, valid_error=0.616336}
2018-08-08 19:05:25,082 [nnabla]: epoch 2 of 100 cost=0.557968  {train_error=0.514157, valid_error=0.542608}
2018-08-08 19:05:25,176 [nnabla]: epoch 3 of 100 cost=0.481263  {train_error=0.448142, valid_error=0.492721}
2018-08-08 19:05:25,301 [nnabla]: epoch 4 of 100 cost=0.423768  {train_error=0.401717, valid_error=0.450013}
2018-08-08 19:05:25,394 [nnabla]: epoch 5 of 100 cost=0.384835  {train_error=0.361735, valid_error=0.410510}
2018-08-08 19:05:25,441 [nnabla]: epoch 6 of 100 cost=0.344484 
2018-08-08 19:05:25,488 [nnabla]: epoch 7 of 100 cost=0.315490 
2018-08-08 19:05:25,535 [nnabla]: epoch 8 of 100 cost=0.296956 
2018-08-08 19:05:25,581 [nnabla]: epoch 9 of 100 cost=0.276522 
2018-08-08 19:05:25,691 [nnabla]: epoch 10 of 100 cost=0.255827  {train_error=0.248344, valid_error=0.310425}

・・・途中省略・・・

2018-08-08 19:05:30,190 [nnabla]: epoch 96 of 100 cost=0.060721 
2018-08-08 19:05:30,236 [nnabla]: epoch 97 of 100 cost=0.062549 
2018-08-08 19:05:30,283 [nnabla]: epoch 98 of 100 cost=0.053480 
2018-08-08 19:05:30,330 [nnabla]: epoch 99 of 100 cost=0.064627 
2018-08-08 19:05:30,439 [nnabla]: epoch 100 of 100 cost=0.060106  {train_error=0.056343, valid_error=0.119016}
2018-08-08 19:05:30,439 [nnabla]: Training Completed.
Please install the correct version of CUDA / CUDNN.
Or install correct nnabla_ext_cuda for installed version of CUDA/CUDNN.
```

あれ？

2018-08-08 19:05:24,755 [nnabla]: Train with contexts ['**<font color="Red">cpu</font>**']

あれあれ？？

Please install the correct version of **<font color="Red">CUDA / CUDNN</font>**.
Or install correct nnabla_ext_cuda for installed version of **<font color="Red">CUDA/CUDNN</font>**.

でもまぁ動いたからいいか．．．う～ん。
なんとなく、ライブラリを変えるだけで、GPUを指定してもCPUで動くようになるような気がする．．．
※問題解決にはなってないけど

# 後日追記
ライブラリを戻しても、CUDAのバージョンを上げても、結局CPUで動くようになってしまったので、もう何がなんだかわからない．．．
一番最初のエラーはなんだったのか（苦笑）

## 手動で確認
```
>>> import nnabla_ext.cudnn
Please install the correct version of CUDA / CUDNN.
Or install correct nnabla_ext_cuda for installed version of CUDA/CUDNN.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\users\mine.soltec\desktop\neural network console\libs\miniconda3\lib\site-packages\nnabla_ext\cudnn\__init__.py", line 18, in <module>
    import nnabla_ext.cuda
  File "c:\users\mine.soltec\desktop\neural network console\libs\miniconda3\lib\site-packages\nnabla_ext\cuda\__init__.py", line 20, in <module>
    from .init import (
ImportError: DLL load failed: 指定されたモジュールが見つかりません。
```

- 「init.cp36-win_amd64.pyd」内でDLLがロードできていない模様。<br/>（「init.cp36-win_amd64.pyd」ではなく「init.pyd」が呼ばれている可能性もあり）<br/>※「init.cp36-win_amd64.pyd」が呼び出せているのは確認済み
- init.cp36-win_amd64.pyd → nnabla_cuda.dll → cudnn64_7.dll等という呼び出し構造になっている模様。
- もしかしたら、全然別のDLLが見つからないのかもしれない

## 怪しい部分
- 公式な対象がWindows8.1かWindows10の64bit版<br/>→確認しているのがWindows7の64bit版
- 「Microsoft Visual C++ 2015 Redistributable」が必要<br/>→「Microsoft Visual C++ 2017 Redistributable」をインストールすると2015の方が消える

# 現時点での結論
**Windows7＋Kepler環境では、「Neural Network Console」は使い物にならない。**

# 参考情報
[https://groups.google.com/forum/#!topic/neural_network_console_users_jp/cbC87rHV4As](https://groups.google.com/forum/#!topic/neural_network_console_users_jp/cbC87rHV4As)
[https://groups.google.com/forum/#!topic/neural_network_console_users/9OKrwn2oOIA](https://groups.google.com/forum/#!topic/neural_network_console_users/9OKrwn2oOIA)
[https://nnabla.readthedocs.io/en/latest/python/install_on_windows.html](https://nnabla.readthedocs.io/en/latest/python/install_on_windows.html)