-Keras- GPUの設定

ディープラーニングの計算量は比較的大量になることが多いので,GPUを使用しないと非常に時間がかかることになるので,Keras を使用するにはGPU(NVDIA のグラフィクスカード GTX シリーズ)を利用することが効果的です.

以前の投稿で作成した mykras 環境と同様に mykeras-gpu 環境を作成して,Jupyter Notebook のインストールを行う例を以下に示します.

まずは,Anaconda Promptで,mykerasをアクティベートします.
続いてKeras をインストールする際のパッケージ名は "keras-gpu" なので,"conda install keras-gpu"を実行します.

(base) C:\Users\xxx>activate mykeras
(mykeras) C:\Users\xxx>conda install keras-gpu

すると,以下のように実行が始まります.

Solving environment: done

==> WARNING: A newer version of conda exists. <==
  current version: 4.5.11
  latest version: 4.5.12

Please update conda by running

    $ conda update -n base -c defaults conda

## Package Plan ##

  environment location: C:\Users\Hidehiko MURAO\AppData\Local\conda\conda\envs\mykeras

  added / updated specs:
    - keras-gpu


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    keras-gpu-2.2.4            |                0           5 KB
    cudnn-7.1.4                |        cuda9.0_0       192.3 MB
    tensorflow-base-1.12.0     |gpu_py36h6e53903_0       180.8 MB
    _tflow_select-2.1.0        |              gpu           3 KB
    tensorflow-gpu-1.12.0      |       h0d30ee6_0           3 KB
    cudatoolkit-9.0            |                1       339.8 MB
    tensorflow-1.12.0          |gpu_py36ha5f9131_0           4 KB
    ------------------------------------------------------------
                                           Total:       712.9 MB

The following NEW packages will be INSTALLED:

    cudatoolkit:     9.0-1
    cudnn:           7.1.4-cuda9.0_0
    keras-gpu:       2.2.4-0
    tensorflow-gpu:  1.12.0-h0d30ee6_0

The following packages will be UPDATED:

    tensorflow:      1.12.0-eigen_py36h67ac661_0 --> 1.12.0-gpu_py36ha5f9131_0
    tensorflow-base: 1.12.0-eigen_py36h45df0d8_0 --> 1.12.0-gpu_py36h6e53903_0

The following packages will be DOWNGRADED:

    _tflow_select:   2.2.0-eigen                 --> 2.1.0-gpu

Proceed ([y]/n)? y


Downloading and Extracting Packages
keras-gpu-2.2.4      | 5 KB      | ######################## | 100%
cudnn-7.1.4          | 192.3 MB  | #######################  | 100%
tensorflow-base-1.12 | 180.8 MB  | ############################################ | 100%
_tflow_select-2.1.0  | 3 KB      | ############################################ | 100%
tensorflow-gpu-1.12. | 3 KB      | ############################################ | 100%
cudatoolkit-9.0      | 339.8 MB  | ############################################ | 100%
tensorflow-1.12.0    | 4 KB      | ############################################ | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done

続いて,WindowsのPATH環境にcuda関連のDLLが格納されている
    C:\Users\xxx\AppData\Local\conda\conda\envs\mykeras\DLLs
を登録します.

Windowsコマンドプロンプト
    control
と入力してコントロールパネルを起動します.

その後,
    システムとセキュリティ > システム
と選択して,
    システムの詳細設定
をクリックします.

さらに別ウィンドウが開くので,「詳細設定」タブの 「環境変数」をクリックします。
ユーザー環境変数に Path が既にあれば「編集」を押して

    %USERPROFILE%AppData\Local\conda\conda\envs\mykeras\DLLs

を追加します.

ユーザー変数に Path が無い場合は「新規」で作成します.システム変数の PATH に mykeras-gpu の DLL のパスが追加されるように記述します.

ここでGPUが動作するかをテストしてみます.テストはJupyter Notebookを使って行います.
テストには,以前にも用いた,keras 作者 Fchollet さんが用意してくれている exapmle で MNIST データセットを学習する mnist_cnn.py で試します.

実行結果は以下のようになります.

x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
Train on 60000 samples, validate on 10000 samples
Epoch 1/12
60000/60000 [==============================] - 6s 102us/step - loss: 0.2660 - acc: 0.9188 - val_loss: 0.0667 - val_acc: 0.9799
Epoch 2/12
60000/60000 [==============================] - 4s 70us/step - loss: 0.0934 - acc: 0.9724 - val_loss: 0.0413 - val_acc: 0.9876
Epoch 3/12
60000/60000 [==============================] - 4s 70us/step - loss: 0.0678 - acc: 0.9799 - val_loss: 0.0375 - val_acc: 0.9870
Epoch 4/12
60000/60000 [==============================] - 4s 70us/step - loss: 0.0569 - acc: 0.9835 - val_loss: 0.0314 - val_acc: 0.9894
Epoch 5/12
60000/60000 [==============================] - 4s 70us/step - loss: 0.0478 - acc: 0.9860 - val_loss: 0.0315 - val_acc: 0.9890
Epoch 6/12
60000/60000 [==============================] - 4s 70us/step - loss: 0.0426 - acc: 0.9872 - val_loss: 0.0291 - val_acc: 0.9905
Epoch 7/12
60000/60000 [==============================] - 4s 70us/step - loss: 0.0384 - acc: 0.9886 - val_loss: 0.0331 - val_acc: 0.9892
Epoch 8/12
60000/60000 [==============================] - 4s 70us/step - loss: 0.0342 - acc: 0.9896 - val_loss: 0.0270 - val_acc: 0.9907
Epoch 9/12
60000/60000 [==============================] - 4s 71us/step - loss: 0.0325 - acc: 0.9902 - val_loss: 0.0311 - val_acc: 0.9903
Epoch 10/12
60000/60000 [==============================] - 4s 70us/step - loss: 0.0292 - acc: 0.9907 - val_loss: 0.0279 - val_acc: 0.9911
Epoch 11/12
60000/60000 [==============================] - 4s 70us/step - loss: 0.0276 - acc: 0.9913 - val_loss: 0.0247 - val_acc: 0.9916
Epoch 12/12
60000/60000 [==============================] - 4s 71us/step - loss: 0.0254 - acc: 0.9921 - val_loss: 0.0265 - val_acc: 0.9919
Test loss: 0.026480694237979514
Test accuracy: 0.9919

以前のテストでは,Epoch 1/12, 2/12(以前の例では 1/2, 2/2)では 64s かかっていたものが,今回はEpoch1で 6s で終了しており,Epoch2で 4s に短縮されていることがわかります.