広告

Ubuntu 18.04 と NVIDIA GeForce GTX 1050 で TensorFlow with GPU support

ビデオのエンコード/トランスコードのために NVIDIA GeForce GTX 1050 を所有しているのですが、TensorFlow を GPU サポートで実行してみました。

Install TensorFlow on Ubuntu の TensorFlow with GPU support を参考に進めます。Docker を使用することが推奨されていますが、ローカルで試してみました。OS は Ubuntu 18.04.1 です。

全体的な参考資料

CUDA Toolkit

CUDA Toolkit は 9.0 を使用しました。9.0 は既に最新ではないため、アーカイブから入手します。

Ubuntu 18.04 向けのものが無かったため、下記のものをダウンロードしました。

Linux - x86_64 - Ubuntu - 17.04 - deb (local)
Download Installers for Linux Ubuntu 17.04 x86_64
Base Installer

インストールします。

sudo dpkg -i cuda-repo-ubuntu1704-9-0-local_9.0.176-1_amd64.deb
sudo apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install nvidia-libopencl1-340
sudo apt-get -y install cuda-drivers
sudo apt-get -y install ocl-icd-libopencl1
sudo apt-get -y install cuda-drivers
sudo apt-get install cuda-runtime-9-0 cuda-demo-suite-9-0
sudo apt-get install cuda

cuda インストール後、LD_LIBRARY_PATH を設定しておきます。

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

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

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

cuDNN SDK

NVIDIA cuDNN で、まず NVIDIA Developer Program の登録が必要になります。登録後、Archived cuDNN Releases から v7.1.4 をダウンロードしました。

具体的には、下記のアーカイブです。

cuDNN v7.1.4 (May 16, 2018), for CUDA 9.0
cuDNN v7.1.4 Library for Linux

アーカイブをダウンロードし、所定のパスに配置します。

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

Python

システムにインストールされている Python を確認してみます。デフォルトで、Python 2.7 と Python 3.6 が入っていました。

which python
/usr/bin/python

python -V
Python 2.7.15rc1

which python3
/usr/bin/python3

python3 -V
Python 3.6.5

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

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

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

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

仮想環境下には、下記のようなフォルダが作成されます。

ls -la dev
total 28
drwxr-xr-x 6 hirooka hirooka 4096 Aug 24 19:58 .
drwxr-xr-x 3 hirooka hirooka 4096 Aug 24 19:57 ..
drwxr-xr-x 2 hirooka hirooka 4096 Aug 24 19:58 bin
drwxr-xr-x 2 hirooka hirooka 4096 Aug 24 19:57 include
drwxr-xr-x 3 hirooka hirooka 4096 Aug 24 19:57 lib
lrwxrwxrwx 1 hirooka hirooka    3 Aug 24 19:57 lib64 -> lib
-rw-r--r-- 1 hirooka hirooka   69 Aug 24 19:58 pyvenv.cfg
drwxr-xr-x 3 hirooka hirooka 4096 Aug 24 19:58 share

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

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

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

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

python -V
Python 3.6.5

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

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

Jupyter Notebook

pip でインストールできます。

pip install jupyter

パスとバージョンは下記の通りです。jupyter notebook を実行することで、ウェブブラウザで Jupyter Notebook が起動します。デフォルトでは TCP:8888 を使用しているようです。

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

jupyter --version
4.4.0

jupyter notebook

TensorFlow with GPU support

pip でインストールできます。

pip install -U tensorflow-gpu

なお、U オプションを付けない場合、下記のようなエラーとなるかもしれません。

pip install tensorflow-gpu
error: invalid command 'bdist_wheel'

テストコードを実行し、問題ないことを確認します。

import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))

個別事情

自分の環境では、既に ubuntu-drivers autoinstall で NVIDIA のドライバをインストールしていました。後に cuda-drivers をインストールする際にエラーとなるるため、アンイストールしておきました。

ただし、普通に apt-get remove すると

dpkg: error processing archive /var/cache/apt/archives/nvidia-340_340.106-0ubuntu3_amd64.deb (--unpack):
 trying to overwrite '/lib/udev/rules.d/71-nvidia.rules', which is also in package nvidia-kernel-common-390 390.48-0ubuntu3
dpkg-deb: error: paste subprocess was killed by signal (Broken pipe)

のようなエラーとなるため、強制的に行いました。

sudo apt-get -o Dpkg::Options::="--force-overwrite" --fix-broken install
sudo apt autoremove

その過程で出て悩まされたエラーなど。

launchpadlib 1.10.6 requires testresources, which is not installed.

The following packages have unmet dependencies:
 cuda : Depends: cuda-9-0 (>= 9.0.176) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

>>> sess = tf.Session()
2018-06-18 23:07:31.865841: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2018-06-18 23:07:31.870356: E tensorflow/stream_executor/cuda/cuda_driver.cc:406] failed call to cuInit: CUDA_ERROR_NO_DEVICE
2018-06-18 23:07:31.870502: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:158] retrieving CUDA diagnostic information for host: ubuntu
2018-06-18 23:07:31.870548: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:165] hostname: ubuntu
2018-06-18 23:07:31.870709: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:189] libcuda reported version is: 390.48.0
2018-06-18 23:07:31.872627: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:193] kernel reported version is: 390.67.0
2018-06-18 23:07:31.872707: E tensorflow/stream_executor/cuda/cuda_diagnostics.cc:303] kernel version 390.67.0 does not match DSO version 390.48.0 -- cannot find working devices in this configuration

nvidia-smi
Failed to initialize NVML: Driver/library version mismatch

>>> sess = tf.Session()
2018-06-18 23:20:23.229910: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2018-06-18 23:20:23.814176: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:898] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2018-06-18 23:20:23.814500: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1356] 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.90GiB
2018-06-18 23:20:23.814518: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1435] Adding visible gpu devices: 0
2018-06-18 23:20:24.834085: I tensorflow/core/common_runtime/gpu/gpu_device.cc:923] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-06-18 23:20:24.834125: I tensorflow/core/common_runtime/gpu/gpu_device.cc:929]      0
2018-06-18 23:20:24.834131: I tensorflow/core/common_runtime/gpu/gpu_device.cc:942] 0:   N
2018-06-18 23:20:24.835548: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1053] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 1667 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1050, pci bus id: 0000:01:00.0, compute capability: 6.1)

広告

TensorFlow

Posted by admin