スクリプト

最近、ディープラーニングを勉強したこともあり、ちょっとしたプログラミングには Python を使うことが多くなった。

古い人間なので、普段は シェルスクリプトと awk を使うことが多かったし、今でも使うけど、Python のライブラリの強力さには魅力を感じている。 Pandas とか Numpy とか Matplotlib とか強力すぎ。

awk は、もう仕様を丸暗記に近いレベルで覚えているので、何も見ずに書けるから早い。 その成立に、敬愛する B.W.Kernighan が関わっているのもいい。 ライブラリとか、言語拡張の類が全く無いので、テキスト処理にしか使えないが。

Perl は chop が便利だったけど、普段使いにはならなかった。

Ruby は日本発なのが良かったし、機能も申し分なかったが、何か馴染めなかった。

Javascript (Node.js) は、たまに使っている。

多少本格的なのを組むことになったら、昔は Java だったけど、今は何になるんだろうな。。。多分組まないけど(笑)

サーバーっぽいのだったら、Node.js かな。

Surface Book の GPU で Deep Learning(続)

以前のネタの続き。

Deep Learning を学ぶにあたって、フロントを Keras 、バックエンドに TensorFlow を使っていたんだけど、Keras はバックエンドに、TensorFlow 以外にも、TheanoMicrosoft の CNTK を使うことが出来ることに気づいた。

Theano は試してみたけど、Windows だと gcc を入れたりとか、数値演算のライブラリのセットアップがかなり面倒な上に、実行時に毎回 g++ だかのビルドが入るので、パフォーマンス的には微妙だった。 CPU使用で、はまると速い感じはしたが、積極的に使いたい感じではなかった。

CNTK は Microsoft 製だが GitHub で公開されていたり、Linux 版があったり、ライセンスがおおむねMITだったりとか、最近頑張ってるなあという印象。

インストールも`pip install whlへのURL` とするだけで簡単だった。

Keras の設定は `C:\Users\ユーザ名\.keras\keras.json` ファイルの


{
    "image_data_format": "channels_last",
    "epsilon": 1e-07,
    "floatx": "float32",
    "backend": "tensorflow"
}

`tensorflow` となっているところを `cntk` に書き換えれば OK。

バックエンドを切り替えるだけなので、Keras 用に書かれた Python のソースは変更する必要は無い。

で、サンプルの実行だが、サンプルにもよるが、全体的に TensorFlow よりも高速に感じられる。 CPUのみだと、逆に遅いケースもあるようだ。

Surface Book での GPU 使用だが、CUDA と CuDNN が入っていれば、何も考えなくても使ってくれる。 使用中の様子は `nvidia-smi.exe -l` で確認できる。

TensorFlow の場合は、多少メモリ効率が悪くて、パフォーマンスが出なくても、なんとか GPU で動かしてくれる感じだったが、CNTK の場合は、テストバッチがメモリに収まりきれないと、簡単にエラーで止まってしまう仕様のように見える。

結果的に、バッチサイズやネットワークの深さの調整が必要になったりするが、GPU を使っているのにパフォーマンスが出ないケースが否が応でも排除されてしまうので、開発の時間効率はかえって良いのではないかと思う。

ということで、CNTK に乗り換えて、結構快適になった。