ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

【GW自由研究】CUDAをインストールするときに必要なこと/MNISTを動かしてみる

CUDAとは

CUDAとは、NVIDIAが開発・提供している、GPU向けの汎用並列コンピューティングプラットフォームおよび プログラミングモデルを提供する開発環境およびライブラリーのことです。

インストールに必要なこと

CUDAを活用するには対応するNVIDIA GPUが必要です。

CUDAをインストールするにはGPUカードに対応する、CUDAと互換性のあるGPUドライバーおよび、 それらをインストールできるOSが必要です。

CUDAと互換性のあるGPUドライバーが入らないと、GPUリソースを利用できません。 現在最新版のCUDA 9.1を使う場合はnvidia-390をインストールする必要があります。 このnvidia-390バージョンで認識するGPUカードが必要になります。

情報源

最新版のダウンロード

NVIDIA GPU Driver一覧で、GPUカードに必要なドライバーのバージョンを確認

公式の一覧でcompute capabilityを確認できる

レガシーGPU 旧CUDAをサポートしていたGPU。このリストに出ているGPUはCUDA 9.1では使えない。

参考情報

英語版Wikipediaはかなり詳しい情報がまとまっている。参考情報として。

実行環境を理解する

家にあったHPE ML110 G6を使いました。久しぶりに使いました。 メインストレージがHDDだし、CPUもCeleron(R) G1101なので遅いです。 CPUやストレージが速いと、最後に示した結果より差の開きは小さいと思います。

GPUは対応するGPU一覧からGeForce GTX 1050をセレクトしました。 (とりあえずメモリー2GBのモデルでも動きましたが、 本格的に使うにはもう少しメモリーサイズの大きいものを採用したほうがいいかもしれません。)

CUDA 8.x は compute capability 2.0以上 CUDA 9.x は compute capability 3.0以上 が必要だそうです。GPUのcompute capabilityはcuda-gpusで確認できます。

調べた結果GeForce GTX 1050のcompute capabilityは6.1なので、しばらく大丈夫そうです。

GPU Driverを調べると、390.48(nvidia-390)以降をインストールすれば良いことがわかりました。

CUDA 9.1をインストール後、せっかくなのでChainer、CuPyをインストールしてMNISTを動かしてみます。 インストールの容易さから、Chainerを選択しました。

マシンにOSのインストール

今回はCUDA 9.1を動かすので対応するOSの中から、Ubuntu 16.04を選択しました。 Ubuntu Server 16.04.4をインストールして、事前にアップデート、最新のカーネルで起動した状態にします。

CUDAをインストール

基本的に公式の手順に従ってインストールします。

% wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
% sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
% sudo dpkg -i cuda-repo-ubuntu1604_9.1.85-1_amd64.deb 

% sudo apt-get install cuda-9-1 nvidia-390
...
% nvidia-smi
Wed May  2 20:36:36 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.30                 Driver Version: 390.30                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 1050    Off  | 00000000:01:00.0 Off |                  N/A |
| 40%   32C    P0    N/A /  75W |      0MiB /  2000MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

Python3とChainer,CuPyをインストール

ChainerでGPUを扱うには、1.3未満はPyCuda、1.3以降はCuPyを利用する。 今回インストールしたChainerは4.0なので、CuPyをインストールします。

% sudo apt install python3 python3-pip
% pip3 install chainer cupy

MNISTテスト

MNISTのテストプログラムはChainerのソースにサンプルが用意されているのでそれを使います。 -g0をつけるとGPUモードで解析処理を行ってくれます。

% wget https://github.com/chainer/chainer/archive/v4.0.0.tar.gz 
% tar zvxf v4.0.0.tar.gz
% python3 chainer-4.0.0/examples/mnist/train_mnist.py         #cpuモードで処理
% python3 chainer-4.0.0/examples/mnist/train_mnist.py -g0  #gpuモードで処理

結果、処理時間はCPUモードでは17分、GPU では1分40秒程度でした。