Pythonで書けるDeepLearningのライブラリを比較してみた
皆さんこんにちは
お元気ですか。私は元気です。
ChainerのAdvent Calendar第16日目です。
DeepLearningのライブラリの比較を行ってみました。
Chainer Advent Calendar 2015 - Qiita
ライブラリ紹介
Tensorflow
Googleが公開したライブラリ
https://www.tensorflow.org/www.tensorflow.org
Googleが公開したことで、評判のライブラリ。
やたらとニュースになるほど凄かったが、果たして他とくらべてどうなのか。
Lasagne
Theanoを基盤として書きやすくしたライブラリ
Kaggleで使っている人が多いとかなんとか・・・、
因みに私が見る限り、Kaggleで使っている人は、nolearnを使って書いている人が多いですね。
静的な比較
比較項目の解説
- 拡張性・・・・新規に関数を追加したい場合にどれだけ容易か
- GPU対応・・・GPU対応がどれだけ簡単に可能か。コマンド一つ?コードの記載量など
- 高速性・・・・どれだけ高速に動作するか。基本的に時間がかかるので、大幅に必要。
- githubの★・・githubのスター数
- 書き方・・・・レイヤー型orシンボル型(レイヤーごとに定義するかシンボルを使ってレイヤーを構成していくか)
比較表
解説
Chainer
- 拡張性:Gradient Checkingやcupyなど実装しやすい環境が揃っているが、Back Propagationを自分で実装する必要がある。
- GPU対応:numpy か cupyどちらを使うのかのみで、GPUかCPUかを選択できる。但し、コードの修正が若干必要となる。
- 高速性:CPUの速度は遅いがGPUでの速度が高速である。
- githubの★:★数が、1004と勢いがある。
- 書き方:個人的にはレイヤーを意識して、記載できるので、後でデバッグするときやネットワークの構造をひと目見ただけで確認できる点が楽。
個人的には豊富なExampleと書きやすいのが嬉しいところ。
cupyを使えばnumpy likeにGPUコードを書くことができる。
日本の開発者が活発で、様々なModelのExampleがgithubに公開されている。
<要望>
①個人的にはscikit-learnっぽくかけるとありがたいです。
②chainer1.5から__call__を使用して書けるようになったのですが、予測したいときはどのメソッドを呼び出して、学習したい時はどうすればよいのかがまだわかっていない(多分私だけ)。
TensorFlow
- 拡張性:シンボル型のコード記述が可能なので、比較的容易である。自動微分機能搭載
- GPU対応:比較的簡単に可能。ソースコードの変更は不要。但し、インストール時に設定が必要となる。
- 高速性:遅いと大評判なTensorFlow。進化するとかしないとかの噂が流れている。CPUはマトモだが、GPUの速度は遅い。
- githubの★:githubの★の数が14000と膨大な★の数が付いている。
- 書き方:シンボル型なので新しいアルゴリズムの拡張は簡単にできる。
個人的にこのライブラリが現状そこまで良いと思えないが、今後、高速に発展していくと思われる。
見やすい可視化機能とシンボル型の記述で、自動微分が不要なところが拡張性があって良いと思う。また、google直々に使われている機械学習のwrapperを記載しており、商業的には高速で発展する勢いがある。
とりあえず、可視化もいいですが、流石に遅いので、高速化してください。
Lasagne
- 拡張性:シンボルで記述可能、GPU対応も簡単に可能なので、拡張は容易にできる。
- GPU対応:起動時のコンパイル方法を変更すれば、可能なので、簡単に切り替えができる。
- 高速性:CPUやGPUである程度の速度を保てる。
- githubの★:昔からあるので★数は一定以上確保している。
- 書き方:シンボル型なので新しいアルゴリズムの拡張は簡単にできる。
シンボル型の記述で、自動微分が不要なところが拡張性があって良いと思う。
古くからあるので、研究者間では使われているのでしょうか。
因みに学生時代は私もTheanoでDeep Learningの基礎を学びました。
因みに多くのKaggleのサンプルコードには、Lasagneで書かれている内容がある。
実験
せっかくなので、速度に関することは実験してみました。
実験環境
OS | Ubuntu 14.04 |
Memory | 32GB |
CPU | Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz |
GPU | GeForce GTX970 |
実験した内容
以下の3層ネットワークを構築し、速度を比較してみました。(データはMNIST先生)
1層目 | 780 - 1000 |
2層目 | 1000- 1000 |
3層目 | 1000 - 10 |
速度比較内容
Library | 合計時間(sec) | 平均時間(sec) |
Chainer | 442.07 | 22.10 |
Lasagne | 325.75 | 16.28 |
TensorFlow | 229.99 | 11.49 |
Chainer(GPU) | 39.31 | 1.96 |
Lasagne(GPU) | 38.21 | 1.91 |
tensorflow(GPU) | 46.65 | 2.33 |
急ピッチだったのでExcelで仕上げました。これぐらいだと楽です。
考察
- CPUだけのTensorFlowは速いけれども、GPU実行した途端、他のライブラリより遅くなってる。噂には聞いていましたが、正直、これには驚きです。(どうしてそうなった。)
- ChainerのCPU何かあるのかな…。学習すればするほど、一回の学習時間が遅くなっていってるのですが。
- 基本的にLasagneとChainerだと、GPUベースだとどっちを使っても良いと思います。
- tensorflowのCPUは比較的高速で、chainerは遅かった。tensorflowだけ8threadで動作しているだけかもしれませんが。。。。
結論
Chainerのcupyによる拡張と書きやすさ。個人的にはこれが気に入っています。
レイヤーをコンストラクタとして、与えて、学習ができれば更に使い勝手がよくなると思います。
(イメージとしてはscikit-learnでしょうか。)