ラズベリーパイ 日本語化

渡されたラズパイ、CUIの表示が日本語らしく文字化けして何も読めぬ。英語でいいのに・・・。仕方なく日本語化。

日本語表示のための「jfbterm(日本語化フレームバッファターミナル)」と日本語入力のための「uim-anthy(日本語入力メソッド)」をインストール。

sudo apt-get install jfbterm uim uim-anthy

emacsかviで/usr/share/uim/generic-key-custom.scmを編集。44〜50行目付近の「Shift」を「Control」に変更(Ctr+Shiftで切り替え)。最後に.bashrcに以下を追加して再起動。

RUNTTY=`/usr/bin/tty | cut -c 6-8`

if [ $RUNTTY='tty']
then
   jfbterm -q -e uim-fep -u anthy
fi

video-caffe

makeする際、cuda-8.0を指定すると下記エラー。Makefile.config見ても特に変更すべき箇所がない。

fatal error: cudnn.h: No such file or directory

仕方なく、Makefile.configのCUDAのパスをcuda-7.0にしてmake all -j8。するとビルドできた・・・。Caffeはcuda-7.0対応だからまあいいとしてcuDNNのバージョンはどうなっとるのか?

cuDNNのバージョンについてはvideo-caffeは4と5までは動作するとか配布元が明言しているものの、cuDNNがver5のときはエラー吐いて止まることもあるとフォーラムに書いてある・・・。学習時の最初の一回目でエラーが起きなければそのあと問題がないのだけれど・・・ちゃんと計算できているのか不安すぎる。cuDNN4だとエラーが起きないらしい。今度ビルドしようと思っているマシンのcuda-7.0以下で

/usr/local/cuda-7.0/include/cudnn.h

の中のMajorの部分がcuDNNの利用バージョンらしい。みたら4となっていたので今度のマシンは、いちおう大丈夫そう。

たまにエラー吐く現在のマシンのバージョンを確認したところcuda8のcuDNN5だった。オフィシャルで動作確認されてないやつやん・・・。というか、現在のマシンのMakefile.configを流用して新しいマシンでのmake失敗しているが、片方はcuda8なのにビルドできるっていったいどゆこと??? と思ったら新しいマシンの

/usr/local/cuda/include/
/usr/local/cuda-8.0/include/

のどちらにもにcudnn.hがなかった。インストールしてないのかよ・・・(初期セットアップは別の人orz)。

ひとまず、新しいマシンの方で現行マシンとおなじ計算して様子を見てみないことには何とも言えない。もーcafeやめようよーkerasにしようよーめんどくせーし信用できねーよー(平野耕太風)。


で、新しいマシンで実行したら以下のエラー。

error while loading shared libraries: libcudart.so.7.0: cannot open shared object file: No such file or directory make: 

というわけでパスを通す。パスが通っているのは/usr/local/cuda/ だけだった。バージョン管理どうなってんだろうこのマシン・・・。

export LD_LIBRARY_PATH=/usr/local/cuda-7.0/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-7.0/bin:$PATH

NumpyとScipyのlinalg

Norm
https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.linalg.norm.html
https://docs.scipy.org/doc/scipy-0.19.0/reference/generated/scipy.linalg.norm.html

固有値分解やら特異値分解の場合と違って、たいして違いはないのかな・・・と思ったらscipyの方が行列に対するノルムが減ってる。どうも核ノルムが外されているようだ。

ぜっつぼーう ぜっつぼーう ぜっつっぼっ

もっと絶望と仲良くなろうよ、というユウのセリフがなかなか印象に残った。原作が終わりそうな感じで、テッケンクラートもあんな感じでなんかな。

研究室の3Dプリンタで印刷したいなぁ、という話を院生たちと話したら、できないこともなさそう。figmaは1/12のシリーズ展開だから、いろいろ載せられる。https://www.thingiverse.com/thing:2635032

Pythonでループを使わない計算にする(高速化)

ループを使わないようにすると、大分まともに実験ができるようになるようだ。以下の関数を組みわせるとforループを使わずに済む。Matlabかよ。

#A: 行列 (MxN)
#b: 列ベクトル (Mx1)

C=A*A #行列の要素同士の積(アダマール積)→C
D=A*b  #行列の各列の要素とベクトルの積 →D

e = numpy.sum(Mat_hoge,axis=0) #行列の各列の行方向の和
f = numpy.sum(Mat_hoge,axis=1) #行列の各行の列方向の和

# e は1次元のndarray
g = numpy.c_[e] # 1次元ndarrayを2次元ndarray、列ベクトルに
h = numpy.r_[e] # 1次元ndarrayを2次元ndarray、行ベクトルに


例えば、以下のように

#A: 行列 (MxN)
#b:列ベクトル(Mx1)

c = numpy.zeros( (N,1) )
for j in range(N):
   for k in range(M):
      c[j] += A[k,j]*b[k]

c = numpy.c_[numpy.sum(A*b, axis=0)]

と1行で書ける。こっちの方が断然速い。

この書き方を応用してみたところ、22秒かかった計算が0.03秒になった。forループを内包表現した方がよいとか書いているけど、そもそもforループにしない方がよいみたい。

ここまでやってきて、何とか評価実験一歩手前まで来た。結構な時間を使ったが、新しい言語で実験環境構築したし、これくらいかかってもしょうもないか。

結局の実装

結局scikit-learnの関数,アダマール積,numpy.sum(),内包表記を組み合わせ、小さなPythonモジュールを別スクリプトにまとめてimportする場合の計算が速かった。やっと現実的な計算時間で処理できるようになって一つ目の山は越えたが、もう一つ計算重そうな箇所が・・・。そこさえクリアできれば何とかなりそうだけれども・・・。ちょっと考えないと厳しい。

Xeon Phi買ってIntelCompilerでPythonビルドできたら爆速になる気がしないでもないが、Deep Learning用のマシンを買ったらそんな予算が残っているか。。。しかも、並列計算の世界ではXeon Phiは使えない子扱いされているので、理由書書いても認められるのだろうか。