概要
Googleが公開しているオープンソースの人工知能ライブラリTensorFlowをUbuntuにインストールしたときの記録。
CUDA EnableでCIFAR-10のトレーニングを動かすまで。
公式: http://www.tensorflow.org
Git: https://tensorflow.googlesource.com/tensorflow
マシン構成
- OS: Ubuntu 14.04 LTS (64bit)
- Shell: UbuntuデフォルトのBash
- Python 2.7.6
- CPU: i7-3770K CPU @ 3.50GHz
- DDR3 32GB (8GB x 4)
- Mother board: ASUSTeK P8H77-V
- GPU: Nvidia GTX970 (ASUSTek)
- Storage: SSD 128GB (DSSDA-120G-J25C)
セットアップ手順
基本的には公式通りだが自分が行った順番に記録しておく。
(1). Gitからソースツリーの取得
#Gitが入ってない人のみ
$ sudo apt-get install git
$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow
(2). Cuda Toolkit 7.0のインストール
7.5は以降の手順で詰まったので7.0をインストール
下記からUbuntu 14.04 DEB (10KB) ネットワークインストーラー版(cuda-repo-ubuntu1404-7-0-local_7.0-28_amd64.deb)をDL&インストール
https://developer.nvidia.com/cuda-toolkit-70
$ sudo dpkg -i cuda-repo-ubuntu1404-7-0-local_7.0-28_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda-7-0
(3). CUDNN Toolkit 6.5のインストール
CUDNNのDLはNvidiaのサイトで登録する必要あり(しかも登録完了まで2,3日待たされたような気がする)
下記から cuDNN v2 Library for Linux (cudnn-6.5-linux-x64-v2.tgz)をDL&インストール
https://developer.nvidia.com/rdp/cudnn-archive
$ tar xvzf cudnn-6.5-linux-x64-v2.tgz
$ sudo cp cudnn-6.5-linux-x64-v2/cudnn.h /usr/local/cuda/include
$ sudo cp cudnn-6.5-linux-x64-v2/libcudnn* /usr/local/cuda/lib64
ここでリブート
(4). VirtualEnvのインストールとコンテナ作成
#インストール
$ sudo apt-get install python-pip python-dev python-virtualenv
#コンテナ作成
$ virtualenv --system-site-packages ~/tensorflow-GPU
~/tensorflow-GPU/bin/activate を編集
末尾に下記2行を追加する
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64"
export CUDA_HOME=/usr/local/cuda
(5). TensorFlow インストール
CUDAのライブラリパスが変わった場合に一度だけ下記を実効
#(1)で取得したソースディレクトリに移動
$ cd ~/tensorflow/tensorflow
#実効権限付与
$ chmod x+ ./configure
$ ./configure
Do you wish to bulid TensorFlow with GPU support? [y/n] y
GPU support will be enabled for TensorFlow
Please specify the location where CUDA 7.0 toolkit is installed. Refer to
README.md for more details. [default is: /usr/local/cuda]: /usr/local/cuda
Please specify the location where CUDNN 6.5 V2 library is installed. Refer to
README.md for more details. [default is: /usr/local/cuda]: /usr/local/cuda
Setting up Cuda include
Setting up Cuda lib64
Setting up Cuda bin
Setting up Cuda nvvm
Configuration finished
コンテナの有効化
今後、新しいターミナルを立ち上げてtensorflow-GPUコンテナで作業する場合はまず下記で有効化する
$ cd ~/tensorflow-GPU
$ source bin/activate
GPU版 TensorFlow をインストール
(tensorflow-GPU) $ pip install https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl
動かしてみる
(1). MNIST
MNISTを動かそうしたところエラーが出たので(2015/11/15時点)、下記の変更を行う
(tensorflow-GPU) $ cd ~/tensorflow/tensorflow/g3doc/tutorials/mnist/
#置き換えるファイルをリネーム
(tensorflow-GPU) $ mv mnist.py mnist_org.py
# レポジトリから旧版を取得
(tensorflow-GPU) $ wget https://raw.githubusercontent.com/tensorflow/tensorflow/1d76583411038767f673a0c96174c80eaf9ff42f/tensorflow/g3doc/tutorials/mnist/mnist.py
fully_connected_feed.py の 23,24行目を次のようにする
#from tensorflow.g3doc.tutorials.mnist import input_data
#from tensorflow.g3doc.tutorials.mnist import mnist
import input_data
import mnist
動かしてみる
(tensorflow-GPU) $ python fully_connected_feed.py
Extracting data/train-images-idx3-ubyte.gz
Extracting data/train-labels-idx1-ubyte.gz
Extracting data/t10k-images-idx3-ubyte.gz
Extracting data/t10k-labels-idx1-ubyte.gz
I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 8
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:888] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_init.cc:88] Found device 0 with properties:
name: GeForce GTX 970
major: 5 minor: 2 memoryClockRate (GHz) 1.253
pciBusID 0000:01:00.0
Total memory: 4.00GiB
Free memory: 3.22GiB
I tensorflow/core/common_runtime/gpu/gpu_init.cc:112] DMA: 0
I tensorflow/core/common_runtime/gpu/gpu_init.cc:122] 0: Y
I tensorflow/core/common_runtime/gpu/gpu_device.cc:643] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 970, pci bus id: 0000:01:00.0)
I tensorflow/core/common_runtime/gpu/gpu_region_allocator.cc:47] Setting region size to 3144105984
I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 8
Step 0: loss = 2.34 (0.300 sec)
Step 100: loss = 2.13 (0.002 sec)
Step 200: loss = 1.90 (0.002 sec)
Step 300: loss = 1.52 (0.002 sec)
Step 400: loss = 1.22 (0.002 sec)
Step 500: loss = 0.84 (0.002 sec)
Step 600: loss = 0.82 (0.002 sec)
Step 700: loss = 0.68 (0.002 sec)
Step 800: loss = 0.71 (0.002 sec)
Step 900: loss = 0.51 (0.002 sec)
Training Data Eval:
Num examples: 55000 Num correct: 47651 Precision @ 1: 0.8664
Validation Data Eval:
Num examples: 5000 Num correct: 4363 Precision @ 1: 0.8726
Test Data Eval:
Num examples: 10000 Num correct: 8745 Precision @ 1: 0.8745
Step 1000: loss = 0.46 (0.002 sec)
Step 1100: loss = 0.44 (0.038 sec)
Step 1200: loss = 0.52 (0.002 sec)
Step 1300: loss = 0.43 (0.002 sec)
Step 1400: loss = 0.64 (0.002 sec)
Step 1500: loss = 0.34 (0.002 sec)
Step 1600: loss = 0.41 (0.002 sec)
Step 1700: loss = 0.34 (0.002 sec)
Step 1800: loss = 0.30 (0.002 sec)
Step 1900: loss = 0.35 (0.002 sec)
Training Data Eval:
Num examples: 55000 Num correct: 49286 Precision @ 1: 0.8961
Validation Data Eval:
Num examples: 5000 Num correct: 4529 Precision @ 1: 0.9058
Test Data Eval:
Num examples: 10000 Num correct: 9012 Precision @ 1: 0.9012
(2). CIFAR-10
動かしてみる
(tensorflow-GPU) $ cd ~/tensorflow/tensorflow/models/image/cifar10/
(tensorflow-GPU) $ python cifar10_train.py
>> Downloading cifar-10-binary.tar.gz 100.0%
Succesfully downloaded cifar-10-binary.tar.gz 170052171 bytes.
Filling queue with 20000 CIFAR images before starting to train. This will take a few minutes.
I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 8
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:888] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_init.cc:88] Found device 0 with properties:
name: GeForce GTX 970
major: 5 minor: 2 memoryClockRate (GHz) 1.253
pciBusID 0000:01:00.0
Total memory: 4.00GiB
Free memory: 3.20GiB
I tensorflow/core/common_runtime/gpu/gpu_init.cc:112] DMA: 0
I tensorflow/core/common_runtime/gpu/gpu_init.cc:122] 0: Y
I tensorflow/core/common_runtime/gpu/gpu_device.cc:643] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 970, pci bus id: 0000:01:00.0)
I tensorflow/core/common_runtime/gpu/gpu_region_allocator.cc:47] Setting region size to 3120906240
I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 8
2015-11-17 02:14:46.611756: step 0, loss = 4.68 (6.9 examples/sec; 18.481 sec/batch)
2015-11-17 02:14:49.068440: step 10, loss = 4.65 (562.6 examples/sec; 0.228 sec/batch)
2015-11-17 02:14:51.224980: step 20, loss = 4.65 (617.0 examples/sec; 0.207 sec/batch)
2015-11-17 02:14:53.375918: step 30, loss = 4.62 (664.1 examples/sec; 0.193 sec/batch)
2015-11-17 02:14:55.513463: step 40, loss = 4.60 (610.3 examples/sec; 0.210 sec/batch)
2015-11-17 02:14:57.696431: step 50, loss = 4.58 (615.1 examples/sec; 0.208 sec/batch)
2015-11-17 02:14:59.877955: step 60, loss = 4.57 (567.3 examples/sec; 0.226 sec/batch)
2015-11-17 02:15:02.101614: step 70, loss = 4.55 (621.1 examples/sec; 0.206 sec/batch)
2015-11-17 02:15:04.593141: step 80, loss = 4.52 (490.3 examples/sec; 0.261 sec/batch)
2015-11-17 02:15:06.983452: step 90, loss = 4.52 (641.4 examples/sec; 0.200 sec/batch)
2015-11-17 02:15:09.232584: step 100, loss = 4.50 (563.8 examples/sec; 0.227 sec/batch)
2015-11-17 02:15:11.783752: step 110, loss = 4.48 (538.0 examples/sec; 0.238 sec/batch)
2015-11-17 02:15:13.997070: step 120, loss = 4.46 (589.4 examples/sec; 0.217 sec/batch)
2015-11-17 02:15:16.458028: step 130, loss = 4.45 (467.8 examples/sec; 0.274 sec/batch)
2015-11-17 02:15:19.128071: step 140, loss = 4.42 (581.1 examples/sec; 0.220 sec/batch)
2015-11-17 02:15:21.491835: step 150, loss = 4.40 (568.2 examples/sec; 0.225 sec/batch)
2015-11-17 02:15:23.962043: step 160, loss = 4.39 (635.4 examples/sec; 0.201 sec/batch)
...
ちなみにCPU版で実行すると一回のbatchにかかる時間が倍くらいかかるのでGPUを使うことで加速されているようだ
GPU用に tutorials_example_trainer をビルドする
コンテナ環境ではなく通常のシェルで bazel をインストール
# 必要なパッケージのインストール
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
$ sudo apt-get install pkg-config zip g++ zlib1g-dev unzip
# bazel インストーラーをDL
$ wget https://github.com/bazelbuild/bazel/releases/download/0.1.1/bazel-0.1.1-installer-linux-x86_64.sh
# インストール
$ chmod +x bazel-0.1.1-installer-linux-x86_64.sh
$ ./bazel-0.1.1-installer-linux-x86_64.sh --user
~/.bashrc を編集して末尾に下記を追加
export PATH="$PATH:$HOME/bin"
下記のパスにファイルを作成する
~/tensorflow/third_party/gpus/cuda/cuda.config
ファイルの中身は下記
CUDA_TOOLKIT_PATH="/usr/local/cuda"
CUDNN_INSTALL_PATH="/usr/local/cuda"
デフォルト設定でインストールしているとシンボリックリンク /usr/local/cuda (=>/usr/local/cuda-7.0)があるはず
インストールパスを変えてる場合はそれにあわせて変更
ビルド前に ./configure を実行しておく
$ cd ~/tensorflow-GPU
$ source bin/activate
(tensorflow-GPU) $ cd ~/tensorflow
(tensorflow-GPU) $ ./configure
Do you wish to bulid TensorFlow with GPU support? [y/n] y
GPU support will be enabled for TensorFlow
Please specify the location where CUDA 7.0 toolkit is installed. Refer to
README.md for more details. [default is: /usr/local/cuda]: /usr/local/cuda
Please specify the location where CUDNN 6.5 V2 library is installed. Refer to
README.md for more details. [default is: /usr/local/cuda]: /usr/local/cuda
Setting up Cuda include
Setting up Cuda lib64
Setting up Cuda bin
Setting up Cuda nvvm
Configuration finished
ビルド
(tensorflow-GPU) $ bazel build -c opt --config=cuda tensorflow/cc:tutorials_example_trainer
ビルド完了まで10分ほどかかった