脱N00Bしたいエンジニア

N00Bなエンジニアの奮闘記録

インストールガイド CentOS 7.5 minimal with MATE & Nvidia CUDA 9.2

インストール時におこった問題については下記記事で解説

sikeda107.hatenablog.jp

0. 理由 ※飛ばしていいです

CentOSのkernelをアップデートしたらnvida-smiが後述のようになったので、ドライバを入れ直そうとしたらぐちゃぐちゃになっちゃったので、もうやりなおすことにした。

$ nvidia-smi
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

下記サイトを参考にしてシングルユーザモードでログインして、いろいろやったけど結局CentOSが立ち上がらなくなったのでもう諦めた。
参考:CentOS 7でrootパスワードをリセットする方法
ちなみに最終的には

[赤いなにか]a start job is running for wait for plymouth boot screen to quit

とかでて、左に赤いのがくるくるまわってた。

1. 準備

焼き方は下記を参考にして、RufusってソフトをつかってWindows10のPCで焼きました。Macの人は別途調べてね。

hamukichi.hatenablog.jp

2. CentOS 7.5 インストール

インストーラ起動

CentOSのはいったUSBメモリを刺し、BootをUSBにして起動したところでいきなりつまづいた。

failed to map image memory

が出て、インストールができない。参考サイトをもとに、
1. 「Install CentOS 7」を選択した状態で、eまたはtabキーを押してbootオプション編集画面を表示
2. bootオプションの一番後ろのquietを削除してnoacpi nomodeset追記してCtrl+XまたはEnterキーを押す
3. 立ち上がる
参考:https://syobon.jp/2017/10/02/ryzen-install-battle-case-of-centos-7/

インストール設定

たちあがったあとは案内に従ってインストールしていく。
* 言語:日本語
* キーボードレイアウト:英語US ※お使いのキーボード配列参照で
* KDUMPは無効 ※お好みで
* ソフトウェア選択はMinimalのみ ※必要なものは後で入れる+GNOME3が嫌い
* インストール先 その他のストレージオプション->パーティション構成->パーティションを自分で構成する->完了
CentOS Linux Linux 7.5 1804 for x86_64を選択してマイナスをして空っぽにしたあと、自動的に作成をする。(新規でインストールしたいため)homeを選択してマイナス、とroot(/)をを選択してマイナスする。プラスをクリックしてマウントポイントを(/)にし、ストレージの残り全部をを割り当てる。
最終的に、/boot 1024Mib /boot/efi 953MiB / 214.14GiB swap 7681MiB
使用可能 1592.5 KiB 全ての領域 223.57GiB
完了をクリック
* 右下のインストールを開始
* インストール中にROOTパスワード、ユーザを作成する。ユーザを作成時に管理者(つまり、wheelグループにいれること)にチェック ※sudo を使うため

インストールがおわったら再起動される。

3. CentOSの設定

ネットワークの設定

再起動後、ログインしたらまずはネットワークの設定をする。
下記サイトを参考に、「NetworkManager TUI(nmtui)」をつかって設定をする。
1. $nmtuiで起動
2. Edit a connection を選択
3. Addを選択してEnter、Ethernetを選択
4. IPv4 CONFIGURATION のAutomaticをEnterして、Manualに変更する。
5. Showを押すと設定のリストが現れる
6. 固定IPを振り当てる。案内に従ってIPアドレス(xxx.xxx.xxx.xxx/yy)、デフォルトルート、DNS、を設定する ※xxxはアドレスyyはサブネットマスク ネットマスク早見表
7. 「Automatically connect」にチェックを入れ自動接続するようにする
8. $systemctl restart networkでネットワークの反映
9. $ip addrで反映されているか確認
10. $ping アドレスでパケット送って返ってくるかみるのもあり。
*参考:NetworkManager 使用方法(nmtui編)

アップデート

ネットワークの設定がおわったら、yumでアップデートをかける。その後必要なものをインストールしていく。
1. コマンドを実行$sudo yum -y update (-yはall yesの意味)
2. 一旦$rebootで再起動をかける 
3. kernelが最新かどうか確認する。OSに対する最新カーネルRHEL公式で確認できる

$ cat /etc/centos-release (OSの確認)   
$ uname -a (カーネルの確認)   
  1. 最新カーネルがあたっていればOK

4. CUDA9.2 の準備

基本的には公式「 NVIDIA CUDA INSTALLATION GUIDE FOR LINUX DU-05347-001_v9.2 | August 2018 WEB版」 (PDF版)に沿ってインストールしていく。

バイス状況の確認

Minimalインストールをしたので、lspciコマンドが入っていない。下記サイトを参考にインストールし、実行する。このPCにはGTX1070Tiが搭載されている。
公式該当ページ

$ yum install pciutils (lspciのインストール)  
$ lspci | grep VGA (グラフィックスカードの確認)  
00:02.0 VGA compatible controller: Intel Corporation Device 3e91  
01:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1070 Ti] (rev a1)  

インストールに必要なものをインストール

  1. C/C++ コンパイラGCCのインストール 公式該当ページ
$ sudo yum install gcc 
$ sudo yum install gcc-c++
$ gcc --version (確認)
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ --version (確認)
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  1. CUDAドライバは、ドライバのインストール時にカーネルの実行バージョンのカーネルヘッダと開発パッケージをインストールする必要がある。公式該当ページ
$ sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)
  1. CUDAはdkmsを要求する。公式該当ページ

Dynamic Kernel Module Support (DKMS) はカーネルのソースツリーの外にソースが存在する Linux カーネルモジュールの生成を可能にするプログラム/フレームワークです。新しいカーネルがインストールされたときに DKMS モジュールは自動的にリビルドされます。Dynamic Kernel Module Supportより

$ sudo yum install epel-release 
$ sudo yum install dkms
$ dkms --version (確認)
dkms:2.6

dkms problem while installing CUDA 8 on RHEL 7.3 ppc64le
4. CUDAToolkitをダウンロードするため、GUI環境のMATEをインストールする。startxで立ち上がればOK

$ sudo yum groupinstall "MATE Desktop" -y
$ sudo yum -y groups install "Server with GUI"
$ echo "exec /usr/bin/mate-session" >> ~/.xinitrc 
$ startx (GUIを立ち上げる)

参考:MATEデスクトップ環境 インストール

ドライバの準備

CentOSにはデフォルトでnouveauというグラフィックドライバがある。これがNvidiaドライバと衝突するため、無効化する。公式該当ページ
nouveau ドライバの確認をする。

$ lsmod | grep nouveau

viで設定ファイルを作成・編集する。

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

ファイルに下記を記入する。iキーで編集モード、入力して追加、Escで戻る、:wqでセーブして終了。

blacklist nouveau
options nouveau modeset=0

現在のkernel initramfsのバックアップをとり、nouveauを無効化したkernel initramfsを再生成する。

$ mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r)-nouveau.img
$ sudo dracut --force

再起動する。

$ reboot

コマンドで何も表示されなければnouveauがロードされていないのでOK

$ lsmod | grep nouveau

補足:代わりのドライバとしてi915ってのが読み込まれてる。ちなみにビデオ出力はグラフィックスボードからではなく、マザーボードからにしてある。グラボはGPGPUとしてのみ使うため。

$ lsmod | grep i915
i915                 1639910  0 
iosf_mbi               14990  2 i915,intel_rapl
i2c_algo_bit           13413  1 i915
drm_kms_helper        177166  2 i915,nvidia_drm
drm                   397988  4 i915,drm_kms_helper,nvidia_drm
video                  24538  1 i915
i2c_core               63151  7 drm,i915,i2c_i801,i2c_hid,drm_kms_helper,i2c_algo_bit,nvidia

5. CUDA9.2のインストール

公式該当ページ

ダウンロード

コマンドでGUIを起動し、firefoxダウンロードサイトを開く。

$ startx 

あるいは、ランレベルの変更でGUIモードに切り替える。その後再起動する。ログインしたあとfirefoxダウンロードサイトを開く。

$ systemctl set-default graphical.target
$ reboot

CUDAToolkit公式のDpwnloadNowをクリックして最新のCUDAをダウンロードする。今回はrunファイルを選択する。RPMだとのちのち面倒くさい(後述)。

Operating System : Linux
Architecture : x86_64
Distribution : CentOS
Version : 7
Installer Type : runfile(local) ※お好みで

ベースインストーラcuda_9.2.148_396.37_linux.run
パッチファイル:cuda_9.2.148.1_linux.run
ダウンロードする。

インストール

ドライバもインストールするため、コマンドでCUIモードに変えてからインストールを行う。その後再起動する。

$ systemctl set-default multi-user.target
$ reboot

ログインをしたあと、runファイルのパーミッション・アクセス権を変更する。パーミッション早見表

$ sudo chmod 705 cuda_9.2.148_396.37_linux.run
$ sudo chmod 705 cuda_9.2.148.1_linux.run

runファイルを実行することでインストールする。公式該当ページ

$ sudo ./cuda_9.2.148_396.37_linux.run --silent
$ sudo ./cuda_9.2.148.1_linux.run --silent

パスを通す

効率的にCUDAを使うため、pathを設定する。公式該当ページ .barhrcをviで開く。

$ vi ~/.bashrc

.bashrcに下記を追加する。iキーで編集モード、入力して追加、Escで戻る、:wqでセーブして終了。

$ export PATH=/usr/local/cuda-9.2/bin${PATH:+:${PATH}}
$ export LD_LIBRARY_PATH=/usr/local/cuda-9.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

.barhrcを反映する。その後パスを確認する。

$ source ~/.bashrc
$ echo $PATH

アンインストール

インストールに問題があった場合は下記コマンドにてアンインストールができる。公式該当ページ
CUDA toolkitのアンインストール

$ sudo /usr/local/cuda-9.2/bin/uninstall_cuda_9.2.pl

Nvidia ドライバのアンインストール

$ sudo /usr/bin/nvidia-uninstall

6. CUDAとGPUの確認

ドライババージョン確認

公式該当ページ

$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  396.37  Tue Jun 12 13:47:27 PDT 2018
GCC version:  gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)

NVCCコンパイラ

CUDA用のコンパイラの動作確認
公式「 CUDA COMPILER DRIVER NVCC TRM-06721-001_v9.2 | August 2018 WEB版」 (PDF版)

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Tue_Jun_12_23:07:04_CDT_2018
Cuda compilation tools, release 9.2, V9.2.148

NVIDIA-SMI管理ツール

NVIDIA GPUバイスの管理ツール「NVIDIA System Management Interface」を使う。

$ nvidia-smi
Thu Aug 23 04:15:36 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 396.37                 Driver Version: 396.37                    |
|-------------------------------+----------------------+----------------------+
| 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 107...  Off  | 00000000:01:00.0 Off |                  N/A |
|  0%   47C    P0    31W / 180W |      0MiB /  8119MiB |      5%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

例えば、1秒ごとに温度を表示したい場合は下記コマンドを実行する。ctrl + cで終了する。

$ nvidia-smi -q -i 0 -d TEMPERATURE -l 1

==============NVSMI LOG==============

Timestamp                           : Thu Aug 23 04:18:34 2018
Driver Version                      : 396.37

Attached GPUs                       : 1
GPU 00000000:01:00.0
    Temperature
        GPU Current Temp            : 48 C
        GPU Shutdown Temp           : 99 C
        GPU Slowdown Temp           : 96 C
        GPU Max Operating Temp      : N/A
        Memory Current Temp         : N/A
        Memory Max Operating Temp   : N/A

サンプルの実行

公式が提供するCUDAのサンプルプログラムをコンパイルして実行する。公式該当ページ 下記コマンドを実行すると、ホームディレクトリの直下にNVIDIA_CUDA-9.2_Samplesディレクトリが作成される。その後ディレクトリに移動して、MAKEをつかってビルドすると、実行ファイルが作成される。※このmakeは時間がかかる。

$ /usr/local/cuda-9.2/bin/cuda-install-samples-9.2.sh ~/
$ cd ~/NVIDIA_CUDA-9.2_Samples
$ make

ビルドがおわったら、実行できる。
サンプルの一例の実行 公式該当ページ

$ cd ~/NVIDIA_CUDA-9.2_Samples/1_Utilities/deviceQuery/
$ ./deviceQuery
./deviceQueryDrv Starting...

CUDA Device Query (Driver API) statically linked version
Detected 1 CUDA Capable device(s)

Device 0: "GeForce GTX 1070 Ti"
  CUDA Driver Version:                           9.2
  CUDA Capability Major/Minor version number:    6.1
  Total amount of global memory:                 8120 MBytes (8513978368 bytes)
  (19) Multiprocessors, (128) CUDA Cores/MP:     2432 CUDA Cores
  GPU Max Clock rate:                            1683 MHz (1.68 GHz)
  Memory Clock rate:                             4004 Mhz
  Memory Bus Width:                              256-bit
  L2 Cache Size:                                 2097152 bytes
  Max Texture Dimension Sizes                    1D=(131072) 2D=(131072, 65536) 3D=(16384, 16384, 16384)
  Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 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)
  Texture alignment:                             512 bytes
  Maximum memory pitch:                          2147483647 bytes
  Concurrent copy and kernel execution:          Yes with 2 copy engine(s)
  Run time limit on kernels:                     No
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Concurrent kernel execution:                   Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device supports Compute Preemption:            Yes
  Supports Cooperative Kernel Launch:            Yes
  Supports MultiDevice Co-op Kernel Launch:      Yes
  Device PCI Domain ID / Bus ID / location ID:   0 / 1 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
Result = PASS

サンプルについては「CUDA Samples TRM-06704-001_v9.2 | August 2018 (WEB版)」(PDF版) にて解説がある。