Deep Learning フレームワークざっくり一覧

さて、この記事は「[Deep Learning フレームワークざっくり紹介 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/deep-learning-frameworks)」の1発めとしてとりあえず、今あるディープラーニング用フレームワーク、その他関連ライブラリをざざざっと紹介しようという記事です。
より詳細は他の記事なんかを読んでもらうとして、ここではホントに、概要の概要（作者とか）とポインタ（URLとか）のみ紹介していきます。

※ ここ数ヶ月の、広く浅い動向調査を元に書いてます。もしかしたら間違いとかあるかもですが、その場合はコメントとかで教えてください。

では以降、処理の上の方から下の方まで順に、ざざっと。


## Higher API
いわゆるディープラーニングフレームワークを更に抽象化して、Deep Neural Network（DNN）を簡単に書けるようにしたライブラリです。

* Keras
    * by [Francois Chollet](https://twitter.com/fchollet), Google
    * https://keras.io/ja/
    * 主にTensorFlowを抽象化して、より簡単にDNNを扱えるようにしたライブラリ。TensorFlow 1.4から、TensorFlowの中にマージされました。
    * TensorFlow, CNTK, Theano などのモデルを生成できます。
* Gluon
    * by AWS, Microsoft
    * https://github.com/gluon-api/gluon-api
    * http://gluon.mxnet.io/
    * https://mli.github.io/cvpr17/
    * AWSとMicrosoftが作った、やはりDNNを簡単に書くためのライブラリです。現在はMXNetをターゲットにしていて、MXNetのライブラリの一部として公開されています。
    * 本来静的ネットワークを書くMXNetを、動的ネットワーク構築（define by run）で書けるようにできるのが特徴です。
    
## Framework
俗に言う、ディープラーニングフレームワークです。これ以上の説明は不要ですね。

* TensorFlow
    * by Google
    * https://www.tensorflow.org/
    * これも説明は不要ですか。恐らく世界でもっとも良く使われているフレームワーク。本稿執筆時点で最新バージョンは1.4です。
* Chainer
    * by Preferred Networks
    * https://chainer.org/
    * これもご存知、PFNが公開した日本製フレームワーク。日本では非常によく使われている印象ですが、国外では残念ながら、そこまで広くは使われていない感。
    * ただし、おそらく動的ネットワーク構築（define by run）の手法を世界に普及させたフレームワークじゃないでしょうか。
* Caffe
    * by [Yangqing Jia](http://daggerfs.com/), UC Barkeley
    * http://caffe.berkeleyvision.org/
    * 2013年ごろUCBで作られたフレームワーク。主に画像認識をターゲットとして作られたようです。
    * 設定ファイルだけで動かせるなど、比較的お手軽に扱えるのが特徴。現在も根強い人気。
* Caffe2
    * by [Yangqing Jia](http://daggerfs.com/), Facebook
    * https://github.com/caffe2/caffe2
    * Caffe作者のJiaさんがFacebookに移り、Caffeを更に発展させる形で開発されたライブラリ。
    * Facebook内ではかなり使われているようですが、世間的には（Caffeに比べると）まだまだマイナーな印象があります。
* MXNet
    * by ワシントン大学, CMU, AWS
    * https://mxnet.incubator.apache.org/
    * https://aws.amazon.com/jp/mxnet/
    * ワシントン大学、CMUなどを中心に開発されたライブラリ。その後AWSが公式サポートを表明、現在はApacheプロジェクトになっています。
    * Python, R, Julia, Go などなど、多言語でのバインディングがあるのが特徴。
* PyTorch
    * by [Adam Paszke](https://twitter.com/apaszke)ら, NYU, Facebook
    * http://pytorch.org/
    * かなり古いLua製フレームワークである[Torch](http://torch.ch/)と同じチームが提供している、Python製フレームワーク。
    * Chainerをforkして作られたという話があり、Chainerと同じく define by run をサポート。相当柔軟に書けるらしい。筆者の周りでは人気高いです。
* The Microsoft Cognitive Toolkit (CNTK)
    * by Microsoft
    * https://www.microsoft.com/en-us/cognitive-toolkit/
    * https://github.com/Microsoft/CNTK
    * Microsoftご謹製フレームワーク。正式名称がCNTKじゃなくなっていると、筆者はこの記事を書く時点で初めて知りました。
    * ぶっちゃけ、すごくマイナーなイメージ……
* Theano
    * by Yoshua Bengio, モントリオール大学
    * http://deeplearning.net/software/theano/
    * ディープラーニング業界では有名な、Bengio教授の元で作られたPython向けフレームワーク。かなり古い。
    * 一時代を築いたイメージのあるライブラリですが、今年になって、バージョン1.0リリースとともに[開発の停止がアナウンス](https://groups.google.com/forum/m/#!topic/theano-users/7Poq8BZutbY)されました。
* neon
    * by Intel Nervana
    * https://www.intelnervana.com/neon/
    * https://github.com/NervanaSystems/neon
    * Intelに買収されたスタートアップ[Nervana](https://www.intelnervana.com/)が作ったフレームワーク。
    * Intel Math Kernel Library (MKL)をターゲットにした最適化・高速化が特徴。また、後述するNervana Graphのフロントエンドにもなっています。
* NNabla (Neural Network Library)
    * by Sony
    * https://nnabla.org/
    * https://github.com/sony/nnabla
    * ソニーご謹製、日本発のライブラリ。ほぼC++で書かれているのと、Neural Network Console（ https://dl.sony.com/ja/ ）というGUIを通じて、コードを書かなくても、ビジュアルにDNNを設計できるのがウリ。

## Graph IR
モデルを記述するための中間表現フォーマットです。普通は各フレームワークごとに独自のフォーマットを定めていますが、ここではフレームワーク独立な、標準フォーマットをご紹介。

* ONNX (Open Neural Network Exchange)
    * by Facebook and Microsoft
    * https://github.com/onnx/onnx
    * FacebookとMSが提唱している標準フォーマット。最初に公式サポートされたのはPytorch、Caffe2、CNTK。これらのフレームワークのアウトプットをONNXを通じて相互にやりとりできたりします。
    * 最近はIntel（Nervana）、AWSその他多数の企業が公式サポートを表明。ONNXからMXNet、TensorFlowへのインポートができるようになってます。
    * 現在、最新版はどんどんアップデートされていて、**仕様がどんどん変わっています**。一般の人が安心して標準フォーマットとして使えるようになるには、まだ時間かかりそう。
* NNEF (Neural Network Exchange Format)
    * by Khronos Group
    * https://www.khronos.org/nnef
    * OpenGLなどを定める標準化団体Khronos Groupが提唱する標準フォーマット。
    * ただ現時点では、プレスリリースで表明されているだけで、実装や仕様書の類はまだ一切公開されてません。
* CoreML
    * by Apple
    * https://developer.apple.com/documentation/coreml
    * https://github.com/apple/coremltools
    * Appleが採用しているフォーマット。これに落とせば、iOS上にモデルを持っていくことができます。
    * 本稿執筆時点で、Caffe, Kerasなどからインポートすることができるようです。

## Backend stack
DNNモデルを読み込んで、最適化・高速化したり、様々なプラットフォームにデプロイしたりするためのライブラリ。着目してる人が少ない（Qiitaにも記事とかあんまりない）ですが、ここも色々なのが提唱されてます。

* TensorFlow XLA
    * by Google
    * https://www.tensorflow.org/performance/xla/
    * TensorFlowモデルを高速化したりするためのバックエンド。
    * 標準では更なるバックエンドとしてLLVMを採用していて、高速化したモデルをLLVMを通して色んなプラットフォームに展開できます。
    * その気になればLLVMに変わるバックエンドをユーザが定義できて、なのでTensorFlowを独自拡張できます。
* NNVM/TVM
    * by [Tianqi Chen](https://twitter.com/tqchenml), ワシントン大学, CMU, AWS
    * http://www.tvmlang.org/
    * https://github.com/dmlc/nnvm
    * https://github.com/dmlc/tvm
    * MXNetを開発したChenさんらのグループが開発。DNNモデルを最適化した上、様々なプラットフォームに展開できます。
    * 現在はMXNetの公式バックエンドとなっている模様。またONNX、CoreMLをサポートしているので、非常に沢山のフレームワークからモデルをインポートできます。
* Intel Nervana Graph
    * by Nervana
    * https://www.intelnervana.com/intel-nervana-graph/
    * https://github.com/NervanaSystems/ngraph
    * Intel Nervanaが開発しているバックエンド。当初はNervanaのフレームワークneonと、あとTensorFlowくらいしかサポートされていなかったようですが、最近ONNXを公式サポートする表明をしたりして、今後は様々なフレームワークからインポートできるようになる？なってる？ようです。
* TensorRT
    * by NVIDIA
    * https://developer.nvidia.com/tensorrt
    * NVIDIAが開発している、DNNモデルの最適化エンジン。NVIDIAが作ってるだけあって、基本はNVIDIAのGPUがターゲット。
* Intel Deep Learning Deployment Toolkit
    * by Intel
    * https://software.intel.com/en-us/dl-deployment-tool-devguide-introducing-intels-deep-learning-deployment-toolkit
    * Intelの提供するツールキットで、Caffe2などのモデルを小型化して、モバイルデバイスにデプロイできるようになるようです。
* PraidML
    * by Vertex.ai (http://vertex.ai/)
    * http://vertex.ai/blog/announcing-plaidml
    * https://github.com/plaidml/plaidml
    * https://github.com/plaidml/plaidbench
    * Vertex.AI という会社が開発しているバックエンド。Kerasをフロントエンドとして、各種ベンダ製のGPUを搭載したPC（Windows/Linux/Mac）にデプロイできます。

## おわりに
過去に書かれた同様の、フレームワーク一覧記事やリストがあるみたいなので、それを紹介しておきます。
（自分は特にこれらの記事を参考にせず、独自にまとめたんですが、いざ探してみるといっぱいあった……みんな思うところは一緒ですね……）

- Qiita記事
    - [深層学習いろいろ](https://qiita.com/Ted-HM/items/298116d03cbb9b3477e6)
    - [各機械学習ライブラリの比較をまとめる](https://qiita.com/jintaka1989/items/bfcf9cc9b0c2f597d419)
- その他
    - [Deep Learning Frameworks | NVIDIA Developer](https://developer.nvidia.com/deep-learning-frameworks)
    - [こんなにあった！ Deep Learning Frameworkまとめ | BITAデジマラボ](https://bita.jp/dml/dl_matome)
    - [Top Deep Learning Projects](https://github.com/aymericdamien/TopDeepLearning)
    - [Top 10 Deep Learning Frameworks](https://datahub.packtpub.com/deep-learning/top-10-deep-learning-frameworks/)
    - [Comparison of deep learning software - Wikipedia](https://en.wikipedia.org/wiki/Comparison_of_deep_learning_software)
    - [Deep Learning frameworks: a review before finishing 2016](https://buzzrobot.com/deep-learning-frameworks-a-review-before-finishing-2016-5b3ab4010b06)


では！