TensorFlow(GPU対応)をMacにインストール

# 概要
GPU対応版のTensorFlowをMacBook Proにインストールする手順。(2016/10/29 時点)
Mac用には、GPU対応のバイナリが無いので、ソースからビルドします。

# 環境
- MacBook Pro (Mid 2012) with NVIDIA GeForce GT 650M 1024 MB
- OS X El Capitan
- Xcode 7.3  command-lineツールもインストール済
- homebrewはインストール済み
- pythonの環境 Anaconda-4.0.0

---

# 手順

## Anaconda

Anaconda Navigator で、tensorflow environmentを作成し、terminalを起動
もし、起動しない場合は、こちらを参照
- http://qiita.com/y__sama/items/f732bb7bec2bff355b69

---

## cudaインストール

```
$ brew cask install cuda
....
$ brew cask info cuda
cuda: 8.0.47
```
cuDNNをダウンロードしインストール（ファイル移動）します。
https://developer.nvidia.com/cuda-toolkit-31-downloads#MacOS
(NVIDIA Developer Programのアカウントを作る必要があります)
展開後、lib, include 以下のファイルを/usr/local/cuda以下に移動します。

---

```
$ sudo mv -v cuda/include/cudnn.h /usr/local/cuda/include/
cuda/include/cudnn.h -> /usr/local/cuda/include/cudnn.h
$ sudo mv -v cuda/lib/libcudnn* /usr/local/cuda/lib/
cuda/lib/libcudnn.5.dylib -> /usr/local/cuda/lib/libcudnn.5.dylib
cuda/lib/libcudnn.dylib -> /usr/local/cuda/lib/libcudnn.dylib
cuda/lib/libcudnn_static.a -> /usr/local/cuda/lib/libcudnn_static.a
```
---

環境変数を設定します。.bash_profileや.bashrcなど。

```
export PATH=/usr/local/cuda/bin:$PATH
export DYLD_LIBRARY_PATH=/usr/local/cuda/lib:$DYLD_LIBRARY_PATH
```

CUDAのインストールを確認するため、公式の説明を参考に、サンプルコードが動くか確認します。
https://www.tensorflow.org/versions/r0.11/get_started/os_setup.html#optional-setup-gpu-for-mac
deviceQueryを実行すると、GPUが見つかります。

---

```
$ ~/Documents/cuda-samples/bin/x86_64/darwin/release/deviceQuery
xxxxx/Documents/cuda-samples/bin/x86_64/darwin/release/deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "GeForce GT 650M"
  CUDA Driver Version / Runtime Version          8.0 / 8.0
  CUDA Capability Major/Minor version number:    3.0
  Total amount of global memory:                 1024 MBytes (1073414144 bytes)
.....省略
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GeForce GT 650M
Result = PASS
$
```
---

## TensorFlowのインストール

### ダウンロード (git clone)

```
$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow
```

---

### configure

configure中の質問で、Please note that each additional compute capability significantly increases your build time and binary size. という質問に GeForce GT 650M の場合、3.0　を指定します。

configureの不具合かわからないが、/usr/local/cuda/lib 以下で、libcudnn5.dylib -> libcudnn.5.dylib とシンボリックリンクを作っておく必要がありました。

下記の2点のみconfigureのデフォルトから変更しました。

---

```
$ ./configure
....
Do you wish to build TensorFlow with GPU support? [y/N] y
....
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: "3.5,5.2"]: 3.0
....
$
```
---

### ビルドからインストールまで

ビルド環境の不具合かわかりませんが、ビルド開始前にシンボリックリンクを張っておく必要がありました。

```
$ cd /usr/local/lib
$ sudo ln -s ../cuda/lib/libcudart.8.0.dylib .
```

---

ビルドは結構時間がかかります。また、CPUは100% clang が使い切ります。

```
$ bazel build -c opt --config=cuda //tensorflow/cc:tutorials_example_trainer
$ bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
$ pip install --ignore-installed six /tmp/tensorflow_pkg/tensorflow-{環境依存}.whl
```
---

### サンプル(mnist)実行

なぜか、Anacondaから起動するshellでは、環境変数DYLD_LIBRARY_PATHが設定されてないので、手動で設定します。

```
$ export DYLD_LIBRARY_PATH=/usr/local/cuda/lib:/usr/local/lib
```

サンプルのmnistを実行すると、GPUを認識してくれました。
CPUのみと比較してだいぶ速くなっている気がします。

---

```
$ cd {インストールされたフォルダ}/tensorflow/models/image/mnist/
$ python convolutional.py
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcublas.8.0.dylib locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcudnn.5.dylib locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcufft.8.0.dylib locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcuda.1.dylib locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcurand.8.0.dylib locally
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
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/stream_executor/cuda/cuda_gpu_executor.cc:901] OS X does not support NUMA - returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:944] Found device 0 with properties: 
name: GeForce GT 650M
major: 3 minor: 0 memoryClockRate (GHz) 0.9
pciBusID 0000:01:00.0
Total memory: 1023.69MiB
Free memory: 354.47MiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:965] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1034] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GT 650M, pci bus id: 0000:01:00.0)
Initialized!
Step 0 (epoch 0.00), 19.6 ms
Minibatch loss: 8.334, learning rate: 0.010000
Minibatch error: 85.9%
Validation error: 84.6%
Step 100 (epoch 0.12), 62.7 ms
Minibatch loss: 3.255, learning rate: 0.010000
Minibatch error: 4.7%
Validation error: 7.4%
Step 200 (epoch 0.23), 63.2 ms
Minibatch loss: 3.338, learning rate: 0.010000
Minibatch error: 10.9%
Validation error: 4.6%
....
```
---

なぜか、もう一回実行しようとするとエラーになるので、再度実行するときは、またNavigatorからtensorflow environmentのshellを起動し、環境変数を設定してから、実行します。


# 参照、参考 (Special Thanks)
- http://qiita.com/tawago/items/68bef63d8bb02797c669
- http://qiita.com/emonuh/items/e6f9d8d846ef5e93f1ac
- https://blog.spot-corp.com/ai/2016/07/19/tensorflow_gpu_for_mac.html
- https://gist.github.com/ageitgey/819a51afa4613649bd18
- http://datalove.hatenadiary.jp/entry/python/anaconda/install-tensorflow-into-anaconda-environment
- http://qiita.com/y__sama/items/f732bb7bec2bff355b69