GPU
LinuxでのGPU利用について整理します。
環境
OS: Ubuntu 16.04 LTS / Amazon Linux AMI release 2017.03
GPU: NVIDIA Geforce GTX 760, 970 / Tesla-K80
CUDA Toolkit 7.5 / 8.0
- deviceQuery
- bandwidthTest
nvidia-smi
lオプションくらいしか使ったことなかったけど、モニタリング系オプションとかいろいろあるので活用しよう。
- pmon
- dmon
- query-gpu
ハードウェア確認
- lshw
lshwコマンドが便利。lspciをgrepするよりスマートかと。
環境構築関連
- NVIDIAドライバのインストール
# nouveau 無効化 # /etc/modprobe.d/blacklist-nouveau.conf に以下を記述 blacklist nouveau blacklist lbm-nouveau options nouveau modeset=0 alias nouveau off alias lbm-nouveau off # /etc/modprobe.d/nouveau-kms.conf に以下を記述 options nouveau modeset=0 $ sudo update-initramfs -u $ sudo reboot # ドライバインストール $ sudo apt-get install linux-image-extra-virtual linux-source linux-headers-`uname -r` # NVIDA公式サイトからドライバ(runファイル)を取得しておく $ sudo sh NVIDIA-Linux-x86_64-xxx.xx.run -a --disable-nouveau $ sudo reboot
- 補助電源挿し忘れ
グラフィックボードに補助電源を挿し忘れていると、nvidia-xxxコマンド実行時に以下のようなメッセージが出る。知らなかった。Unable to determine the device handle for GPU 0000:01:00.0: Unable to communicate with GPU because it is insufficiently powered. This may be because not all required external power cables are attached, or the attached cables are not seated properly.
- デスクトップマネージャーの停止
ドライバインストール前に停止しておくこと。$ sudo service lightdm stop
- Nvidiaドライバ(PPA)のインストール
$ sudo add-apt-repository ppa:graphics-drivers/ppa $ sudo apt-get update # 以下 xxx の箇所はドライバのバージョン番号を指定 $ sudo apt-get install nvidia-xxx # 以下は不要かも $ sudo apt-get install mesa-common-dev $ sudo apt-get install freeglut3-dev
OpenCV CUDAサポート関連
お手持ちのNvidia製ビデオカードのGPUアーキテクチャは以下のサイトで確認できる。
OpenCVビルド時のCMakeオプション例を載せる。自分の環境で利用しているGPUのアーキテクチャ番号を CUDA_ARCH_BIN / CUDA_ARCH_PTX オプションに指定しておく。こうするとビルド時間を大幅に短縮できる。また、僕の環境だとcublasを認識させるには WITH_CUBLAS オプションも明示的指定する必要があった。
cmake ... 省略 -D CUDA_ARCH_BIN=3.0 \ -D CUDA_ARCH_PTX=3.0 \ -D WITH_CUBLAS=ON \
cmake実行結果の該当箇所のみ抜粋
-- NVIDIA CUDA -- Use CUFFT: YES -- Use CUBLAS: YES -- USE NVCUVID: NO -- NVIDIA GPU arch: 30 -- NVIDIA PTX archs: 30 -- Use fast math: NO
MXNet
- 環境
CPU: Intel Core-i5 2500K
RAM: CFD elixir DDR3-1333 8GB
SSD: Crucial M4 64GB
GPU: Nvidia Geforce GTX 760
CUDA: 8.0, cuDNN 5.1
学習速度メモ
CIFAR-10データセットをResNet 110層(バッチサイズは128で固定)で学習
学習完了まで待つのは大変なので秒間辺りの処理枚数を見る
シングルマシン GPU利用 / cuDNN無し
INFO:root:Epoch[37] Validation-accuracy=0.871044 INFO:root:Epoch[38] Batch [20] Speed: 72.25 samples/sec Train-accuracy=0.883203 INFO:root:Epoch[38] Batch [40] Speed: 68.65 samples/sec Train-accuracy=0.874219 INFO:root:Epoch[38] Batch [60] Speed: 68.64 samples/sec Train-accuracy=0.878906 INFO:root:Epoch[38] Batch [80] Speed: 68.65 samples/sec Train-accuracy=0.877344 INFO:root:Epoch[38] Batch [100] Speed: 68.64 samples/sec Train-accuracy=0.877734
シングルマシン GPU利用 / cuDNN有り
INFO:root:Epoch[39] Batch [40] Speed: 273.99 samples/sec Train-accuracy=0.875781 INFO:root:Epoch[39] Batch [60] Speed: 274.03 samples/sec Train-accuracy=0.875781 INFO:root:Epoch[39] Batch [80] Speed: 274.08 samples/sec Train-accuracy=0.863281 INFO:root:Epoch[39] Batch [100] Speed: 273.97 samples/sec Train-accuracy=0.871094 INFO:root:Epoch[39] Batch [120] Speed: 273.83 samples/sec Train-accuracy=0.878906
cuDNNの有無でこんなに速度が変わるとは、。
学習結果
INFO:root:Epoch[299] Batch [20] Speed: 288.44 samples/sec Train-accuracy=0.992188 INFO:root:Epoch[299] Batch [40] Speed: 273.97 samples/sec Train-accuracy=0.996094 INFO:root:Epoch[299] Batch [60] Speed: 273.90 samples/sec Train-accuracy=0.995703 INFO:root:Epoch[299] Batch [80] Speed: 274.26 samples/sec Train-accuracy=0.992969 INFO:root:Epoch[299] Batch [100] Speed: 274.14 samples/sec Train-accuracy=0.992969 INFO:root:Epoch[299] Batch [120] Speed: 274.10 samples/sec Train-accuracy=0.996875 INFO:root:Epoch[299] Batch [140] Speed: 274.09 samples/sec Train-accuracy=0.996875 INFO:root:Epoch[299] Batch [160] Speed: 273.77 samples/sec Train-accuracy=0.993359 INFO:root:Epoch[299] Batch [180] Speed: 273.88 samples/sec Train-accuracy=0.996484 INFO:root:Epoch[299] Batch [200] Speed: 273.95 samples/sec Train-accuracy=0.994922 INFO:root:Epoch[299] Batch [220] Speed: 273.88 samples/sec Train-accuracy=0.995703 INFO:root:Epoch[299] Batch [240] Speed: 273.88 samples/sec Train-accuracy=0.996484 INFO:root:Epoch[299] Batch [260] Speed: 273.95 samples/sec Train-accuracy=0.994141 INFO:root:Epoch[299] Batch [280] Speed: 273.66 samples/sec Train-accuracy=0.996484 INFO:root:Epoch[299] Batch [300] Speed: 273.73 samples/sec Train-accuracy=0.996094 INFO:root:Epoch[299] Batch [320] Speed: 273.67 samples/sec Train-accuracy=0.994531 INFO:root:Epoch[299] Batch [340] Speed: 273.77 samples/sec Train-accuracy=0.992578 INFO:root:Epoch[299] Batch [360] Speed: 273.65 samples/sec Train-accuracy=0.994531 INFO:root:Epoch[299] Batch [380] Speed: 273.64 samples/sec Train-accuracy=0.994141 INFO:root:Epoch[299] Resetting Data Iterator INFO:root:Epoch[299] Time cost=181.939 INFO:root:Saved checkpoint to "models/cifar10-0300.params" INFO:root:Epoch[299] Validation-accuracy=0.934039
ResNet 110層でCIFAR-10を学習、分類精度 93.4%
Faiss
コンパイルログ