スクリプト

最近、ディープラーニングを勉強したこともあり、ちょっとしたプログラミングには 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 に乗り換えて、結構快適になった。

Raspberry Pi で Deep Learning

Raspberry Pi で Deep Learning 用のライブラリの TensofFlow をインストールする話。

Deep Learning というと、GPU 演算したりとか、もの凄く重い処理というイメージだし、実際重い。

なので、あまり Raspberry Pi 向きの話ではないが、学習済みのデータを読み込んで、予測を走らせたりするくらいならば十分出来る印象。
実際、学習の処理を走らせてみても 4コアの Raspberry Pi 3B ならば、GPU 無しで、ちょっと古めの i7 との性能比で 1/2~1/4 くらいの性能。
遅いといっても、3倍くらいで、10倍とかそういう話ではないので、低電力でのんびり走らせるのであれば、使えなくはない。

大昔 UNIX ワークステーションで、glibc のコンパイルを始めたら、半日かかったとか、そういう時代からすれば、5000円でスーパーコンピューターが買えているようなもので、凄い時代だよなあと。。。(歳バレネタ)

で、インストール手順なのだが、正直、このサイトにバッチリ書いてあるので、あえて、語るほどでもない(笑)

https://github.com/samjabrahams/tensorflow-on-raspberry-pi

しかし、深層学習。 なかなか難しい。正直、中身に関しては、よくわからない。
細かいところは正直、理解できる気がしないので、回帰分析の一種という大雑把なとらえ方で考えている。

でも、色々なアルゴリズムを組み合わせて、階層をつくって、データーを食わせてやると、確かに重みとバイアスの学習が行われて、値が収束していくのが分かる。
この、値の収束の仕方とか、学習結果から予想されるデータをグラフで見たりとかで、感覚に近いかどうか? で判断してみたりしている。
まあ、遊びだからこんな感じでいいのだ。

TensorFlow はそのまま使うと、結構頭を使うというか、解析モデルが分かってないと出来ないので、実際はラッパーライブラリを使っている。
最初は tflearn というのを使っていたが、今は Keras というライブラリを使っている。 Keras の方が全然早いしわかりやすかった。

あー、ネット上でも、こんなにフワフワな深層学習ネタはあまりなさそう(笑)
大体、数式を真面目に読まずにやってるんだから、こんな感じにしか書けない。
偏微分とか、思い出せないよ…
デタラメなニュース記事よりかはマシかなと思っていただければ幸い。

Deep Learning のとっかかりとしては、下の2冊がお勧め。
実際動かす話だと、詳解~の方が早いが、オライリーの方が理論については読みやすい。

Surface Book の GPU で Deep Learning

表題の通り、Surface Book (i5モデル) の GPU で Deep Learning を試してみた話。

(2017/08/02 さらに追記)
(2017/07/25 末尾に追記。有効なケースについて)

最近、ふと deep learning について勉強したくなって、ちょっとしたサンプルプログラムを動かしたりしている。 まだ理論をきちんと理解していないので、サンプルを書き換えるのも、ままならない状態だが、何かの役に立てば面白いかなと思っている。

演算には結構時間がかかるが、GPU を使えば高速化できるらしい。
そういえば、Surface にも GPU 入っているのを思い出したので、試してみることにした。

Surface Book の i5/8GB/256GB のモデルには、dGPU という NVIDIA製の無銘GPUが搭載されている。 一応、CUDA も動くみたい。

  • Windows 10
  • Cuda 8.0
  • CuDNN 5.1
  • Tensorflow GPU 1.2.1

どれも普通にインストールしただけ。CuDNNはシステム環境設定のPATHをbinに通しておく。 TensorFlow も公式の手順で pip install しただけ。 インストールして、以下サイトのサンプルを動かしてみると。。。

RNNで来月の航空会社の乗客数を予測する:TFLearnでLSTMからGRUまで実装しよう

なんと、GPU より CPU のほうが早かった。。。
(ひどいオチだ。。。)

なんかね、3000 x 2000 pixel の表示を高速化するために搭載されてはいるが、そういうことには使わないでくださいって感じ。。。

一応認識されたし、動きはしたけど、演算は無理でした。残念。。。

ちなみに、deep learning の参考書はこれ。いい本だと思う。

Surface でこれなので、お得意の Raspberry Pi では。。。インストールする気も起きないです(笑)

(2017/07/25 追記)
サンプルプログラムによっては、速くなるものもあることが分かった。
スピードは倍くらいになる。 GPUのメモリが1GBしかないので、メモリに関する部分でパフォーマンスに差が出るようだ。

とりあえず、GPU版を入れておいて、Windows の場合、システム環境変数で切り替えるのがよさそう。
CUDA_VISIBLE_DEVICES=-1 で無効、CUDA_VISIBLE_DEVICES=0 で有効。

(2017/08/02 追記)
GPUのメモリが少ないので、バッチサイズは小さめにする必要があるが、うまく調整すれば、3~4倍程度のパフォーマンスが出ることを確認。
調整には、nvidia-smi や NvGpuUtilization ツールを使うとやりやすい。