割りと面倒だったのでメモ。走り書き同然なので注意。そのうち別記事で書き直すかも。
Web+DB Press 2015 10月号の深層学習のサンプルで使用しているChainerのインストール指示に、CUDAなるものもオプションっぽく記述されていたのでインストールしようとした。もちろんHomebrewベース。
普段pythonを使ってないので、いろいろ調べて回るはめになった。普段pythonを使ってない人向けに手順を残す。
環境構築以前の手順
- 以下を実行して深層学習のサンプルコードをGithubから取得。それにしても技評のページ、ナビゲーションがすごくやりにくくていろいろ残念。
git clone https://github.com/mrkn/webdb_deep_learning.git
Python環境をAnacondaに完全に置き換える
サンプルをチェックすると、ドキュメントがipynb (iPython Notebook) 形式のマークアップで書かれている。以前にPythonをhomebrewでインストールしてはあるけれど、後述のトラブルのからみもあるので、この際既存の半端なPythonはbrew uninstall python
で削除し、その代わりにAnacondaというPythonの科学技術計算用開発環境を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をインストールを参考にしました。ありがとうございます)
CUDA は NVIDIAが出しているGPUライブラリ。現時点では7.5が最新。最終的に以下の手順でCUDA7.5をインストールした。今時コマンドパスとかを手動で書き換えるとか極力したくないので、可能な限りHomebrewベース。
- Command Line Tools をインストール(El Capitan用の手順を使う)
-
Boost(C言語の数値計算ライブラリ)をインストール(
brew install boost
) - CUDAをインストール(
brew install Caskroom/cask/cuda
)。実行するとGUIインストーラが起動するので全部インストール。その時点の最新のCUDAを取得できるので助かる。
(HomebrewでCaskroomを使うにはこちらの記事を参照)
- 以下のパスだけは手動で追加する必要がある。~/.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のインストールはくだすれが乱立するほどいろいろと厄介な様子。
とりあえずここまでメモ。
追記: こちらの記事によると、pythonのバージョンに気を付けなければならない様子。やばい、はまりつつある...この記事読んで出直したほうがいいのかも。
その後
上のエラーは、自分の.bashrcにあった以下の行に邪魔されていたのが原因だったことがわかった。記述そのものというより、この二重引用符が問題を引き起こしてたっぽい。
export 'ARCHFLAGS="-arch x86_64"'
この行は「Postgresql用」と自分がコメントしていたけど最早目的が思い出せない。とにかく上の行をコメントアウトし、新しいシェルインスタンスでpip install chainer_cuda_deps
を実行したら今度こそ成功した。
はあ、一日つぶした。
さらにその後
しかしipython notebook chap_02.ipynb
でブラウザに開いたノート上のコード、どうやって実行するんだろうと小一時間悩む。ipython
がどうもirbみたいなものらしいとわかってコードを貼り付けても片っ端からエラーになる。何だこれ。
と思っていたら、何とipython notebook上のコードは「ブラウザで実行できる」のであった。[Run]ボタンを押せば、上からコードを順に実行できることがやっとわかった。
そして今度はimport cuda
のところで謎のエラーが発生。悩んだ末、pip install chainer_cuda_deps
に--update
オプションを追加して強制的に再インストールしたら今度こそ動いた。やった。
RubyやGoとだいぶカルチャーが違ってて、しょうもないところで時間使った。ふひい。
ところでこのipython notebookをRubyに移植したっぽいiRubyというのもあるみたいけど、こういうのは移植じゃなくてネイティブである方がいい気がする。
と思ったら、jupyterというところがこのnotebookの一般性を高めようとしていることをついでに知った。これ、急速に普及するかも。