kuroの覚え書き

96の個人的覚え書き

富士通PRIMERGY RX300S7で深層学習の学習環境を構築してみる

データ解析をする上で無視できない深層学習(deep learning)を使えるように勉強中なのだが、手元に実機があったほうがいろいろと試せて良いだろう、ということでサーバの1ノードを深層学習用GPUマシンにすることにした。
当初RX200S7 (XEON E5-2620 x2)の1UサーバにGPUを乗っけてテストを開始したのだが、流石に1Uでは窮屈かなと、2UのRX300S7 (XEON E5-2630L)を入手してみた。
#春は中古サーバが安く出回っていいね。
本当は2UだとフルハイトのPCIカードが刺さらないので、タワー型のサーバ機のほうが良いのだけど、そういう汎用性のありそうな機械はヤフオクでも結構値がつり上がっちゃうので、やむなく2Uラックサーバで我慢する。
GPUは画像を表示させるわけでもないのでx16フルに繋がっている必要はないから、仮想通貨マイナー御用達の外付けx1 PCI-eの基板などで外付けにすればいいのだろうが(そうするとRX300でなくてもいいとも言えるが)、とりあえずはテスト環境として、一番安価でCUDA対応しているNVIDIA GeForce GT710というロープラファイルでローエンドなグラフィックボードを入れてみた。

まずはいろいろとサイトを巡って情報収集。
いつもお世話になっています
CentOS 7 : CUDA 9.1 インストール : Server World
まずはここを参考にCUDAをインストールしてみる。

このページではCUDA9.1を入れているが、こういう情報はすぐに更新されていってしまうので、そのままやるという訳にはいかない。
そもそもいろいろ関係するもののバージョンの組み合わせによって動いたり動かなかったりするわけで、いつの間にか情報のあるバージョンがダウンロードできなくなっていたりするので厄介だ。かといってすべて最新バージョンにしたらだいたいはうまくいかないというのがこの世界。試行錯誤するしか無いのな。

2019年4月18の段階の各種最新バージョンは以下の通り
anaconda3-5.3.1
python 3.7.2
tensorflow-gpu-1.13.1
CUDA-10.1
nvidia-driver-418.43

まずはグラボをインストール。RX300S7のマニュアルを見るとグラボはPCI-slot5に挿せ、とあったので素直に従ってみたところ認識しないし。マニュアルをよくよく見てみると、slot5,6は2CPUでないと使えないとか書いてるし。どういうこっちゃ。結局グラボの装着順は(1) slot5, (2) slot4ということらしく、1CPUのときは(1)は飛ばして(2) slot4に挿す必要があるようで、わかりにくいことこの上ない。ついでにグラボを挿すとオンボードVGAは使えなくなるというおまけ付き。

とりあえずnvidiaのドライバを入れるために標準ドライバを切る。

# lsmod | grep nouveau
nouveau 1869689 0
mxm_wmi 13021 1 nouveau
video 24538 1 nouveau
wmi 21636 2 mxm_wmi,nouveau
drm_kms_helper 179394 2 mgag200,nouveau
ttm  114635 2 mgag200,nouveau
drm  429744 5 ttm,drm_kms_helper,mgag200,nouveau
i2c_algo_bit  13413 3 igb,mgag200,nouveau
# nano /etc/modprobe.d/blacklist-nouveau.conf
# cat /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0

# dracut --force
# reboot

次にドライバをインストール

必要なパッケージをインストール

# yum -y install kernel-devel-$(uname -r) kernel-header-$(uname -r) gcc make

インストールされているグラボを確認

# lspci | grep VGA
04:00.0 VGA compatible controller: NVIDIA Corporation GK208B [GeForce GT 710] (rev a1)
08:00.0 VGA compatible controller: Matrox Electronics Systems Ltd. MGA G200e [Pilot] ServerEngines (SEP1) (rev 05)

ドライバをダウンロード

# wget http://jp.download.nvidia.com/XFree86/Linux-x86_64/418.43/NVIDIA-Linux-x86_64-418.43.run

インストール

# bash NVIDIA-Linux-x86_64-418.43.run
Verifying archive integrity... OK
Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 418.43................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

途中のメッセージはすべてyesで進む
f:id:k-kuro:20190617124038p:plain

f:id:k-kuro:20190617124053p:plain

f:id:k-kuro:20190617124104p:plain
ちゃんと入ったか確認

# nvidia-smi

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.43  Driver Version: 418.43   |
|-------------------------------+----------------------+----------------------+
| 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 GT 710 Off | 00000000:04:00.0 N/A | N/A |
| 50%  28C P0 N/A / N/A | 0MiB /  980MiB |  N/A Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes:  GPU Memory |
| GPU  PID  Type  Process name  Usage |
|=============================================================================|
| 0 Not Supported  |
+-----------------------------------------------------------------------------+

Not Supportedは気になるが、ローエンド機種なのでそういうものらしい

続いてCUDA10.1をダウンロードしてインストール

# wget https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-repo-rhel7-10.1.105-1.x86_64.rpm
# rpm -Uvh cuda-repo-rhel7-10.1.105-1.x86_64.rpm
# sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/cuda.repo
# yum --enablerepo=cuda,epel install cuda-10-1 xorg-x11-drv-nvidia dkms gcc make

いろいろ情報を見てもCUDA10.0までしか実績はなさそうだけど
gcc, makeはすでに最新版だったらしくインストールはされないのはいいが、DKMSのインストールでコケた

# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# yum --enablerepo=cuda,epel install cuda-10-1 xorg-x11-drv-nvidia dkms

とすることで回避

# nano /etc/profile.d/cuda101.sh

# cat /etc/profile.d/cuda101.sh
export PATH=/usr/local/cuda-10.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

ここで一旦再起動

# reboot

一般ユーザでログインして、テストプログラムを走らせてみる

$ cuda-install-samples-10.1.sh ./
Copying samples to ./NVIDIA_CUDA-10.1_Samples now...
Finished copying samples.

$ cd NVIDIA_CUDA-10.1_Samples/1_Utilities/deviceQuery
$ make
$ ./deviceQuery
./deviceQuery Starting...

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

cudaGetDeviceCount returned 35
-> CUDA driver version is insufficient for CUDA runtime version
Result = FAIL

ここでまたエラーが出た。

NVIDIAのドライバを入れ直すと良いらしい

# bash NVIDIA-Linux-x86_64-418.43.run

改めてテスト

$ cd NVIDIA_CUDA-10.1_Samples/1_Utilities/deviceQuery
$ ./deviceQuery
./deviceQuery Starting...

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

Detected 1 CUDA Capable device(s)

Device 0: "GeForce GT 710"
CUDA Driver Version / Runtime Version 10.1 / 10.1
CUDA Capability Major/Minor version number: 3.5
Total amount of global memory:  981 MBytes (1028587520 bytes)
( 1) Multiprocessors, (192) CUDA Cores/MP:  192 CUDA Cores
GPU Max Clock rate: 954 MHz (0.95 GHz)
Memory Clock rate:  800 Mhz
Memory Bus Width: 64-bit
L2 Cache Size:  524288 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:  No
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 supports Compute Preemption: No
Supports Cooperative Kernel Launch: No
Supports MultiDevice Co-op Kernel Launch: No
Device PCI Domain ID / Bus ID / location ID:  0 / 4 / 0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.1, CUDA Runtime Version = 10.1, NumDevs = 1
Result = PASS

これでCUDAはちゃんとインストールできたっぽい
続く