Ubuntu 14.04 上で MATLAB 2017a GPU利用 + TensorFlow-GPU

MATLAB R2017a でGPUを利用したディープラーニングが実行できるように、CUDAドライバ等のアップデートを行いました。同時にGPU版Tensorflowをインストールしました。

まず、MATLAB R2016b から R2017a にアップデートしたときに、GPUを利用できなくなりました。以下が MATLAB 2017a でのエラー内容です。

>> gpuArray(1)
エラー: gpuArray
CUDA 実行中に予期しないエラーが発生しました。CUDA エラー:
CUDA driver version is insufficient for CUDA runtime version

MATLAB R2017a Parallel Computing Toolboxのリリースノートより、MATLAB 2017a では CUDA toolkit version 8.0 が必要なことが分かります。

PCスペック

OSおよびカーネルの情報。

$ uname -a
Linux temsip01 3.13.0-117-generic #164-Ubuntu SMP Fri Apr 7 11:05:26 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

GPUの情報。NVIDIA Tesla K80 が2台載っています。

$ lspci | grep -i nvidia
04:00.0 3D controller: NVIDIA Corporation GK210GL [Tesla K80] (rev a1)
05:00.0 3D controller: NVIDIA Corporation GK210GL [Tesla K80] (rev a1)
$ nvidia-smi
Thu May 18 12:31:54 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.51 Driver Version: 375.51 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla K80 Off | 0000:04:00.0 Off | 0 |
| N/A 36C P0 61W / 149W | 207MiB / 11439MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 1 Tesla K80 Off | 0000:05:00.0 Off | 0 |
| N/A 24C P8 29W / 149W | 2MiB / 11439MiB | 0% Default |
+-------------------------------+----------------------+----------------------+

+—————————————————————————–+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 4907 C /usr/local/MATLAB/R2017a/bin/glnxa64/MATLAB 205MiB |
+—————————————————————————–+

古い CUDA および NVIDIAドライバのアンインストール

`uninstall_cuda_7.5.pl` の場所は CUDA をインストールした場所によって変わります。

# /usr/local/cuda-7.5/bin/uninstall_cuda_7.5.pl


# apt-get --purge remove nvidia*

パッケージ更新

ずっとアップグレードしてなかったので。ただし、`apt-get dist-upgrade` はカーネルに変更を加える場合があるので注意。

# apt-get update
# apt-get dist-upgrade
# apt-get autoremove

NVIDIA Driver のインストール

リポジトリに追加。

# add-apt-repository ppa:graphics-drivers/ppa
# apt-get update

最新のドライバを確認。

# apt-cache search nvidia-3

インストール。

# apt-get install nvidia-381

CUDA 8.0 toolkit のインストール

リポジトリに追加。

# wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64/cuda-repo-ubuntu1404_8.0.61-1_amd64.deb
# dpkg -i cuda-repo-ubuntu1404_8.0.61-1_amd64.deb
# apt-get update

インストール。

# apt-get install cuda

CUDAをパスに追加します。以下の内容を.bashrcに書き込み、`source .bashrc`を実行します。

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/lib/nvidia-381"
export CUDA_HOME=/usr/local/cuda
export PATH=$PATH:${CUDA_HOME}/bin

R2017aで動作確認

ここまでで、MATLAB R2017a でGPUを利用できるようになります。

>> gpuDevice

ans =

CUDADevice のプロパティ:

Name: ‘Tesla K80’
Index: 1
ComputeCapability: ‘3.7’
SupportsDouble: 1
DriverVersion: 8
ToolkitVersion: 8
MaxThreadsPerBlock: 1024
MaxShmemPerBlock: 49152
MaxThreadBlockSize: [1024 1024 64]
MaxGridSize: [2.1475e+09 65535 65535]
SIMDWidth: 32
TotalMemory: 1.1996e+10
AvailableMemory: 1.1642e+10
MultiprocessorCount: 13
ClockRateKHz: 823500
ComputeMode: ‘Default’
GPUOverlapsTransfers: 1
KernelExecutionTimeout: 0
CanMapHostMemory: 1
DeviceSupported: 1
DeviceSelected: 1

cuDNN 6.0 のインストール

GPU版のTensorflowを使うには、さらにcuDNNというライブラリをインストールする必要があります。cuDNNのダウンロードページから cuDNN v6.0 for CUDA 8.0 をダウンロードし、解凍して`/usr/local/`に置きます。ダウンロードするにはNVIDIAへのユーザ登録が必要です。

# tar xzvf cudnn-8.0-linux-x64-v6.0.tgz
# cp -a cuda/lib64/* /usr/local/cuda-8.0/lib64/
# cp -a cuda/include/* /usr/local/cuda-8.0/include/
# ldconfig

cuDNNについてもパスを追加します。以下の内容をHOMEの.bashrcに書き込み、`source .bashrc`を実行します。

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cudnn-6.0/lib64"

PIP で GPU版Tensorflow をインストール

これでGPU版のTensorflowを動かすことができるようになります。念のため古いtensorflowをアンインストールしてからインストールしました。`pip install tensorflow`だとCPU版のTensorflowが入ってしまうので注意。

pip uninstall tensorflow
pip install --upgrade tensorflow-gpu