AND OR  

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

コンパイルログ