iMacにGPU版tensorflowをインストール。を挫折するまで。

# 環境

iMac, Late 2012
macOS High Sierra 10.13.4
CPU: 2.7GHz intel Core i5
GPU: NVIDIA GeForce GT 640M 512MB
GPU Driver Version: 355.11.10.10.30.120

卒論でDeep Learningを扱うため、研究室のNVIDIA製GPUを積んでいるマシンでGPU版tensorflowを使えるようにセットアップしようと試みました。
まぁ、今さっきメキメキっと音を立てて心が折れたところなんですけど。。。
結論(推論)からいいますと、おそらく今回のGPUドライバのバージョンに対応するバージョンのCUDAドライバをNVIDIAが提供していないのではないかと思われます。正しくセットアップできる方法をご存知の方！お願いします！教えてください！

# CUDA ドライバ＋ツールキットをインストール
基本的に以下の記事を参考に進めました。
1. [Python: Keras/TensorFlow の学習を GPU で高速化する (Mac OS X)](https://blog.amedama.jp/entry/2017/02/26/120215)
2. [TensorFlowのGPU版をMacに対応させる](https://blog.spot-corp.com/ai/2016/07/19/tensorflow_gpu_for_mac.html)

上記の記事には以下のコマンドでcudaがインストールできると書いてあるのですが、現在はcuda->nvidia-cudaとなっているようですのでご注意を。

```
$ brew install coreutils
$ brew cask install cuda //今はない
=>
$ brew cask install nvidia-cuda  //こちらで
```

または[NVIDIAのサイト](https://developer.nvidia.com/cuda-toolkit-archive)からインストールできます。
ここでバージョンは[こちら(tensorflowのサイト)に](https://www.tensorflow.org/install/source)、CUDA8、cuDNN5.1はテスト済みだと書いてあったのでそちらのバージョンを選びました。

# cuDNN をダウンロード
CUDAバージョンに合うcuDNNを[こちらから](https://developer.nvidia.com/rdp/cudnn-archive)ダウンロード。なお、会員登録が必要です。

それらを解凍して、/usr/local/cuda以下のファルダに入れます。

```
$ sudo mv ~/Download/include/* /usr/local/cuda/include/
$ sudo mv ~/Download/lib/* /usr/local/cuda/lib/
```

# tensorflow-gpuをpipでインストール

```
$ pip install tensorflow-gpu
```

ここで僕はtensorflowをインポートした時にLibrary not loaded: @rpath/libcublas.8.0.dylibというエラーがでてものすごいハマりました。
これはシンボリックリンクが上手く貼れていないために生じているようです。
ググるとOSXのセキュリティシステムのSIPがどうとかLD_LIBRARY_PATH(今は[El Capitan では LD_LIBRARY_PATH, DYLD_LIBRARY_PATH が環境変数にならない](https://qiita.com/junkoda/items/78c726b06afe2a9d3930)だそうです)とかがどうとか出てきます。僕はそれらやっても解決しませんでしたが、以下のコマンドで解決しました。結構な力技ですね。笑

```
$ ln -s /usr/local/cuda/lib/* /usr/local/lib/
```

これでOK!いざ高速計算！！ひゃっほーーーい！！

# 計算実行ー＞遅い！
なんで！？
ん〜。。。

# GPU対応tensorflowを野良buildしてインストール
CUDAとかOSとかのバージョンの問題なのかな、と思い。以下の記事を参考にtensorflowを自前でビルドしました。
[MacでGPU(cuda)が使えるtensorflowをビルドする](https://qiita.com/74th/items/fc6ebb684c23f3655e7c)

基本的に上記の手順にしたがえばOKですが、cuDNNのファイルへのリンクを通しておかないとエラーが出ます。また場合によっては
Linking of rule '//tensorflow/python:_pywrap_tensorflow_internal.so' failed
というエラーが出るので、[ここに](https://github.com/tensorflow/tensorflow/issues/15172)
書いてあるようにtensorflow/third_party/gpus/cuda/BUILD.tplファイルのlinkopts = [“-lgomp”]をコメントアウトしてください。

buildは1時間ぐらいかかります。

# 確認->GPU認識してないフザケンナ！
ようやくtensorflowを再インストールして高速計算だ！！と思いきやまたもや遅い！怒

[TensorFlowからGPUが認識できているかを2行コードで確認する](http://thr3a.hatenablog.com/entry/20180113/1515820265)
の方法で確認してみてもCPUしか認識していない！ちっっっっっっっくしょ〜〜〜〜〜！！

# CUDAの動作確認->ダメじゃん！
というかそもそもCUDAドライバがダメなんじゃないかと思いまして、CUDA sampleから確認。

```
$ cd /Developer/NVIDIA/CUDA-9.1/samples/1_Utilities/deviceQuery
$ sudo make
$ ./deviceQuery

=>
./deviceQuery Starting...

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

cudaGetDeviceCount returned 35
-> CUDA driver version is insufficient for CUDA runtime version
Result = FAIL
```

。。。ダメじゃん！！！最初っからダメだったんじゃん！！

# 原因
[Python CUDA on MacBookPro](https://hondou.homedns.org/pukiwiki/pukiwiki.php?Python%20CUDA%20on%20MacBookPro)
上記の記事によると、GPU Driver VersionとCUDA Driver Versionを統一しなければならないらしい。じゃあ、NVIDIAのサイトからバージョン探してダウンロードしちゃえばいいんだ！と探してみるも、、、ない！！！なんてっこったパンナコッタ！！！圧倒的にMacOS対応のドライバがない！！！サポートやめてるっぽい！！

GPU Driverよりバージョンの低いCUDA Driverならイケるんじゃないかと試してみたりもしましたが、それもダメでした。涙
そんなこんなで挫折しましたので、対応方法を知っている方がいれば是非お教えください。（土下座）