うずまき2017 powered by Jun-Systems

耳管開放症, SAS, 統計解析, 人工知能, プログラミングそれに思考

*

PythonでDeepNetを使う インストール編

      2016/08/09

Chainer? TensorFlow? わかってるんですよそんなことは。なぜかPython上で今度はdeepnetに手を出さなければならなくなってしまったのですが、これがまたインストールがクッソ面倒だったので、プロセスを書き記しておきます。ChainerやTensorFlowが出てきてしまった今、もはやDeepNetに需要はないのかネットに本当に情報がなくてびっくりした。まあ、だからこそこうやって手順を公開する意義があるわけですが。

とりあえず僕の環境をちゃんと書いておきます。

環境:
iMac (27-inch, Late 2013)
OS X El Capitan (version: 10.11.5)
3.5GHz Intel Core i7クアッドコア
32GB 1600MHz RAM
NVIDIA GeForce GTX 775M 2048 MB

DeepNetとは

おそらくエラー内容でググってやってくる人が大半だと思うので今さら詳しくは書きませんが、DeepNetはToronto UnivのNitish SrivastavaさんのDeep Learningフレームワークで、Pythonで走ります。導入は基本的には公式のINSTALLATION (https://github.com/nitishsrivastava/deepnet/blob/master/INSTALL.txt) に従うだけです。だけなのですが、それでも何回か詰んでやめようかと思いながらやっとできたので、社会貢献だと思って公開します。環境としてはMac OS XのEl Capitanで、virtualenv上に構築していきます。色々読んでると、たぶんLinuxに構築するのが一番ラクだと思います。

virtualenvで環境の作成とファイルの準備

virtualenvでの環境の作り方については絶対にそこらじゅうに書いてるはずなので専門的なページに譲りますが、とりあえず

cd ~
virtualenv dnn
cd dnn
source bin/activate

みたいな感じでvirtualenvの環境を作ってactivateしておく。

pip install --upgrade pip

色々詰め込むにあたって、あらかじめpipをupgradeしておかないとscipyのインストール中にエラーが出て一向に終わらなかったりする

アップグレードができたら、後々必要になるものまで含めてpipでまとめて入れます

pip install numpy scipy theano matplotlib nose protobuf

ただし、pipに入ってるdeepnetは入れませんでした。(ポイント)
なんか色々とやるべきことがある中で、どこまでインストールしてくれるのか若干の不安があったりもしたので。そして、GitHubにあがってるdeepnetのリポジトリにはcudamatなど必要なものが一緒に入ってるのでそっち使ったほうがいいです。

virtualenvで作った環境の直下に

cd ~/dnn
git clone https://github.com/nitishsrivastava/deepnet

で最新のリポジトリを持ってきます。

CUDA SDKのインストール

CUDA ToolkitはNVIDIAにて無料で公開されているので、アカウントを作って
CUDA TOOLKIT | NVIDIA
この辺で自分の環境に合わせたものを落とす。
最初、今使ってるMacBookに試しに入れて動かしてみようと思ったら全く動かなくて「は???動かねえじゃん」とか思ってたら使ってたGPUがAMD Radeon HDだったというバカすぎるミスを犯したので、対応製品は事前に確認しておきましょう。

パスを通す

インストールしたら、 ~/.bash_rcとかを開くなり作るなりしてパスを通す(以下設定例)

export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib

ものによっては/cuda-x.x/みたいにバージョンが入ってたりlib64になってたりするのですが、よくわからなければ実際にMacintosh HD直下の隠しフォルダからusr/local/cudaあたりを探索してみればいいです。

追加したらTerminalから

source ~/.bashrc

で読み直すなどしないと、下のcuda-matのインストール時にnvccがないとか怒られます。(nvcc command not foundとかなんか色々ある)
nvccはNVIDIA CUDA Compilerという名の通りコンパイラです。

cudamatのインストール

git cloneで引っ張ってきたdeepnetの中のフォルダcudamatに必要なものが揃っています。そこのINSTALL.txtに大体書いてあって、CUDAと関連ライブラリさえインストールされていれば基本的にはフォルダ上でmakeするだけですが、以下の2つは確認しないとたぶんmakeが通りません。

cudamatのフォルダ上でmakeする前に

1 自分のGPUに合わせてmakefileをいじる
cudamatのフォルダ内にmakefileがあるので、中をいじっておく。いじらないと、make時に “nvcc fatal unsupported gpu architecture conpute_10” のエラーが出る。(でも先に試しにmakeしてからエラー内容を見た方がたぶん楽)
日本語関係だとこの辺りで簡単な説明(Geforce GTX 9xx 用の CUDA)

僕の場合はこの設定で通りました
Unsupported GPU architecture | GitHub
https://github.com/nitishsrivastava/deepnet/issues/82

2 cudamat_conv_kernels.cuhをいじる
僕が古いものを持ってきただけかもしれませんが、上の修正後に正しくmakeできるかと思いきや、
./cudamat_conv_kernels.cuh(439): error: identifier “uint” is undefined
のエラーが出ました。その場合は、cudamat_conv_kernels.cuh内のuintを全てunsignedに置換すれば通るようになります(他の単語で部分的にuintを含むものはないようなので全置換で大丈夫です)

対策(英語)
Install Deepnet on Mac | Vanessa’s imiloa
https://imiloainf.wordpress.com/2013/11/15/install-deepnet-on-mac/

cudamat_convもすでにフォルダ内に含まれているというのに、最初それに気づかず自分で別でcudamat_convを用意してコンパイルしようとするなどにより一向に動かなかった。実際にはもう入ってました。最高ですね。

一式準備ができたら、

cd ~/dnn/deepnet/cudamat
make

でmakeしておきましょう。

またパスを通す

pipとか通さずにdeepnetをインストールしたので、import時にPythonがdeepnet, cudamat, cudamat_conv, eigenmatを見つけられるようディレクトリをパスに追加します。(思いつきですけど、これって今のフォルダのエイリアスをvirtualenv内のsite-packagesに貼るとかじゃダメなんですかね。誰か教えてください。)

export PYTHONPATH = $HOME/dnn/deepnet

僕は既存のパス設定がミスっており上書きしたかったのでこんな風ですが、既存のパスに今回のディレクトリを追加したい場合には

export PYTHONPATH = $PYTHONPATH:$HOME/dnn/deepnet

とかでいいんじゃないですかね。

パスが登録されたかどうかを見たい場合には、terminal上で

echo $PYTHONPATH

を叩けば登録されたパス一覧が吐かれます。

後はcudamat関連の動作テストに関しては、cudamatフォルダ内にテストファイルがあるので、

python test_cudamat.py

で走らせてエラーがでなければOKです。

もしTerminal上でPythonのインタプリタを呼び出している状態で

>>import deepnet
>>import cudamat
>>import cudamat_conv

でエラーが出たら、上記のどこかしら間違っているので確認してみるといいです。

eigenmatについて

上のimportに加えて、もし
>>import eigenmat
でeigenmatを呼び出した時に
OSError: dlopen(libeigenmat.dylib, 6): image not found
とかエラーが出た場合には、~/dnn/deepnet/eigenmat内に、”lineigenmat.dylib”というファイルがないか探してみてください。もしあったら、それを”libeigenmat.dylib”にリネームしてください。それで大体は解決しますし、解決しなければeigenmatを何かしらのパスに通さないといけないっぽいです。後述。

eigen自体をまず入れる必要がある場合は、
Eigen
http://eigen.tuxfamily.org/

この辺りからダウンロードして、フォルダ開いてcmakeします。(そもそもcmake: command not foundになる場合にはcmakeが入っていないので入れましょう)
Cmake からLatest stable versionのcmake.appを落とします。開いたCmake.appの中にご丁寧にHow to install For Command Line Useという項目がありますが、要はPATHを通せばいいのです。自力でPATHを通すのが嫌なら、書いてある通り

sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install

でいいです。

cmakeはsource directoryとbuild directoryを分けるので、eigenの上のディレクトリで

mkdir eigen-build
cmake eigen-build eigen
make install

でeigenのフォルダ外にbuildを作って2つをまとめて指定、最後にmake installでいけます

eigen自体に関しては
Eigen – C++で使える線形代数ライブラリ | でらうま倶楽部
http://blog.livedoor.jp/tek_nishi/archives/8623876.html

などを参照してください。

Deepnet内のExampleを走らせる

この辺もpipで入れると(確か)ついてきません。 ~/dnn/deepnet/deepnet/examples/ まで移動すると、各手法での example とsetup_examples.py というファイルがあるので、例題を起動するにあたってsetup_examples.pyでとりあえず環境を整備します。
環境整備にあたって例によってMNISTの手書き画像のファイルが必要なので、

cd ~/dnn
curl -O http://www.cs.toronto.edu/~nitish/deepnet/mnist.tar.gz
tar zxvf mnist.tar.gz

でダウンロードして展開しておく。

setup_examples.pyは今展開されたフォルダ内のmnist.pbtxtの場所とアウトプット先を指定しないといけないので、

cd ~/dnn/deepnet/deepnet/examples/
python setup_examples.py Users/***/dnn/mnist Users/***/dnn

とかでいいと思います。確か絶対パスじゃないと通らなかったような気がしますがそんなもんは気のせいかもしれません。場所の指定がうまくいってないとどこかしらでNot foundが出ます。成功すると何も起こらずに一瞬で終わります。

ただし、走らせた時にmatplotlib関連で
RuntimeError: Python is not installed as a framework
こんな感じのエラーが出た場合には、virtualenv上でmatplotlibを走らせた時の問題なので、この辺りを参考にmatplotlibrcファイル内のbackendの指定を修正する。matplotlibrcは、おそらく
~/dnn/lib/Python2.7/site-packages/matplotlib/mpl-data/
辺りにあります。
backend: macosx

backend: Tkagg
に書き換えるだけです。どうでもいいけどTkinterでレンダリングするんですね。

ここまで出来たらとりあえずテストの準備は完了したので、先ほどのexamples内の目的の手法内のrunall.shを走らせればよい。

sh runall.sh

あと走らせた時に、まさかの
No GPU board available.
とかいうエラーが返ってきて止まってしまう場合があります。もちろん、使っているGPUが本当に対応していない可能性もあるのでありますが、どうもそうじゃない場合もあるようであります。僕もiMacのNVIDIA GeForce GTX 775Mで止まって、いや、これは対応してんじゃない?みたいな感じで。
実際これはGPUの占有の際のプロセスの問題っぽく、LinuxではいけてもMacではダメみたいな話があります。Windowsはちょっとわかりません。
とにかく、面倒なら最悪以下の方法でGPU Lockをスキップできます。

deepnet内のtrainer.pyを開いて、def lockGPUの塊を丸ごと以下で上書きします。

def LockGPU():
	board = 0
	cm.cuda_set_device(board)
	cm.cublas_init()
	return board

するとGPUのロックは行われずに、オンボードのグラボをそのまま使用するよう設定されます。(Did this package work well for Mac OS 10.8.2 GeForce 660M GPU? | GitHub)

後は、Examplesを走らせている時に、エラーではないもののMatplotlib関連でまたwarningsが出る場合があります。
Matplotlib is building the font cache using fc-list. This may take a moment.とか。大した時間はかからないものの、走らせてすぐにこの警告でワンストップします。解決は以下などを参考に。バージョンが上がったら自然に直るかもしれませんが。
【matplotlib】import matplotlibでfont cacheについてUserWarningが出る場合
http://inatim.com/font-cache-warning-with-matplotlib/

とりあえずこんな感じで一通り動くんじゃないかと思います。
ただ、どのタイミングでかは忘れましたがPATHを追加しました。というのも、exampleを走らせる際にlibeigenmat.dylibとlibcudamat.soの読み込みがなぜか両立せず、片方のパスを解決するともう片方が見つからず、パッケージの読み込みの際にdlopen(libeigenmat.dylib,6) Image not found的な奴が交互に出るというクソ状況に陥ったわけです。
最終的にdeepnet内に新しくlibフォルダを作り、そこにdylibとsoファイルを全部入れてDYLD_FALLBACK_LIBRARY_PATHから参照させました。

export DYLD_FALLBACK_LIBRARY_PATH=$DYLD_FALLBACK_LIBRARY_PATH:$HOME/lib:/usr/local/lib:/usr/lib:/Developer/NVIDIA/CUDA-8.0/lib:$HOME/dnn/deepnet/lib

みたいな感じですね。ただ、DYLD_FALLBACK_LIBRARY_PATHはできればあんまり設定しない方がいいっぽいので、おそらくは強引な解決法です。色々と設定を見てると、El Capitanで下手するとまたTeXが動かなくなったりしそうな気がします。

その他、引用元を表記していないトラブルシューティングについては以下を参考にしました。
Install Deepnet on Mac
https://imiloainf.wordpress.com/2013/11/

次回は『PythonでDeepNetを使う Examplesめっちゃ走らせる編』を予定しています。


前回twitterの垢を晒したのは若干失敗したくさいという思いがあり、今回はlinkedInだけにしておきます。味噌経済圏の経済学研究科でマーケティング・サイエンスとかやってるしがない大学院生です。働き手としてやっていきたい。
linkedin: Junichiro NIIMI


 - DeepNet , , , , , ,

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

関連記事はありませんでした