ChainerでGPUを使えるようにする

ChainerでPCのGPU(GTX1060)を使えるようにしてみました。cuDNNなどのインストールの記録です。

目次

  1. バージョンに注意
  2. Visual Studioのインストール
  3. CUDA toolkitのインストール
  4. cuDNNのインストール
  5. CuPyのインストール
  6. 動作確認
  7. プログラムを実行してみた

バージョンに注意

ChainerでNVIDIAのGPUを使うにはいくつかのソフトウェアのインストールが必要なのですが、それぞれ互いをサポートするバージョンが限られていますので注意が必要です。

ここでは、Windows10 64bitのPython 3.7とChainer 6.1の環境に、CUDA toolkitとcuDNNとCuPyをインストールします。

Visual Studioのインストール

Visual Studio Community 2019をインストールします。

マイクロソフトのサイト からインストーラーをダウンロードして、インストーラーの指示に従ってインストールします。

本当はこれが必要かどうかわからなかったのですが、PCにVisual StudioがインストールされていないとCUDA toolkitのインストール時に警告が表示されるので、とりあえず入れました。

インストール後にPCの再起動が必要になります。

CUDA toolkitのインストール

NVIDIAのサイト からCUDA toolkitをダウンロードします。

Windows用のバージョン10.1のネットワークインストール版にしました。

ダウンロードしたインストーラーを起動して、ダイアログに従ってインストールします。

cuDNNのインストール

NVIDIAのcuDNNのサイト からcuDNNをダウンロードします。

CUDA 10.1にあわせてcuDNN 7.6.1をダウンロードしました。

ダウンロードしたzipファイルを開いて、中のファイルをすべてCUDAのインストールディレクトリにコピーします。私の場合のCUDAのインストールディレクトリは下記でした。

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1

環境変数CUDA_PATHを設定します。

Windowsで「システム環境変数の編集」を開いて、新規の環境変数としてCUDA_PATHを設定します。値は下記です。

CUDA_PATH の設定値
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin

CuPyのインストール

CuPyはPFN製のツールです。

公式のインストレーションガイドに従って、pipでインストールします。CUDA 10.1用なので、cupy-cuda101ですね。

> pip install cupy-cuda101

動作確認

インストールが終わったらPythonを起動してバージョンを確認してみます。

>>> import chainer
>>> chainer.print_runtime_info()
Platform: Windows-10-10.0.17763-SP0
Chainer: 6.1.0
NumPy: 1.16.4
CuPy:
  CuPy Version          : 6.1.0
  CUDA Root             : C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1
  CUDA Build Version    : 10010
  CUDA Driver Version   : 10020
  CUDA Runtime Version  : 10010
  cuDNN Build Version   : 7500
  cuDNN Version         : 7500
  NCCL Build Version    : None
  NCCL Runtime Version  : None
iDeep: Not Available

CuPyもcuDNNも認識されてるみたいですね。

プログラムを実行してみた

以前の投稿 で作ったプログラムをGPUで実行してみます。

プログラムの変更箇所は、gpu_id=-1の箇所をgpu_id=0に変更しただけです。

GPUでの実行結果はこんな感じです。

epoch       main/loss   main/accuracy  val/main/loss  val/main/accuracy  elapsed_time  lr
1           1.95098     0.294389       1.73378        0.370898           4.2799        0.01
2           1.61783     0.423695       1.58525        0.433789           7.68214       0.01
3           1.48455     0.46806        1.44352        0.486133           10.9139       0.01
4           1.39733     0.498557       1.40814        0.488477           14.2344       0.01
5           1.32612     0.528          1.33373        0.531836           17.4989       0.01
6           1.26416     0.547474       1.32005        0.536523           20.7889       0.01
7           1.2232      0.562077       1.32893        0.519727           24.1614       0.01
8           1.17002     0.584783       1.27554        0.550781           27.4536       0.01
9           1.11919     0.60174        1.20257        0.572266           30.7289       0.01
10          1.07182     0.620548       1.21364        0.566211           34.0453       0.01
11          1.03131     0.636009       1.17099        0.583984           37.2642       0.01
12          0.992332    0.64846        1.18573        0.584766           40.4871       0.01
13          0.94667     0.665505       1.12495        0.603516           43.8106       0.01
14          0.903241    0.6806         1.13328        0.607031           47.065        0.01
15          0.862923    0.696644       1.13663        0.602539           50.3673       0.01
16          0.815238    0.711895       1.15817        0.600195           53.5971       0.01
17          0.778302    0.725786       1.12613        0.616797           56.8842       0.01
18          0.733753    0.742765       1.17826        0.603906           60.1899       0.01
19          0.693527    0.757968       1.18404        0.606055           63.4368       0.01
20          0.643745    0.77417        1.16787        0.613477           66.729        0.01
Test accuracy: 0.611254

精度が異なっているのは、たぶん乱数のseedを指定していないためです。

20エポックの経過時間を比較してみます。

CPU (core i5-8250u) 746.520 秒
GPU (GTX1060 6G) 66.729 秒

早いなあ。

広告

機械学習カテゴリの投稿