Introduction

1年以上前、ディープラーニング Caffe その1 環境構築という記事でにて、14.04でCPUを使ったCaffe環境を構築しました。
最近、会社でUbuntu 14.04にGeForce GTX 1080 Tiを2枚差すという、金に物を言わせたマシンが届き、そのテストをしています。
が、これが動かない。

具体的には、ドライバを入れるとGPUは認識し、Caffe、GPUのテストなどはクリアするが、ログイン画面が真っ黒になってしまう、という現象に陥る。

恐らく、オンボードのグラフィックボードを無効化したのが原因だと思われる。オンボードのグラッフィクドライバはnouveauを使っている? ネットのBlogだと、オングラフィックのIntelのグラフィックボードを無効にしろ、みたいなこと書いてあります。
でも、会社のマシンだと、1080 Tiには、出力端子がなかったんだよね… だから、画面を表示するには、オンボードのグラフィックを有効にしておかないといけない気がするんだけど、仕事のときは気づかなかった。
で、とりあえず、自宅の環境で、GeForece GTX 750 Tiを有効化した状態で、各所で発生する問題が起きるかを検証し、手順をメモします。
目標は

  • ドライバのインストール
  • Caffeのテストを全部Pass
  • Nvidiaのデバイステストをパス

を達成することです。

検証環境は

  • Dell Vostro 3800
  • Ubuntu 14.04 LTSを新規インストールした直後
  • Intel Core i3-4130 3.40Ghz
  • メモリ16GB
  • GeForece GTX 750 Ti

になります。
なお、モニタは、グラフィックボードのHDMI端子に接続しています。
また、記事中のコマンドでは、sudoは省略するために、sudo -s でrootになっています。

ソフトウェアの更新

OSインストール直後だと、ソフトウェアの更新通知が来ますので全て更新します。来ていないなら、「ソフトウェアの更新」を明示的に実行します。
ただし、Ubuntuそのものは最新版に更新しないでください。

なお、グラフィックドライバを導入していない状態で、ボードの端子で出力していると、画面の表示文字列が一部だけ欠如していたり、突然ロック画面に戻ったりと不安定になっています。

SSHサーバー導入

マシンの前にいるのはつらいので。

1
2
$ apt-get install openssh-server
$ vi /etc/ssh/sshd_config

下記のように更新

1
2
3
+ #PermitRootLogin without-password
- PermitRootLogin without-password
+ PermitRootLogin no

nouveau無効化

ひょっとすると、オンボードしかない場合は、ここをオフにすると、何も表示されない可能性があるので、このセクションは無視しても可

1
$ vi /etc/modprobe.d/blacklist-nouveau.conf

下記のように更新

1
2
3
4
5
+ blacklist nouveau
+ blacklist lbm-nouveau
+ options nouveau modeset=0
+ alias nouveau off
+ alias lbm-nouveau off
1
$ vi /etc/modprobe.d/nouveau-kms.conf

下記のように更新

1
+ options nouveau modeset=0

更新後、設定を反映し、再起動。

1
2
$ update-initramfs -u
$ reboot

接続しているボードの確認

1
2
3
4
5
# 1080Ti等は、内部のデータベースに存在しないので、まずは更新
$ update-pciids
Downloaded daily snapshot dated 2017-04-23 03:15:02
$ lspci | grep VGA
01:00.0 VGA compatible controller: NVIDIA Corporation GM107 [GeForce GTX 750 Ti] (rev a2)

ドライバのインストール

1
2
3
4
5
6
7
$ apt-add-repository ppa:xorg-edgers/ppa
$ apt-get update
$ apt-get upgrade
# 検索して見つかる最新をインストールする
$ apt-cache search 'nvidia-[0-9]+$'
$ apt-get install nvidia-375
$ reboot

再起動後、ログインループなら、Ctrl+Alt+F1でCUIでログインし、下記のコマンドを実行。

1
2
3
4
# ユーザフォルダに存在する以下を削除することで、ループを回避できる可能性がある
# 自分の環境はこれでログイン成功
$ rm .Xauthority .ICEauthority
$ reboot

ドライバのバージョン確認

1
2
3
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module 375.39 Tue Jan 31 20:47:00 PST 2017
GCC version: gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)

CUDA Toolkitのインストール

1
2
3
4
5
6
7
# Ubuntu 14.04 x86_64 network debを入手
$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64/cuda-repo-ubuntu1404_8.0.61-1_amd64.deb
$ apt-get install aptitude -y
$ dpkg -i cuda-repo-ubuntu1404_8.0.61-1_amd64.deb
$ aptitude update
$ aptitude install -y cuda
$ reboot

検証

Caffeの検証

Caffeのソースをダウンロードしてきて、ビルド及びtestを実行します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ wget https://github.com/BVLC/caffe/archive/1.0.zip
$ unzip 1.0.zip
$ cd caffe-1.0
$ cp Makefile.config.example Makefile.config
$ vi Makefile.config

- CUDA_DIR := /usr/local/cuda
+ CUDA_DIR := /usr/local/cuda-8.0

$ apt-get install libatlas-base-dev libboost-all-dev libgflags-dev libgoogle-glog-dev libhdf5-serial-dev libleveldb-dev liblmdb-dev libopencv-dev libprotobuf-dev protobuf-compiler libsnappy-dev -y
$ make
$ make test
$ make runtest
...

[----------] Global test environment tear-down
[==========] 2041 tests from 267 test cases ran. (421631 ms total)
[ PASSED ] 2041 tests.

GPUの検証1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
$ cd /usr/local/cuda-8.0/samples
# cudnn.hが存在しないというエラーになって途中で止まりますがOK
$ make
# 停止したら実行
$ ./bin/x86_64/linux/release/deviceQuery
./bin/x86_64/linux/release/deviceQuery Starting...

CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "GeForce GTX 750 Ti"
CUDA Driver Version / Runtime Version 8.0 / 8.0
CUDA Capability Major/Minor version number: 5.0
Total amount of global memory: 2000 MBytes (2097414144 bytes)
( 5) Multiprocessors, (128) CUDA Cores/MP: 640 CUDA Cores
GPU Max Clock rate: 1084 MHz (1.08 GHz)
Memory Clock rate: 2700 Mhz
Memory Bus Width: 128-bit
L2 Cache Size: 2097152 bytes
Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 49152 bytes
Total number of registers available per block: 65536
Warp size: 32
Maximum number of threads per multiprocessor: 2048
Maximum number of threads per block: 1024
Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)
Maximum memory pitch: 2147483647 bytes
Texture alignment: 512 bytes
Concurrent copy and kernel execution: Yes with 1 copy engine(s)
Run time limit on kernels: Yes
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support: Disabled
Device supports Unified Addressing (UVA): Yes
Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GeForce GTX 750 Ti
Result = PASS

GPUの検証2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ nvidia-smi
Sun Apr 23 22:14:27 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 GeForce GTX 750 Ti On | 0000:01:00.0 On | N/A |
| 40% 31C P8 1W / 38W | 140MiB / 2000MiB | 0% Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 1361 G /usr/bin/X 99MiB |
| 0 2075 G compiz 39MiB |
+-----------------------------------------------------------------------------+

NVIDIA Cuda compiler

1
2
3
4
5
$ /usr/local/cuda-8.0/bin/nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61

無事に動きました。