2016年5月19日木曜日

libsvmのインストール & Matlab用インタフェースのコンパイル


環境はMacOS10.11で、XcodeとCommand line toolsはインストール済み
MatlabはMatlab2013aバージョンを使用
mexは不慣れなものでエラーが出るととても困った

■ libsvm本体のインストール

libsvmのインストールは特にひっかかることなし
ダウンロードして展開したlibsvmのディレクトリ上で
     $ make svm-train
     $ make svm-predict
あとはここにパスを通せば良い
~/.bashrcに以下を記述
     export PATH=$PATH:/Users/mtanaka/Documents/Softwares/libsvm-3.21
これで、svm-train、svm-predict、svm-scaleの3コマンドが使えるようになる

■ Matlab用インタフェースのコンパイル

2つ大きなエラーにあたった
一つはMacOSとMatlabのバージョンの不一致、もう一つはソースコード中に現れる謎のデータ型

1つ目、MacOS10.7のSDKが見つかりませんよ、というエラー


>> make
xcodebuild: error: SDK "macosx10.7" cannot be located.
xcrun: error: unable to find utility "clang", not a developer tool or in PATH

    mex: compile of ' "libsvmread.c"' failed.

Error: /Applications/MATLAB_R2013a.app/toolbox/matlab/general/mex.m failed (line 206)
Unable to complete successfully.
=> Please check README for detailed instructions.

これはmexopts.shというMatlab.app/binの下のファイルを修正すれば良い
mexのコンパイルの時に探すSDKを10.7から10.11に変更
つまり、mexopts.sh中の”10.7”を”10.11”に総置換した(もちろんバックアップは取ってから)

修正後、Matlabのコマンドライン上で
     >>> mex -setup
しなおして、このエラーは解決

2つ目、char16_t なる型に捕まる

このエラーから逃げられず、しばらく困った

>> make
In file included from libsvmread.c:7:
In file included from /Applications/MATLAB_R2013a.app/extern/include/mex.h:58:
In file included from /Applications/MATLAB_R2013a.app/extern/include/matrix.h:294:
/Applications/MATLAB_R2013a.app/extern/include/tmwtypes.h:819:9: error: 
      unknown type name 'char16_t'
typedef char16_t CHAR16_T;
        ^

どうやらmexでコンパイルするときに予め型の置換えを指定しておけば良いらしい
libsvm/matlabの下のmake.mを開いて、mexコマンドの*全て*にこのオプションを追加
以下、一例

修正前
mex CFLAGS="\$CFLAGS -std=c99" -largeArrayDims libsvmread.c

修正後
mex CFLAGS="\$CFLAGS -std=c99" -Dchar16_t=uint16_t -largeArrayDims libsvmread.c

これでコンパイルが通って、無事に*.mexmaci64ファイル群が生成された
あとはMaltabのパスにここを追加して、無事svmtrainコマンドが使えるようになった
よかとよかと

2016年5月18日水曜日

chainer.Variableにおけるvolatileパラメータの意義


Variable型が持つvolatileパラメタについて、本家のマニュアルでは下記の通り
Users can disable this chaining behavior by setting the volatile flag for the initial variables. When a function gets volatile variables as its inputs, the output variables do not hold references to the function. This acts like unchaining on every function application.

本家のマニュアルをみても今一、ユースケースが分からなかったので、ちょっと調べてみた
分かってしまえば何てことはない
volatile = 揮発性の意図から察せられる通り、メモリの節約をしますか?しませんか?という意味

とりあえず、重要な点として、
volatileをTrueにするとBackpropergationできない

forwardしている間に、通過した各層で計算されたパラメータ群がvolatile(揮発)しちゃうということになる
だからモデルを学習させるときは原則、volatile=Falseにする

逆に、誤差逆伝搬させないテストのときは途中経過のデータはいらないからvolatile=Trueにしてしまう
そうするとメモリの負荷が減る



本家のマニュアルだけだとピンとこなかったけど、こちらのやりとりで解決した

2016年5月17日火曜日

Macから共有サーバに定期的にマウントする方法

SMBで共有ディスクをマウントしているが、それがしょっちゅう切れる
おそらく一番の解決策は、共有サーバがぶつぶつ切れる現状の改良
しかし、それが世の中諸々の事情で難しかったりするので(お願いしづらい)、定期的にマウントを確認し、きれたらつなぎ直すという対処療法をとる

1. MacにおけるSMBマウントコマンドを調べる

mount_smbfsというコマンドでSMBの共有ディスクがマウントできる 
     # mount_smbfs //ユーザ名:パスワード@共有サーバ名(名前解決できるサーバ名にすること)/共有ディスク名 /適当なパス/共有ディスク名
共有サーバ名とかが分からなければ、一旦手作業でマウントして、dfコマンドを使えば、自分がどういう名前で接続しているかがわかる

共有ディスク名のディレクトリはいわゆるmountコマンドで使うような一般的なマウント先
なので、あらかじめ空のディレクトリとして作っておくこと
Macの場合、ここにもマウントされるし、/Volume/共有ディスク名 としてもマウントされるから今まで書いてたパスが台無しになることはない

2. すでにマウント済みか否かを判断する

dfでマウントされたディスク群を表示
grep -cで該当する行数をカウントする 
     # df | grep -c MU

3. シェルスクリプトでマウントが解除されていた場合に、再マウントするように記述

~/.mount.sh を作って、下記のように記述

#/bin/sh
VAR=`df | grep -c 共有ディスク名`
if test $VAR -eq 0 ; then
上のmount_smbfsコマンドをそのまま置くこと
fi

4. スクリプトををひたすらcronで回すように設定

crontabの記述ではうっかり最後を改行しないように注意
     # crontab -e

*/10 * * * * /Users/misato/.mount_MU.sh

以下で確認
     # crontab -l

これでしばらく経過観察する

2016年5月16日月曜日

El Capitan (MacOS10.11)におけるEclipse・Pydevのインストール

Pydevをインストールする前に、Java関係の設定についてややこしいところがあったのでメモ


1. Eclipseのインストールは通常通り行う

以下のサイトからJava用のIDEをダウンロードしてきてインストール(後からPydevをソフトウェアとして追加する)
今はEclipse Mars.2 (4.5.2) のバージョンがダウンロードできる

2. Javaのインストール

Javaのバージョン8(1.8.xxx)をインストールする
※ 既に入っていたら気にしない

3. EclipseにおけるJavaの設定

ここが難所
Pydevの公式ページに、PydevをインストールしてもメニューやパースペクティブにPydevが表示されないケースがあるとの注意書きがある(PyDev does not appear after install!、その下のAll OSesも参照すべし)
何をしなければならないかというと、eclipse.iniファイルを作成する必要がある
Eclipseをインストールしたフォルダ(自分の場合、/Users/ユーザ名/eclipse/java-marsの中)から、Eclipse.appのパッケージの中に入り、Contents/MacOSの中にeclipse.iniを作成(既にあればそれはそれでよし)
ファイルに以下を追記
/usr/libexec/java_home -v 1.8

その後、Eclipseを再起動

4. Pydevのインストール

ここからはいつも通りのソフトウェアのインストール
Help > Install New Software…で、http://pydev.org/updatesにアクセスして、適切なPydevのソフトウェアを落としてくる
再起動すると、無事、Pydevが使えるようになる