背景&目的
Tensorflow + GPU 環境を nvidia-docker を使って楽に作る (on CentOS 7.2)
上記の記事のUbuntu版です。
背景と目的に関してはこちらを参照してください。
使うもの
- GPU搭載のサーバ
- OS : Ubuntu 17.04
- CPU : Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz
- GPU : NVIDIA Corporation GM200 [GeForce GTX TITAN X] x 1
- nvidia-docker (https://github.com/NVIDIA/nvidia-docker)
- docker (https://www.docker.com/)
- Tensorflow (https://github.com/tensorflow/tensorflow)
導入手順
以下の手順で導入できます。
- ドライバインストール(ホストOS上)
- Dockerインストール(ホストOS上)
- nvidia-dockerインストール(ホストOS上)
- Tensorflow + GPU のイメージ作成&実行
1. ドライバインストール
nouveauグラフィックスドライバを無効化した後、NVIDIAのドライバをインストールします。
(nouveauを無効化しないとドライバインストールが失敗するため)
## nouveau ドライバーを無効にする
sudo su -
# nouveauが読み込まれていることを確認
lsmod | grep nouveau
---
nouveau 1403757 0
video 24400 1 nouveau
mxm_wmi 13021 1 nouveau
i2c_algo_bit 13413 1 nouveau
drm_kms_helper 125008 1 nouveau
ttm 93441 1 nouveau
drm 349210 3 ttm,drm_kms_helper,nouveau
i2c_core 40582 5 drm,i2c_i801,drm_kms_helper,i2c_algo_bit,nouveau
wmi 19070 2 mxm_wmi,nouveau
---
# kernelをビルドするためのパッケージをインストール
sudo apt-get install dkms build-essential linux-headers-generic
# nouveauを含まないように設定
sudo vi /etc/modprobe.d/blacklist.conf
---
# disable nouveau
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off
---
echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
# nouveauなしの起動イメージ生成
sudo update-initramfs -u
# 再起動
reboot now
# nouveauが読み込まれていないことを確認
lsmod | grep nouveau
## nvidia drive のインストール
sudo su -
apt-get install pciutils gcc linux-headers-$(uname -r)
# GPUの型番を確認
lspci | grep -i nvidia
---
05:00.0 VGA compatible controller: NVIDIA Corporation GM200 [GeForce GTX TITAN X] (rev a1)
---
# http://www.nvidia.co.jp/Download/index.aspx?lang=jp
# ここからGPUに合った最新のドライバを探す
# 今回はこれ
# http://www.nvidia.com/Download/driverResults.aspx/118290/en-us
# http://jp.download.nvidia.com/XFree86/Linux-x86_64/384.98/NVIDIA-Linux-x86_64-384.98.run (2017/12/07最新版)
cd /tmp/
wget http://us.download.nvidia.com/XFree86/Linux-x86_64/375.66/NVIDIA-Linux-x86_64-375.66.run
sh NVIDIA-Linux-x86_64-375.66.run
# 誘導にしたがってインストールする
# 再起動
reboot now
# GPUが認識されているかを確認
nvidia-smi
# 以下の様な出力を確認
---
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.66 Driver Version: 375.66 |
|-------------------------------+----------------------+----------------------+
| 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 TIT... Off | 0000:05:00.0 Off | N/A |
| 0% 56C P0 54W / 250W | 0MiB / 12205MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
2. Dockerインストール
公式のインストールマニュアルに従ってインストールします。
sudo無しでdockerコマンド使えるようにユーザをグループに追加。
sudo gpasswd -a $USER docker
sudo service docker restart
docker-composeもインストールしておきましょう。
Install Docker Compose
3. nvidia-dockerインストール
公式のQuickStartに従ってインストールしたいのですが、公式はUbuntu17をまだサポートしていないようなので、編集されたdebファイルを用いてインストールします。
参考)
https://github.com/NVIDIA/nvidia-docker/issues/412
https://github.com/NVIDIA/nvidia-docker/issues/234
### nvidia-docker install
# Install nvidia-docker and nvidia-docker-plugin
wget -P /tmp https://github.com/NVIDIA/nvidia-docker/files/818401/nvidia-docker_1.0.1-yakkety_amd64.deb.zip
unzip /tmp/nvidia-docker_1.0.1-yakkety_amd64.deb.zip -d /tmp/
sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb
# Test nvidia-smi
nvidia-docker run --rm nvidia/cuda nvidia-smi
# 以下の様な出力を確認
---
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.66 Driver Version: 375.66 |
|-------------------------------+----------------------+----------------------+
| 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 TIT... Off | 0000:05:00.0 Off | N/A |
| 22% 48C P8 28W / 250W | 0MiB / 12205MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
4. Tensorflow + GPU のイメージ作成&実行
https://hub.docker.com/r/tensorflow/tensorflow/
Tensorflowが提供しているDockerhubのイメージを使います。
## run tensorflow docker
nvidia-docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow:latest-gpu
Dockerを起動後
http://${HOST_IP}:8888/
にアクセスすればjupyterの画面が確認できます。
3_mnist_from_scratch.ipynb のnotebookを起動して Cell -> Run All でサンプルが動くことを確認します。結果を確認。
jupyterのログでGPUを使って計算されていることを確認します。
2017-08-17 08:02:43.311687: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:893] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2017-08-17 08:02:43.312309: I tensorflow/core/common_runtime/gpu/gpu_device.cc:940] Found device 0 with properties:
name: GeForce GTX TITAN X
major: 5 minor: 2 memoryClockRate (GHz) 1.076
pciBusID 0000:05:00.0
Total memory: 11.92GiB
Free memory: 11.81GiB
2017-08-17 08:02:43.312328: I tensorflow/core/common_runtime/gpu/gpu_device.cc:961] DMA: 0
2017-08-17 08:02:43.312346: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971] 0: Y
2017-08-17 08:02:43.312358: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX TITAN X, pci bus id: 0000:05:00.0)
以上です。