焼肉が食べたい

ただの日記です。技術的に学んだことも書こうと思っていますが、あくまで自分用メモです。 プロフィールはこちら。https://chie8842.github.io/aboutme/

p3インスタンス(V100)上でCUDA+CUDNN+Tensorflowを動かすのが大変だったのできろく。

p3で機械学習基盤を作ったのだけれど、いろいろややこしかったのでメモしておく。
ただしこれは2017/11/27現在の状況であって、またそのうち移り変わると思う。

環境

OS: Ubuntu

NVIDIA-DRIVERインストール

普通はこれで入る。

sudo apt-get install nvidia-384

でも、確認すると、これでインストールされるのは、nvidia-384.90
nvidiaのページを見ると、nvidia-384.90はv100をサポートしてない。

NVIDIA DRIVERS Linux x64 (AMD64/EM64T) Display Driver

それで、ちゃんとNVIDIAのホームページからvoltaに対応しているnvidia-384.81をインストールすればいいと思った。

でも実はこれじゃだめだった。
理由はあとで説明する。

CUDAインストール

volta自体は、cuda Toolkit version8.0以前を使って構築されたアプリケーションも、
条件付きで動かすことはできるらしい。

Volta Compatibility Guide :: CUDA Toolkit Documentation

が、面倒くさそう。
あと、cudnn7はcuda8.0だとうまく動かない場合があるらしい。

cuda9にする。
インストールの形式は、
Linux -> x86_64 -> Ubuntu -> 16.04 -> runfile(local)
を選ぶ。
ここでdeb(local)やdeb(network)でインストールをすると、
nvidia-driverのバージョンが384.90にアップデートされてしまう。
nvidia-driverのインストールのところでの「これじゃだめだった。」の理由はこれ。
nvidia-driver単体のインストールは行わず、runfileでインストールすると、
nvidia-driver384.81とcuda9.0のコンビでインストールしてくれる。
f:id:chie8842:20171127191626p:plain

ちなみにcuda8だとこれをうまくやってくれるインストール形式がない。

結局のところのnvidia-driverとcudaのインストール手順は以下。

sudo apt-get update
wget https://developer.nvidia.com/compute/cuda/9.0/Prod/local_installers/cuda_9.0.176_384.81_linux-run
sudo apt-get install -y gcc && sudo apt-get install -y make
sudo sh cuda_9.0.176_384.81_linux-run

nvidia-smiでGPUの動作状況を確認する。

$ nvidia-smi

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.81                 Driver Version: 384.81                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla V100-SXM2...  Off  | 00000000:00:1E.0 Off |                    0 |
| N/A   35C    P0    35W / 300W |      0MiB / 16152MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

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

ついでにPersistence ModeをONにしておく。

$ sudo nvidia-smi -pm 1
Enabled persistence mode for GPU 00000000:00:1E.0.
All done.
$ nvidia-smi
Mon Nov 27 13:19:38 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.81                 Driver Version: 384.81                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla V100-SXM2...  On   | 00000000:00:1E.0 Off |                    0 |
| N/A   37C    P0    21W / 300W |     10MiB / 16152MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

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

cudnnインストール

インストールパッケージ一覧を見ると、cuda9の場合、cudnnのバージョンは7.0.3しかでてこなかったので、cudnn7.0.3をインストールする。
f:id:chie8842:20171127193028p:plain

cudnnのインストールは、tgzファイルをサーバに配置して、以下を実行すればいい。

mkdir -p /usr/local/cuda/lib64
mkdir -p /usr/local/cuda/include
tar xzvf cudnn-9.0-linux-x64-v7.tgz
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
sudo cp cuda/include/cudnn* /usr/local/cuda/include/
sudo ln -sfv /usr/local/cuda/lib64/libcudnn.so.7.0.3 /usr/local/cuda/lib64/libcudnn.so.7

tensorflowインストール

ここまでやって、普通にtensorflowのexampleを動かしてみたけど、
エラーが出る。

apt-get install python3-pip
pip3 install tensorflow-gpu
python3 $HOME/tensorflow/tensorflow/examples/tutorials/mnist/mnist_deep.py
# ImportError: libcublas.so.8.0: cannot open shared object file: No such file or directory

この辺のIssueを見ると、ソースコードをr1.4のソースコードをビルドしないと動かないっぽい。

Upgrade to CuDNN 7 and CUDA 9 · Issue #12052 · tensorflow/tensorflow · GitHub CUDA 9RC + cuDNN7 · Issue #12474 · tensorflow/tensorflow · GitHub

Tensorflowのドキュメントを参考に、ソースコードからビルドする。

すでにtensorflow-gpuをインストールしている場合は、アンインストールする。

sudo pip3 uninstall tensorflow-gpu tensorflow-tenworboard

依存パッケージをいろいろインストール

sudo apt-get -y install python-numpy python-dev python-pip python-wheel
sudo apt-get -y install python3-numpy python3-dev python3-pip python3-wheel
sudo apt-get -y install libcupti-dev

bazel(ビルドツール)インストール

sudo apt-get -y install openjdk-8-jdk
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update && sudo apt-get install oracle-java8-installer
echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
sudo apt-get update && sudo apt-get install bazel
sudo apt-get upgrade bazel

cuda9+cudnn7対応が行われているv1.4.0のタグを指定してtensorflowをgit clone

git clone -b v1.4.0 https://github.com/tensorflow/tensorflow
cd tensorflow

ビルドのオプション設定を行う。
cuda以外のオプションはデフォルトにした。

$ ./configure
You have bazel 0.7.0 installed.
Please specify the location of python. [Default is /usr/bin/python]: /usr/bin/python3.5


Found possible Python library paths:
  /usr/local/lib/python3.5/dist-packages
  /usr/lib/python3/dist-packages
Please input the desired Python library path to use.  Default is [/usr/local/lib/python3.5/dist-packages]

Do you wish to build TensorFlow with jemalloc as malloc support? [Y/n]: 
jemalloc as malloc support will be enabled for TensorFlow.

Do you wish to build TensorFlow with Google Cloud Platform support? [Y/n]: 
Google Cloud Platform support will be enabled for TensorFlow.

Do you wish to build TensorFlow with Hadoop File System support? [Y/n]: 
Hadoop File System support will be enabled for TensorFlow.

Do you wish to build TensorFlow with Amazon S3 File System support? [Y/n]: 
Amazon S3 File System support will be enabled for TensorFlow.

Do you wish to build TensorFlow with XLA JIT support? [y/N]: 
XLA JIT support will be enabled for TensorFlow.

Do you wish to build TensorFlow with GDR support? [y/N]: 
No GDR support will be enabled for TensorFlow.

Do you wish to build TensorFlow with VERBS support? [y/N]: 
VERBS support will be enabled for TensorFlow.

Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]: 
No OpenCL SYCL support will be enabled for TensorFlow.

Do you wish to build TensorFlow with CUDA support? [y/N]: y
CUDA support will be enabled for TensorFlow.

Please specify the CUDA SDK version you want to use, e.g. 7.0. [Leave empty to default to CUDA 8.0]: 7.0.3


Please specify the location where CUDA 7.0.3 toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:


Invalid path to CUDA 7.0.3 toolkit. /usr/local/cuda/lib64/libcudart.so.7.0.3 cannot be found
Please specify the CUDA SDK version you want to use, e.g. 7.0. [Leave empty to default to CUDA 8.0]: 9.0


Please specify the location where CUDA 9.0 toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:


Please specify the cuDNN version you want to use. [Leave empty to default to cuDNN 6.0]: 7.0.3


Please specify the location where cuDNN 7.0.3 library is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:


Please specify a list of comma-separated Cuda compute capabilities you want to build with.
You can find the compute capability of your device at: https://developer.nvidia.com/cuda-gpus.
Please note that each additional compute capability significantly increases your build time and binary size. [Default is: 7.0]7.0


Do you want to use clang as CUDA compiler? [y/N]: 
nvcc will be used as CUDA compiler.

Please specify which gcc should be used by nvcc as the host compiler. [Default is /usr/bin/gcc]:


Do you wish to build TensorFlow with MPI support? [y/N]: 
No MPI support will be enabled for TensorFlow.

Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]: 


Add "--config=mkl" to your bazel command to build with MKL support.
Please note that MKL on MacOS or windows is still not supported.
If you would like to use a local MKL instead of downloading, please set the environment variable "TF_MKL_ROOT" every time before build.
Configuration finished

ビルドを行う前に、共有ライブラリパスにcudaのディレクトリを追加する。
再起動しても設定を保持してほしいので、/etc/ld.so.confに書き込む。

echo "/usr/local/cuda/lib64" >> /etc/ld.so.conf
sudo ldconfig

ビルドの実行

bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

上記実行すると、/tmp/tensorflow_pkg配下にwhlファイルができている。
これをインストールする。

sudo pip3 install /tmp/tensorflow_pkg/tensorflow-1.4.0-cp35-cp35m-linux_x86_64.whl

ソースコードビルドするのが面倒な人向けに、cuda9+cudnn7.0.3向けにビルドしたバイナリを以下においてみた。

github.com

あらためて、Tensorflowのexampleを実行してみる。

python3 $HOME/tensorflow/tensorflow/examples/tutorials/mnist/mnist_deep.py
...
2017-11-27 12:54:46.049508: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:900] 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-11-27 12:54:46.049967: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1064] Found device 0 with properties:
name: Tesla V100-SXM2-16GB major: 7 minor: 0 memoryClockRate(GHz): 1.53
pciBusID: 0000:00:1e.0
totalMemory: 15.77GiB freeMemory: 15.36GiB
2017-11-27 12:54:46.049991: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1154] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0000:00:1e.0, compute capability: 7.0)
step 0, training accuracy 0.1
step 100, training accuracy 0.82
step 200, training accuracy 0.9
step 300, training accuracy 0.88
step 400, training accuracy 0.9
step 500, training accuracy 0.96
...

ちゃんとGPUを使って動いた。