TadaoYamaokaの開発日記

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

WindowsでChainerをGPUを使って動かす(更新)

GPUGeForce GTX 1080に交換したので、CUDAを8.0にバージョンアップした。

CUDA7.5でインストールしたChainerが動かなくなったため、CUDA 8.0に対応させるため、再インストールを行った。

基本的に、CUDA7.5のときの手順と同じだが、環境変数INCLUDEの設定が必要であった。

手順の変更点を以下に示す。

変更点

Visual Studio 2013はCUDA 7.5では必要だったが、CUDA 8.0では不要になるため、Visual Studio 2015 Communityのみでよい。

環境変数PATHには、CUDA 7.5でのインストール時に設定した
「C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin」を削除して、
代わりに「C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin」を設定する。

環境変数INCLUDEに以下のパスを追加する。
「C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt」

環境変数INCLUDEがないと、実行時に、nvccがヘッダーファイルを見つけられずエラーになる。
※2018/1/27 追記
Chainer 3.3.0では環境変数PATHとINCLUDEを設定していなくても問題なく動作するようになっていました。

Chainerをアンインストールしてからインストールし直す。

pip uninstall chainer
pip install chainer --no-cache-dir

動作確認

Chainer 1.17のMNISTサンプルを実行する。

git clone https://github.com/pfnet/chainer.git
cd chainer\examples\mnist
python train_mnist.py -g 0

Chainer 1.11からは、MNISTサンプルでTrainerが使用されているため、学習の進捗状況がコンソールに表示されるようになった。
しかし、Windowsコマンドプロンプトでは、正しく表示されないため、以下のような悲しい表示となる。
(※2017/4/9追記 1.22で確認したところ、コマンドプロンプトでも正しく表示されるようになっていました。)

GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

[Jepoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy
[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J     total [..................................................]  0.83%
this epoch [########..........................................] 16.67%
       100 iter, 0 epoch / 20 epochs
       inf iters/sec. Estimated time to finish: 0:00:00.
[4A[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J     total [..................................................]  1.67%
this epoch [################..................................] 33.33%
       200 iter, 0 epoch / 20 epochs
    280.13 iters/sec. Estimated time to finish: 0:00:42.123847.
[4A[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J     total [#.................................................]  2.50%
this epoch [#########################.........................] 50.00%
       300 iter, 0 epoch / 20 epochs
    286.58 iters/sec. Estimated time to finish: 0:00:40.826498.

(省略)

[4A[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J     total [#################################################.] 99.17%
this epoch [#########################################.........] 83.33%
     11900 iter, 19 epoch / 20 epochs
    276.56 iters/sec. Estimated time to finish: 0:00:00.361588.
[4A[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J20          0.0119729   0.129709              0.996765       0.9807                   
[J     total [##################################################] 100.00%
this epoch [..................................................]  0.00%
     12000 iter, 20 epoch / 20 epochs
    275.05 iters/sec. Estimated time to finish: 0:00:00.
[4A[J

表示はおかしいが、実行結果には問題ない。

グラフ表示をやめたい場合は、train_mnist.pyの

    trainer.extend(extensions.PrintReport(
        ['epoch', 'main/loss', 'validation/main/loss',
         'main/accuracy', 'validation/main/accuracy']))

    trainer.extend(extensions.ProgressBar())

の行をコメントアウトすればよい。

ただし、進捗状況が一切表示されなくなるので、進捗状況を確認したい場合は、別のコマンドプロンプトを起動して、result\logをMinGWなどでインストールしたtailコマンドで確認する必要がある。

2016/11/29追記
PowerShellだと進捗状況が正しく表示できると情報頂きました。
確認したところ、以下のように正しく表示されました。

PS chainer\examples\mnist> python train_mnist.py -g 0
GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.193621    0.0969001             0.941784       0.9699                    4.65855
2           0.07452     0.0797367             0.976265       0.9741                    6.83185
3           0.0499362   0.107785              0.983765       0.9663                    9.00563
4           0.0342047   0.0684211             0.989098       0.9787                    11.1779
5           0.0294403   0.0747326             0.990565       0.9789                    13.3467
6           0.0248758   0.0861258             0.991448       0.9775                    15.5149
7           0.0212153   0.0827466             0.992732       0.9791                    17.6967
8           0.019431    0.076995              0.993798       0.9818                    19.8634
9           0.0164358   0.0847282             0.994882       0.9813                    22.0251
10          0.0141179   0.0980002             0.995782       0.9786                    24.1904
11          0.0143263   0.104953              0.995415       0.9782                    27.1725
     total [############################......................] 57.50%
this epoch [#########################.........................] 50.00%
      6900 iter, 11 epoch / 20 epochs
    268.05 iters/sec. Estimated time to finish: 0:00:19.026036.

2017/4/12 追記

chainer 1.20.0以降で、Theanoの関数がサポートされるようになったため、実行時にWARNINGが出力されるようになりました。

WARNING (theano.configdefaults): g++ not detected ! Theano will be unable to execute optimized C-implementations (for both CPU and GPU) and will default to Python implementations. Performance will be severely degraded. To remove this warning, set Theano flags cxx to an empty string.

また、chainer 1.20.0以降では、Python Tools for Visual Studioを使用して、デバッグを開始するとエラーが発生し、デバッグを開始できなくなります。

そのため、Windowsではchainerをバージョン指定して1.18.0をインストールすることをお勧めします。(1.19.0はインストールでエラーが発生します。)
※ 1.24.0ではエラーが発生しなくなっていました。Windowsでも最新バージョンをインストールしても問題ありません。

バージョンを指定してインストールする方法
pip install chainer==1.18.0 --no-cache-dir

ただし、最新のMNISTサンプルを実行しようとすると、以下のエラーが発生します。

Traceback (most recent call last):
  File ".\chainer\examples\mnist\train_mnist.py", line 129, in <module>
    main()
  File ".\chainer\examples\mnist\train_mnist.py", line 99, in main
    if extensions.PlotReport.available():
AttributeError: module 'chainer.training.extensions' has no attribute 'PlotReport'

その場合、99行目から106行目をコメントアウトすることで実行できるようになります。
グラフを画像に保存する処理なのでコメントアウトしても結果に影響はありません。