吉方位確認サービス「楽方位」α版を公開しました。

TensorFlow GPU (Ubuntu 18.04.2 + CUDA 10.0 + NVIDIA GeForce GTX 1050)

Sponsored Links

はじめに

元々はビデオのエンコード/トランスコードのために NVIDIA GeForce GTX 1050 を所有しているのですが、せっかくなので TensorFlow GPU サポートを試してみました。

OS は Ubuntu 18.04.2 です。カーネルの情報は下記の通りです。

$ uname -a
Linux dev1 4.18.0-15-generic #16~18.04.1-Ubuntu SMP Thu Feb 7 14:06:04 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

公式情報

https://www.tensorflow.org/install/
https://www.tensorflow.org/install/gpu
https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html

nouveau 無効化

私の環境では、nouveau を無効化しないと CUDA Toolkit インストール時に

Installing the NVIDIA display driver...
A system reboot is required to continue installation. Please reboot then run the installer again. An attmept has been made to disable Nouveau. If this message persists after reboot, please see the display driver log file at /var/log/nvidia-installer.log for more information.

のように表示され、NVIDIA ドライバーをインストールできませんでした。

そのため、下記のように nouveau を無効化させ、OS を再起動します。

sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf"
sudo bash -c "echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf"
sudo update-initramfs -u
sudo reboot

CUDA Toolkit

CUDA Toolkit をインストールします。

https://developer.nvidia.com/cuda-toolkit

CUDA Toolkit 10.0 以降、Ubuntu 18.04 向けの deb ファイルが提供されるようになっています。2019-05-10 時点では CUDA Toolkit 10.1 が最新ですが、同日時点の Tensorflow のホームページでは

TensorFlow supports CUDA 10.0

https://www.tensorflow.org/install/gpu

とのことで、Legacy Release である CUDA 10.0 をダウンロードしました。具体的には、Linux > x86_64 > Ubuntu 18.04 > runfile (local) です。

https://developer.nvidia.com/cuda-downloads?target_os=Linux&&target_arch=x86_64&&target_distro=Ubuntu&&target_version=1804&&target_type=runfilelocal

Download Installer for Linux Ubuntu 18.04 x86_64 をダウンロードします。2.0GB あります。ファイル名は、cuda_10.0.130_410.48_linux.run です。ダウンロード後、実行します。

sudo apt-get update
sudo apt-get -y install build-essential
sudo sh cuda_10.0.130_410.48_linux.run

実行時の入力と出力結果です。

-----------------
Do you accept the previously read EULA?
accept/decline/quit: accept

Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 410.48?
(y)es/(n)o/(q)uit: y

Do you want to install the OpenGL libraries?
(y)es/(n)o/(q)uit [ default is yes ]: 

Do you want to run nvidia-xconfig?
This will update the system X configuration file so that the NVIDIA X driver
is used. The pre-existing X configuration file will be backed up.
This option should not be used on systems that require a custom
X configuration, such as systems with multiple GPU vendors.
(y)es/(n)o/(q)uit [ default is no ]: 

Install the CUDA 10.0 Toolkit?
(y)es/(n)o/(q)uit: y

Enter Toolkit Location
 [ default is /usr/local/cuda-10.0 ]: 

Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: y

Install the CUDA 10.0 Samples?
(y)es/(n)o/(q)uit: n

Installing the NVIDIA display driver...
Installing the CUDA Toolkit in /usr/local/cuda-10.0 ...

===========
= Summary =
===========

Driver:   Installed
Toolkit:  Installed in /usr/local/cuda-10.0
Samples:  Not Selected

Please make sure that
 -   PATH includes /usr/local/cuda-10.0/bin
 -   LD_LIBRARY_PATH includes /usr/local/cuda-10.0/lib64, or, add /usr/local/cuda-10.0/lib64 to /etc/ld.so.conf and run ldconfig as root

To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-10.0/bin
To uninstall the NVIDIA Driver, run nvidia-uninstall

Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-10.0/doc/pdf for detailed information on setting up CUDA.

Logfile is /tmp/cuda_install_1859.log

その後、LD_LIBRARY_PATH と PATH の設定を行い、OS を再起動します。

sudo touch /etc/ld.so.conf.d/cuda.conf
sudo sh -c "echo '/usr/local/cuda-10.0/lib64' >> /etc/ld.so.conf.d/cuda.conf"

echo '' >> ~/.profile
echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.profile
source ~/.profile

sudo reboot

LD_LIBRARY_PATH を設定しておかないと、後に恐らく下記のようなエラーとなります。

ImportError: libcudnn.so.7: cannot open shared object file: No such file or directory

OS 再起動後、nvidia-smi コマンドで、ドライバのバージョン等を確認してみます。

$ nvidia-smi
Fri May  3 15:50:28 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.48                 Driver Version: 410.48                    |
|-------------------------------+----------------------+----------------------+
| 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 1050    Off  | 00000000:01:00.0  On |                  N/A |
| 46%   46C    P8    N/A /  75W |    474MiB /  1999MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0       928      G   /usr/lib/xorg/Xorg                            40MiB |
|    0       970      G   /usr/bin/gnome-shell                          49MiB |
|    0      1230      G   /usr/lib/xorg/Xorg                           220MiB |
|    0      1371      G   /usr/bin/gnome-shell                         125MiB |
|    0      1724      G   ...quest-channel-token=4637874937971243164    35MiB |
+-----------------------------------------------------------------------------+

NVIDIA cuDNN

次に、NVIDIA cuDNN をインストールします。

https://developer.nvidia.com/cudnn

cuDNN をダウンロードするためには、NVIDIA Developer Program のメンバーシップが必要となります。そのため、まずメールアドレスとパスワードを登録します。その後、ダウンロードページにてダウンロードを行います。

Download cuDNN v7.4.1 (Nov 8, 2018), for CUDA 10.0 の cuDNN Library for Linux をダウンロードしました。cudnn-10.0-linux-x64-v7.4.1.5.tgz というファイル名でダウンロードされました。

ダウンロードしたファイルを解凍し、適切なパスにコピーします。https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html#installcuda を参考にしました。

tar zxvf cudnn-10.0-linux-x64-v7.4.1.5.tgz 
sudo cp cuda/include/cudnn.h /usr/local/cuda-10.0/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-10.0/lib64
sudo chmod a+r /usr/local/cuda-10.0/include/cudnn.h /usr/local/cuda-10.0/lib64/libcudnn*

Python の設定

OS にデフォルトでインストールされている Python を確認してみます。Ubuntu 18.04.2 の場合、Python 2 はインストールされておらず、 Python 3.6 がインストールされていました。

which python
(何も出力されず)

which python3
/usr/bin/python3

python3 -V
Python 3.6.7

ここでは Python 3.6 を使用します。なお、Python 3.6 時代の仮想環境は、python3 -m venv とのことです。

pyvenv スクリプトは Python 3.6 で非推奨となり、代わりに python3 -m venv を使い、仮想環境を動かす Python インタープリタを取り違える可能性を防ぎやすくします。

https://docs.python.org/ja/3/library/venv.html

python3-venv をインストールし、適当なフォルダを作成し、その中に dev という仮想環境を作成してみます。

sudo apt-get -y install python3-venv
mkdir ~/python
cd python
python3 -m venv dev

仮想環境を有効化させてみます。コンソールの先頭に仮想環境名 (ここでは (dev)) が付くようになります。

hirooka@dev1:~/python$ cd dev
hirooka@dev1:~/python/dev$ source bin/activate
(dev) hirooka@dev1:~/python/dev$ 

python コマンドのパスとバージョン、pip コマンドのパスを確認してみます。

which python
/home/hirooka/python/dev/bin/python

python -V
Python 3.6.7

which pip
/home/hirooka/python/dev/bin/pip

システムの Python ではなく、仮想環境の Python が使用されていることがわかります。pip についても同様です。

Tensorflow GPU

pip で TensorFlow GPU をインストールします。

pip install tensorflow-gpu

軽く動作確認をしてみます。ワーニングとエラーは出ていないようです。

$ python
Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
2019-05-03 16:24:35.891399: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2019-05-03 16:24:36.040483: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:998] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-05-03 16:24:36.040932: I tensorflow/compiler/xla/service/service.cc:150] XLA service 0x269b380 executing computations on platform CUDA. Devices:
2019-05-03 16:24:36.040952: I tensorflow/compiler/xla/service/service.cc:158]   StreamExecutor device (0): GeForce GTX 1050, Compute Capability 6.1
2019-05-03 16:24:36.059833: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 3691405000 Hz
2019-05-03 16:24:36.061301: I tensorflow/compiler/xla/service/service.cc:150] XLA service 0x2d5ee80 executing computations on platform Host. Devices:
2019-05-03 16:24:36.061349: I tensorflow/compiler/xla/service/service.cc:158]   StreamExecutor device (0): <undefined>, <undefined>
2019-05-03 16:24:36.061706: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1433] Found device 0 with properties: 
name: GeForce GTX 1050 major: 6 minor: 1 memoryClockRate(GHz): 1.455
pciBusID: 0000:01:00.0
totalMemory: 1.95GiB freeMemory: 1.38GiB
2019-05-03 16:24:36.061752: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1512] Adding visible gpu devices: 0
2019-05-03 16:24:36.063436: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-05-03 16:24:36.063461: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990]      0 
2019-05-03 16:24:36.063471: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1003] 0:   N 
2019-05-03 16:24:36.063651: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 1186 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1050, pci bus id: 0000:01:00.0, compute capability: 6.1)
>>> print(sess.run(hello))
b'Hello, TensorFlow!'
>>> 

その他

pip install tensorflow-gpu 実行時に下記のようなエラーとなり、TensorFlow GPU をインストールできなかった場合、

error: invalid command 'bdist_wheel'

wheel と tensorflow-gpu をアンイストールしてインストールし直すと、TensorFlow GPU をインストールできました。

pip uninstall wheel
pip install wheel
pip uninstall tensorflow-gpu
pip install tensorflow-gpu

...
Installing collected packages: tensorflow-gpu
Successfully installed tensorflow-gpu-1.13.1