Mac (El Capitan) + Homebrew で CUDA 7.5 をインストールする手順

割りと面倒だったのでメモ。走り書き同然なので注意。そのうち別記事で書き直すかも。

[Web+DB Press 2015 10月号](https://gihyo.jp/dp/ebook/2015/978-4-7741-7713-7)の深層学習のサンプルで使用しているChainerのインストール指示に、CUDAなるものもオプションっぽく記述されていたのでインストールしようとした。もちろんHomebrewベース。

普段pythonを使ってないので、いろいろ調べて回るはめになった。普段pythonを使ってない人向けに手順を残す。

# 環境構築以前の手順

* 以下を実行して深層学習のサンプルコードを[Github](https://github.com/mrkn/webdb_deep_learning/)から取得。それにしても技評のページ、ナビゲーションがすごくやりにくくていろいろ残念。

`git clone https://github.com/mrkn/webdb_deep_learning.git`

## Python環境をAnacondaに完全に置き換える

サンプルをチェックすると、ドキュメントがipynb (iPython Notebook) 形式のマークアップで書かれている。以前にPythonをhomebrewでインストールしてはあるけれど、後述のトラブルのからみもあるので、この際既存の半端なPythonは`brew uninstall python`で削除し、その代わりに[Anaconda](http://pychef.hateblo.jp/entry/2014/08/20/112352)というPythonの科学技術計算用開発環境を[pyenv](https://github.com/yyuu/pyenv)と[virtualenv](https://github.com/yyuu/pyenv-virtualenv)で作り直すことにした。

* `brew install pyenv-virtualenv` （これでpyenvも一緒にインストールされる）
* .bashrcに以下を追加し、`source ~/.bashrc`を実行してリロード

> if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
export PYENV_ROOT=/usr/local/var/pyenv
if which pyenv-virtualenv-init > /dev/null; then eval "$(pyenv virtualenv-init -)"; fi

(ネット上の情報でパスが`/usr/local/opt/pyenv`になっているのは古かった)

* `pyenv install anaconda-2.3.0`（かなり時間がかかるので注意）
* `pyenv versions`を実行して、systemの他にanaconda-2.3.0も表示されることを確認
* pythonを使うディレクトリに移動し、`pyenv local anaconda-2.3.0`を実行すると、そのディレクトリ以下でanacondaのPythonがアクティベートされ、シェルのプロンプトに`(root)`と追加される。その他のディレクトリではシステムのPythonが使われる。

Python 2系と3系の違いが甚だしくいろいろ混乱しているらしいと聞きかじっていたので、3.xではなく、やや安全そうな2系にしてみた。

それが終わったらサンプルディレクトリで以下を実行すると、ipythonのサーバーが起動してブラウザにドキュメントが表示される。不要になったら普通にCtrl-Cキーでサーバーを殺せばよい。
`ipython notebook chap_02.ipynb`

# 環境構築
やっとのことで表示できた環境構築方法には以下のように書かれている。

>  このノートブックの内容をお手元のコンピュータ上で再現するために必要な環境は、以下のコマンドを実行することで構築できます。
`$ pip install -r requirements.txt`
CUDA を使用できる場合は以下のコマンドも実行してください。
`$ pip install chainer_cuda_deps`

最初のコマンドは問題なくできた（というか「もう全部入ってますよ！」とメッセージが出た）。問題は次のCUDA。そのままだとエラーでインストールできない。なくてもよさそうだけど、せっかくなのでインストールしたい。

# CUDA のインストール

（主に[Mac OSX 10.10 (Yosemite)にpycudaをインストール](http://sukehirodiary.seesaa.net/article/422737834.html)を参考にしました。ありがとうございます）

[CUDA](http://www.nvidia.co.jp/object/cuda-jp.html) は NVIDIAが出しているGPUライブラリ。現時点では7.5が最新。最終的に以下の手順でCUDA7.5をインストールした。今時コマンドパスとかを手動で書き換えるとか極力したくないので、可能な限りHomebrewベース。

* Command Line Tools をインストール（[El Capitan用の手順](http://qiita.com/marmot1123/items/688adc739eacf67ddb7d)を使う）
* [Boost](http://www.boost.org/)（C言語の数値計算ライブラリ）をインストール（`brew install boost`）
* CUDAをインストール（`brew install Caskroom/cask/cuda`）。実行するとGUIインストーラが起動するので全部インストール。その時点の最新のCUDAを取得できるので助かる。

（HomebrewでCaskroomを使うには[こちらの記事](http://qiita.com/ryurock/items/1432578d364985f6cb06)を参照）

* 以下のパスだけは手動で追加する必要がある。~/.bashrc を編集し、以下を追加してからコマンドラインで`source ~/.bashrc`を実行して読み込ませる。CUDAをHomebrewでインストールしておけばパスはCUDAのバージョンに依存しないので助かる。

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

# CUDAの動作確認

先のページに合わせて`/Library/Developer/CommandLineTools`の下にあるサンプルを動かしてみようとするが、サンプルはビルドされていない。置き場所の都合上パーミッションがきついので、`cd /Developer/NVIDIA/CUDA-7.5/samples/1_Utilities/deviceQuery`してから`sudo make`すると、今度はXCodeがないと言われた。

XCodeでかいから入れたくないんだよな...今まではCommand Line Toolsだけでしのいでいたけど、仕方ないのでApp Storeからインストール。

しかし`pip install chainer_cuda_deps`を実行するとエラー。

>  clang -fno-strict-aliasing -fno-common -dynamic -fwrapv -Wall -O3 -DNDEBUG "-arch x86_64" -DBOOST_PYTHON_SOURCE=1 -DHAVE_CURAND=1 -DPYGPU_PACKAGE=pycuda -DBOOST_THREAD_DONT_USE_CHRONO=1 -DPYGPU_PYCUDA=1 -DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION=1 -DBOOST_THREAD_BUILD_DLL=1 -Dboost=pycudaboost -DBOOST_ALL_NO_LIB=1 -Isrc/cpp -Ibpl-subset/bpl_subset -I/usr/local/cuda/include -I/usr/local/lib/python2.7/site-packages/numpy/core/include -I/usr/local/include -I/usr/local/opt/openssl/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c src/cpp/cuda.cpp -o build/temp.macosx-10.10-x86_64-2.7/src/cpp/cuda.o
  clang: error: no such file or directory: '"-arch'
  clang: error: no such file or directory: 'x86_64"'

たまたま気付いたけど、CUDAのインストールは[くだすれ](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=%E3%81%8F%E3%81%A0%E3%81%99%E3%82%8C%E3%81%A8%E3%81%AF)が乱立するほどいろいろと厄介な様子。

とりあえずここまでメモ。

追記: [こちらの記事](https://gist.github.com/yusuketomoto/da4ab182c1693fc3995e)によると、pythonのバージョンに気を付けなければならない様子。やばい、はまりつつある...[この記事](http://qiita.com/jjongs08/items/521eddea150795749711)読んで出直したほうがいいのかも。

# その後

上のエラーは、自分の.bashrcにあった以下の行に邪魔されていたのが原因だったことがわかった。記述そのものというより、この二重引用符が問題を引き起こしてたっぽい。

> export 'ARCHFLAGS="-arch x86_64"'

この行は「Postgresql用」と自分がコメントしていたけど最早目的が思い出せない。とにかく上の行をコメントアウトし、新しいシェルインスタンスで`pip install chainer_cuda_deps`を実行したら今度こそ成功した。

はあ、一日つぶした。

# さらにその後

しかし`ipython notebook chap_02.ipynb`でブラウザに開いたノート上のコード、どうやって実行するんだろうと小一時間悩む。`ipython`がどうもirbみたいなものらしいとわかってコードを貼り付けても片っ端からエラーになる。何だこれ。

と思っていたら、何とipython notebook上のコードは「ブラウザで実行できる」のであった。[Run]ボタンを押せば、上からコードを順に実行できることがやっとわかった。

<img width="1218" alt="ipython_notebook.png" src="https://qiita-image-store.s3.amazonaws.com/0/20266/42a8a60f-50ca-14eb-2c08-1a4bcbc01640.png">

そして今度は`import cuda`のところで謎のエラーが発生。悩んだ末、`pip install chainer_cuda_deps`に`--update`オプションを追加して強制的に再インストールしたら今度こそ動いた。やった。

RubyやGoとだいぶカルチャーが違ってて、しょうもないところで時間使った。ふひい。

ところでこのipython notebookをRubyに移植したっぽい[iRuby](http://qiita.com/domitry/items/aa348caf993e876a7be5)というのもあるみたいけど、こういうのは移植じゃなくてネイティブである方がいい気がする。

と思ったら、jupyterというところがこの[notebookの一般性を高めようとしている](http://qiita.com/tanemaki/items/7c74b35505dc372bc9c6)ことをついでに知った。これ、急速に普及するかも。 

# 参考

- [mrkn/webdb_deep_learning](https://github.com/mrkn/webdb_deep_learning/)
- [Mac OSX 10.10 (Yosemite)にpycudaをインストール](http://sukehirodiary.seesaa.net/article/422737834.html)
- [CUDA Toolkit 7.0 Manual](http://docs.nvidia.com/cuda/cuda-getting-started-guide-for-mac-os-x/#axzz3pS5ouSVf)
- [CUDA Forum](https://devtalk.nvidia.com/default/topic/503068/no-nvcc-after-installing-toolkit/)