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のコンビでインストールしてくれる。
ちなみに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 +-----------------------------------------------------------------------------+ | 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をインストールする。
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向けにビルドしたバイナリを以下においてみた。
あらためて、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を使って動いた。