深層学習フレームワーク chainer の開発と今後の展開

62
深層学習フレームワーク Chainer の開発と今後の展開 得居 誠也 / MIRU2016@アクトシティ浜松 Preferred Networks, Inc. / 東京大学 2016/08/01

Upload: seiya-tokui

Post on 16-Apr-2017

15.633 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 深層学習フレームワーク Chainer の開発と今後の展開

深層学習フレームワークChainer の開発と今後の展開

得居 誠也 / MIRU2016@アクトシティ浜松

Preferred Networks, Inc. / 東京大学

2016/08/01

Page 2: 深層学習フレームワーク Chainer の開発と今後の展開

自己紹介

得居 誠也 (Seiya Tokui)

Preferred Infrastructure (2012-2014), Preferred Networks (2014-)

– 分散機械学習基盤 Jubatus

– maf (実験管理)

– Chainer (NN フレームワーク)

東京大学 情報理工 コンピュータ科学専攻 博士課程 (2016-)

興味

深層学習、表現学習、強化学習、生成モデル

コンピュータビジョン、言語処理、ロボティクス

2

Page 3: 深層学習フレームワーク Chainer の開発と今後の展開

AI 分野はオープンソースソフトウェア(OSS)に支えられている

思いつくものを挙げると

多次元配列: NumPy/SciPy, R, Eigen::Tensor

プロット・可視化: Matplotlib, bokeh, ggplot2, D3.js

機械学習: scikit-learn, LIBSVM/LIBLINEAR

データ解析: Pandas, R (data frame)

コンピュータビジョン: OpenCV, PCL, VLFeat

自然言語処理: NLTK, gensim, mecab, CoreNLP

音声認識: Kaldi, Julius

深層学習: Caffe, Theano, TensorFlow, Torch, Neon, MXNet, CNTK, Chainer

etc…

3

Page 4: 深層学習フレームワーク Chainer の開発と今後の展開

AI 分野はオープンソースソフトウェア(OSS)に支えられている

思いつくものを挙げると

多次元配列: NumPy/SciPy, R, Eigen::Tensor

プロット・可視化: Matplotlib, bokeh, ggplot2, D3.js

機械学習: scikit-learn, LIBSVM/LIBLINEAR

データ解析: Pandas, R (data frame)

コンピュータビジョン: OpenCV, PCL, VLFeat

自然言語処理: NLTK, gensim, mecab, CoreNLP

音声認識: Kaldi, Julius

深層学習: Caffe, Theano, TensorFlow, Torch, Neon, MXNet, CNTK, Chainer

etc…

4

Page 5: 深層学習フレームワーク Chainer の開発と今後の展開

研究における OSS の開発

(ソフトウェア開発が本職ではない)学生や研究者が多く参加している

そもそもアカデミックな組織が主体となって作っているものも多い

(Caffe, Theano, MXNet など)

企業が主体となっている OSS でも学生や研究者が多くコミットしている

(Torch, TensorFlow, Chainer, etc.)

背景として、最先端の研究に使われているという点がある

– 深層学習の業界は arXiv 先行で非常にスピードが速い

– 最先端を知る研究者自身が開発に参加していかないと研究スピードが追いつかない

– 再現や応用の敷居の高さによって後続研究が出てくるスピードが変わる(印象)

5

Page 6: 深層学習フレームワーク Chainer の開発と今後の展開

本発表の目的と内容

深層学習に関わる学生・研究者の方々に、OSS 開発の実際のところを知っても

らい、どんどん参加できるようになってもらう

とくに学生・研究者の方々からの深層学習フレームワークへの貢献を増やす

そのために以下の事柄について話します

ニューラルネットのおさらい

深層学習フレームワークの全体像

Chainer の基本的な概念と使い方

Chainer の OSS 開発

Chainer の今後の展開

6

Page 7: 深層学習フレームワーク Chainer の開発と今後の展開

ニューラルネットのおさらい

7

Page 8: 深層学習フレームワーク Chainer の開発と今後の展開

ニューラルネット (NN)

本発表では、「深層学習」=「深い NN をつかった機械学習」とします

NN とは?

意外と難しい言葉

「シナプスの結合によりネットワークを形成した人工ニューロン(ノード)が、

学習によってシナプスの結合強度を変化させ、問題解決能力を持つようなモデ

ル全般を指す」 (https://ja.wikipedia.org/wiki/ニューラルネットワーク)

こういう絵をよく書く

Page 9: 深層学習フレームワーク Chainer の開発と今後の展開

ニューラルネット (NN)

現在よく使われるプロセッサでは、数値演算をベクトル化することで並列性を

高められる(CPU, GPU)

ニューラルネットの 1 層分の結合は、行列積として書ける

さらに並列性を高めるために、ミニバッチがよく使われる(複数のデータ点に

ついて一度に計算する)

これらを踏まえると、1 ユニットずつバラバラに書いた古典的な描像よりも、1 レ

イヤーを一つの単位にまとめたベクトル化された捉え方の方が、計算上扱いやすい

9

こういう絵の方が扱いやすい各ノードは多次元配列を表す

Page 10: 深層学習フレームワーク Chainer の開発と今後の展開

ニューラルネット=計算グラフ

最近はどんどん複雑なニューラルネットが扱われるようになっている

(encoder-decoder, attention, residual net, etc.)

もともとの「脳のニューロンのモデル化」を離れて、「微分可能な演算をうま

く組み合わせたもの」になってきている

この考え方をおしすすめると、ニューラルネット=計算グラフ となる

たとえば、最小二乗法による線形回帰の損失計算は下の計算グラフで書ける

(これも広義にはニューラルネットと思える)

10

matmul + MSE

MSE: Mean Squared Error

Page 11: 深層学習フレームワーク Chainer の開発と今後の展開

ニューラルネットの学習:確率的勾配法

確率的勾配降下法:パラメータ , 目的関数 として

このように勾配の不偏推定量のサンプリングに基づく確率的最適化をここでは

「確率的勾配法 (stochastic gradient methods)」と呼ぶことにする

勾配のランダムネスには二種類ある

– ミニバッチによるランダムネス:目的関数がデータ点ごとの関数の和で書かれるとき、

一部のデータ点に対してだけ勾配を計算すると、全体の勾配の不偏推定になる

– 計算過程のランダムネス:ニューラルネットの中にランダムな振る舞いをする演算を

入れる(例:dropout など)

– → どちらも計算グラフの枠組みで扱える

11

学習率 勾配の不偏推定

Page 12: 深層学習フレームワーク Chainer の開発と今後の展開

合成関数の微分は、ヤコビ行列の積でかける

たとえば線形回帰の例では:

このヤコビ行列の積を 1 つずつ計算する:自動微分

– cf.) 数値微分、シンボル微分(これらは違う手法!)

計算グラフの自動微分

12

matmul + MSE

Page 13: 深層学習フレームワーク Chainer の開発と今後の展開

計算グラフのリバースモード自動微分=誤差逆伝播法

ニューラルネットの場合、微分をとりたい入力変数(=パラメータ)は高次元

で、出力変数(=目的関数値)はスカラー

この場合、ヤコビ行列は右からかけていくのが効率的

この方法を誤差逆伝播やリバースモード自動微分(高速自動微分)という

13

matmul + MSE

Page 14: 深層学習フレームワーク Chainer の開発と今後の展開

現代的なニューラルネット

基本的には「(微分可能な)計算グラフ」と捉えるのがよい

とくに、全結合層や畳込み層などパラメータを持つ線形変換が途中に含まれる

ものを指すことが多い

– そうでない場合は、たとえ勾配法で学習する場合でもニューラルネットと呼ばないこ

とが多いように思う

ニューラルネットはどんどん複雑になっていっている

– 多層化:VGG, GoogLeNet, ResNet, …

– 組合せ:Encoder-Decoder, VAE, GAN, …

– 新しい演算:LSTM/GRU, soft attention, memory, dilated convolution, …

⇒ フレームワークの柔軟性がますます重要に

14

Page 15: 深層学習フレームワーク Chainer の開発と今後の展開

深層学習フレームワークの全体像

15

Page 16: 深層学習フレームワーク Chainer の開発と今後の展開

深層学習のフレームワーク

数が多い!!!

“Wikipedia:Comparison of deep learning software” に載っているもの:

Caffe, Chainer, CNTK, Deeplearning4j, MXNet, Neural Designer, OpenNN, SINGA,

TensorFlow, Theano, Torch, adnn, Blocks, CNNLab, ConvNetJS, Cortex,

CURRENNT, DeepCL, DeepLeanringKit, DeepLearnToolbox, DeepX, DSSTNE,

Faster RNNLM (HS/NCE) toolkit, GNU Gneural Network, IDLF, Keras, Lasagne,

Leaf, LightNet, MatConvNet, Neon, Neural Network Toolbox, Pylearn2, scikit-

neuralnetwork, Tensor Builder, TensorGraph, Theano-Lights, tiny-cnn, Torchnet,

Veles

2014-2015 に特にたくさん公開され、今年は少し落ち着いてきたように思う

16

https://en.wikipedia.org/wiki/Comparison_of_deep_learning_software

Page 17: 深層学習フレームワーク Chainer の開発と今後の展開

なぜニューラルネットにはフレームワークが必要?

NN 研究における要求:

NN のトポロジーを柔軟に定義したい

試行錯誤のサイクルを高速に回したい

– できるだけ NN の定義に依存するコードを減らしたい

(コードのごく一部を変更するだけでいろいろな NN を試したい)

– 計算性能も(研究者による最適化なしに)高くしたい

そのために必要なもの:

勾配計算の自動化(自動微分)

CUDA プログラミングの簡易化

効率的な実行(計算の自動最適化)

訓練ループにおける定型処理の抽象化

17

フレームワークでカバーしたい

Page 18: 深層学習フレームワーク Chainer の開発と今後の展開

NN フレームワークのソフトウェアスタック

18

デバイス特化の基盤

(e.g. BLAS, CUDA, OpenCL, cuBLAS)

デバイス特化のNN 演算

(e.g. cuDNN)

多次元配列

(e.g. Eigen::Tensor, NumPy,

CuPy)

計算グラフの実装

NN 実装の抽象化

訓練・評価ループの実装

“Low level API”

“High level API”

“Backend”

Page 19: 深層学習フレームワーク Chainer の開発と今後の展開

NN フレームワークのソフトウェアスタック

19

デバイス特化の基盤

(e.g. BLAS, CUDA, OpenCL, cuBLAS)

デバイス特化のNN 演算

(e.g. cuDNN)

多次元配列

(e.g. Eigen::Tensor,

NumPy, CuPy)

計算グラフの実装

NN 実装の抽象化

訓練・評価ループの実装

Theano

TensorFlow

Keras

TFLearn

Chainer

CuPyTorch

cuTorch

Torch.nn

Page 20: 深層学習フレームワーク Chainer の開発と今後の展開

たくさんあるフレームワークは何が違うのか

(少なくとも一定以上使われているものについては)それぞれ「売り」がある

パフォーマンスが売り

Caffe, Theano, Torch, TensorFlow, MXNet, Neon

スケーラビリティが売り

TensorFlow, MXNet

ハックしやすさが売り

Chainer, Torch

デバッグしやすさ・直感性が売り

Chainer

コミュニティの規模が売り

Caffe, Theano, Torch, TensorFlow

細かい違いはもっといっぱいある

20

どれを選ぶか? 自分のタスクに適したものを選ぶ 一緒に使うほかのツールとの相性

で選ぶ(言語など) 使い勝手、好みで選ぶ(重要)

Page 21: 深層学習フレームワーク Chainer の開発と今後の展開

PAKDD 2016DLIF チュートリアル

http://www.slideshare.net/beam2d/differences

-of-deep-learning-frameworks

より詳しいフレームワーク間の違

いについては、PAKDD 2016 で発

表したチュートリアルの得居の資

料により詳しく書いています

S. Tokui, K. Oono, A. Kanemura

and T. Kamishima.

Tutorial on Deep Learning

Implementations and Frameworks.

21

Page 22: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer の基本的な概念と使い方

22

Page 23: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer のソフトウェアスタック

Python ベースの NN フレームワーク(太字部分が Chainer)

デバイス特化の基盤

BLAS, CUDA, cuBLAS, cuRAND

デバイス特化のNN 演算

cuDNN

多次元配列

NumPy, CuPy

計算グラフの実装: Function/Variable

NN 実装の抽象化: Link/Chain, Optimizer, Serializer

訓練・評価ループの実装: Dataset, Trainer

“Low level API”

“High level API”

“Backend”

Page 24: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer のインストール方法

Python 2.7.6+, 3.4.3+, 3.5.1+ の環境で pip install chainer

CUDA サポートを有効にするには、あらかじめ環境変数をセットしておく。

典型的な例:

cuDNN (v2 ~ v5.1 に対応) のサポートを有効にするには、同様にあらかじめ

環境変数をセットしておく

Chainer インストール後に CUDA/cuDNN を有効化・アップデートしたい場合、

一度 Chainer をアンインストール(pip uninstall chainer)してから、環

境変数を設定して再インストール

24

export PATH=/usr/local/cuda/bin:$PATHexport LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

Page 25: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer における計算グラフ

Variable が配列ノードを、Function が演算ノードを表す

Variable は、配列(NumPy もしくは CuPy)を 2 つ保持する

– data が順伝播時の配列、grad が逆伝播時の配列(=勾配)

Variable に Function を適用すると、Variable が返ってくる

– data に順伝播の結果が入っている

– この Variable は、過去の計算の履歴を覚えている

– 演算の履歴は、非巡回有効グラフ (DAG) の形をしている。つまり計算グラフ

ロス(スカラー値)の Variable に対して backward() メソッドを呼び出す

と、計算グラフをたどって誤差逆伝播を実行する

このように Chainer では順伝播の計算時に動的にグラフを構築する

(動的計算グラフ、Define-by-Run)

25

Page 26: 深層学習フレームワーク Chainer の開発と今後の展開

import chainerimport chainer, chainer.functions as F, numpy as npW = chainer.Variable(np.array(...))b = chainer.Variable(np.array(...))x = np.array(...)y = np.array(...)

a = F.matmul(W, x)y_hat = a + bell = F.mean_squared_error(y, y_hat)print(ell.data) # => ロス値を出力

例:線形回帰

26

matmul + MSE

入力の準備(あとで grad を取り出す場合はあらかじめ Variable にしておく)

順伝播の計算

Page 27: 深層学習フレームワーク Chainer の開発と今後の展開

例:線形回帰

27

matmul + MSE

a = F.matmul(W, x)y_hat = a + bell = F.mean_squared_error(y, y_hat)

ell.backward() # ロスの勾配を計算print(W.grad) # => W に対する勾配を出力print(b.grad) # => b に対する勾配を出力

Page 28: 深層学習フレームワーク Chainer の開発と今後の展開

ニューラルネットのコンポーネント化: Link/Chain/ChainList

Link: 順伝播のコード片と、それに紐づくパラメータをまとめたもの

– ニューラルネットのオブジェクト指向プログラミング

Chain, ChainList: 順伝播のコード片と、そこで使われる Link をまとめたもの

– コンポーネントを階層化するもの

– これら自身も Link なので、入れ子にできる

– 子 Link を名前で管理するのが Chain, インデックス番号で管理するのが ChainList

これらには、ニューラルネットを扱う上での便利な機能もついている

Link 階層内のすべてのパラメータを集めてくる

Serializer を使ったパラメータのセーブ・ロード (npz, HDF5 に対応)

階層内のすべての Link を指定した GPU のメモリに送る

28

Page 29: 深層学習フレームワーク Chainer の開発と今後の展開

例:全結合層

29

import chainer, chainer.functions as Fimport numpy as np

class Linear(chainer.Link):def __init__(self, n_in, n_out):

super().__init__(W=(n_in, n_out), b=n_out)chainer.init_weight(self.W.data, None)chainer.init_weight(self.b.data, 0)

def __call__(self, x):xW = F.matmul(x, self.W)return xW + F.broadcast_to(self.b, xW.data.shape)

matmul

Linear

+

※ ほぼおなじ機能が chainer.links.Linear として提供されているので、普通はそれを使う

Page 30: 深層学習フレームワーク Chainer の開発と今後の展開

例:多層パーセプトロン

30

import chainer, chainer.functions as F, chainer.links as Limport numpy as np

class MLP(chainer.Chain):def __init__(self):

super().__init__(l1=L.Linear(100, 10),l2=L.Linear(10, 1),

)

def __call__(self, x):h = F.tanh(self.l1(x))return self.l2(h)

Wx+b

Linear

Linear

MLP

tanh Linear

Page 31: 深層学習フレームワーク Chainer の開発と今後の展開

class Classifier(chainer.Chain):def __init__(self, predictor):

super().__init__(predictor=predictor)

def __call__(self, x, y):y_hat = self.predictor(x)loss = F.softmax_cross_entropy(y_hat, y)accuracy = F.accuracy(y_hat, y)chainer.report({'loss': loss, 'accuracy': accuracy}, self)return loss

このような、ロス関数になっている Chain をよく使います(後述の Optimizer はこれを直接使って最適化を行うことができる)

例:多クラス分類器

31

ロスや正解率をレポート(後述の機能で集計される)

report

predictor

Classifier

SCE

accuracy

Page 32: 深層学習フレームワーク Chainer の開発と今後の展開

確率的勾配法の実装がいろいろ提供されている

SGD, MomentumSGD, AdaGrad, RMSprop, Adam, etc.

使い方:あらかじめ最適化対象の Link を渡しておき、ロス関数とその引数を

update メソッドに渡すと一回分の更新を実行

数値最適化:Optimizer

32

model = L.Classifier(...)optimizer = chainer.optimizers.SGD(lr=0.01)optimizer.setup(model) # 最適化対象 model をターゲットリンクと呼ぶ

optimizer.update(model, x, y) # 引数はロス関数とその引数

Page 33: 深層学習フレームワーク Chainer の開発と今後の展開

訓練ループは以下の繰り返し

ミニバッチを読み込む

順伝播・逆伝播の計算

Optimizer によるパラメータ更新

現在の学習性能をチェックする

定期的に訓練過程のスナップショットを取る

訓練ループの抽象化

33

Updater

Extension

Trainer

DatasetIterator

Page 34: 深層学習フレームワーク Chainer の開発と今後の展開

訓練ループ抽象化の概略

データセットはランダムアクセス可能なコンテナならなんでも OK

配列そのままでもよいし、タプルや辞書のリストとかでもよい

Iterator がデータの読み方を決める

シャッフルするかどうか、1回全データを読んだら終了するかしないか

SerialIterator がデフォルト実装で、一般にはこれで OK

MultiprocessIterator を使うとデータの読み込みをワーカープロセスで並列

化する(ディスクアクセスや前処理の並列化に有効)

Updater が Iterator と Optimizer(とそのターゲットリンク)を組み合わせ

て更新処理を行う

ParallelUpdater を使うと複数 GPU によるデータ並列ができる

34

Page 35: 深層学習フレームワーク Chainer の開発と今後の展開

訓練ループ抽象化の概略:Extension

Trainer の訓練ループに処理を追加したい場合、Extension を追加すれば良い

基本的にはただの関数(callable オブジェクト)

デフォルトで提供される extension の例:

– Evaluator:評価用データをつかって学習中のモデルを評価する

– snapshot:訓練ループ全体のスナップショットを取る

– LogReport:report() 関数であつめたレポート値の平均を定期的にログに出力

– PrintReport:LogReport がとった統計値をコンソールに出力

– ProgressBar:訓練の進捗をコンソールに出力

Extension は簡単に自作できます:例えば以下は学習率に自動減衰の例

35

@chainer.training.make_extension()def adjust_learning_rate(trainer):

optimizer = trainer.updater.get_optimizer('main')optimizer.lr = 0.01 / optimizer.t

Page 36: 深層学習フレームワーク Chainer の開発と今後の展開

より詳しくは過去スライド参照

先日、研究室のセミナーで話したスライドに

MNIST サンプルの解説があります

とくに Trainer 部分につ

いては今日お話できなかっ

た部分がもう少し詳しく書

いてあります

ほかの公式サンプル (PTB,

ImageNet) も参考になるは

ずです

36

http://www.slideshare.net/beam2d/introduction-to-chainer

Page 37: 深層学習フレームワーク Chainer の開発と今後の展開

ここまでのまとめ

現在では、ニューラルネットは計算グラフと思うのがよい

いろいろなフレームワークにはそれぞれの売りがある

Chainer は順伝播のときに動的に計算グラフを構築する

Link/Chain を使ってニューラルネットをコンポーネント化し、再利用できるよ

うになっている

訓練ループの抽象化は Dataset/Iterator, Updater, Trainer/Extension からな

Extension を使って訓練ループに自由に処理を追加できる

Page 38: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer の OSS 開発

38

Page 39: 深層学習フレームワーク Chainer の開発と今後の展開

オープンソースソフトウェアと深層学習

オープンソースライセンスを採用しているソフトウェア

– オープンソースライセンスとしては、Open Source Initiative による定義を用いるの

が一般的 (The Open Source Definition, OSD)

ほとんどの深層学習フレームワークは非コピーレフトのゆるやかなライセンス

にもとづくオープンソースソフトウェア

– Caffe: 2-Clause BSD license

– Theano, Torch: BSD license

– MXNet, TensorFlow: Apache 2.0 license

– Chainer: MIT license

ここに挙げたフレームワークはすべて GitHub 上で開発が行われている

Page 40: 深層学習フレームワーク Chainer の開発と今後の展開

GitHub (github.com)

分散バージョン管理ツール Git のリポジトリホスティングサービス

GitHub リポジトリでは Git の機能が使えるほか、以下の機能が使える

Issue トラッキング

– 任意のユーザがそのプロジェクトに関する問題を掲示板形式で議論できる

Pull Request (PR)

– 管理者以外がソースコードに変更を加えたいとき、そのリクエストが送れる

– PR に対しては自動で issue ページが作られ、そこでその変更について議論できる

– 管理者であっても PR は送れる

コードレビュー

– PR の変更行に対してコメントを追加したり、その場で議論できる

などなど(ほかに Wiki をつくる、統計を見るなど)

40

Page 41: 深層学習フレームワーク Chainer の開発と今後の展開

例:コードレビュー

41

Page 42: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer の開発に関わる人々

42

Chainer チーム(コミッター、レビュワー)

※ PFN

PR コントリビューター(現在計 67 名)

その他コントリビューター(issue 報告など)

Page 43: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer の開発に関わる人々

PFN 社内のみにいるのはおもにコアメンバー(コミッター)とレビュワー

コミッター:リポジトリ本体に直接変更を加える権限を持つ人

– 送られてきた PR を本体にマージするのもコミッターの仕事

レビュワー:PR のコードレビューをする人

もちろん社内にも(コアメンバー外の)Chainer ユーザーがたくさんいる

ユーザーの中で特によく使ってくれている人たちがレビュワーになっている

社内ユーザーは、社外のユーザーと同じように issue 登録したり PR を投げた

りする(オフラインでの相談もよくする)

43

Page 44: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer の開発史(主要なもの)

2015/4 開発開始

2015/5 ロゴ策定、ドキュメント・ウェブサイトの準備等

2015/6 v1.0 公開

2015/7 v1.1: 型チェック機能, Caffe モデル読込, Python3 サポート

2015/9 v1.3: CuPy リリース

2015/11 v1.5: Link/Chain 追加, CuPy の Cython 化

2016/1 v1.6: 互換性ポリシーの導入(後方互換性サポートを開始)

2016/3 v1.7: デバッグモード、FunctionHook 追加

2016/5 v1.9: Weight initializer 追加、浮動小数点型サポートの拡大

2016/6 v1.10: Minor リリースポリシーの変更

2016/7 v1.11: Dataset/Trainer 追加

44

Page 45: 深層学習フレームワーク Chainer の開発と今後の展開

今のところ master ブランチで開発している

非コミッターの場合、まず自分のアカウントに Chainer リポジトリをフォーク

してからブランチを作り、変更を加え、PR を送る

PR を送ると、レビュワーがコメントを加え、PR 送信者がそれに答える

(コメントに返信するか追加の変更を加える)。これを収束するまで繰り返す

Chainer の開発の進め方

45

master ブランチ

機能 1 ブランチ

機能 2 ブランチ

PR/レビュー/マージ

v1.x.y リリース!(タグ)

Page 46: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer コアチーム/レビューチームのスケジュール

毎週 1 日、顔を付きあわせて開発する時間をとっている(集中開発)

隔週火曜日のリリースでも集まってリリース作業を行う

毎リリース後に反省会と、次リリースの相談

より長いスパンの予定についてもリリース後に議論

これらとは別に、レビュワーチームと一緒にひたすらレビューする時間も週 2

回とっている(最近)

– PR レビューはどんどん加速していきたいと考えています

46

Page 47: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer の開発環境

Chainer の開発には GPU が載っているマシンが必要

– 特に全機能を触りうるコアメンバーは、GPU が最低 2 台載っているマシンが必要

テストは自動化している:継続的インテグレーション (CI)

– OSS の場合、無料で利用できる CI サービスがいくつかある

– Chainer ではそのうち TravisCI (Linux, Mac) と AppVeyor (Windows) を利用中

– これらを使って同時にテストのコードカバレージ(テストで実行されるコードの行数

とその割合の計測)を coverage.io で行っている

– ただし、公開 CI はどれも GPU 未対応

社内に GPU のあるサーバーを用意して、そこでも別に CI を回している

– Jenkins を利用

– 環境の仮想化に NVIDIA Docker を利用している

– セキュリティ上の理由で、この CI は PFN 社内開発者のみが見られる

47

Page 48: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer の開発に貢献するには

大きく以下の貢献ポイント

本体の開発

サンプルの追加・改善

ドキュメントの追加・改善

リポジトリ外での貢献

48

Page 49: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer への貢献:本体の開発

変更を書いて、PR を送り、レビューに対応して、マージされる

変更を書き始める前に、issue を作っておいて「自分これやります」と宣言して

おくこともある(他の人と同じ変更を重複して書くのを避けられる)

変更を書くときのポイント

あらかじめ “Contribution Guide” を読んでおく!

– コーディングスタイルなど、PR を送る際のルールが書いてある

コーディングスタイルに従う(チェックツールもある)

変更に対応するテストを必ず書く

– 自明な typo 修正などとても小さな変更で正しさが明らかなものには必要ない

機能追加の場合、ドキュメントを書く(重要!)

49

Page 50: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer への貢献:本体の開発

変更の種類(上に行くほど簡単でおすすめ)

小さなバグの修正:レビューもすぐ済み、低コストでマージされることが多い

実装の改善(高速化など)

– レビュワーが検証する必要があるので、少し時間がかかる

– インターフェイスが変わらなければ、効果があるかぎりすんなりマージされやすい

新しい Function, Link, CuPy 関数の追加

– ほかの変更と独立しているため、コンフリクトが起きにくい

– インターフェイスの検証が必要であり、またドキュメントも必要なので、レビューに

は時間がかかる

コア機能の追加(例:Weight Initializer)

– レビューはもっともタフなものになる

– その代わりマージされたときの貢献度合いはもっとも高いといえる

50

Page 51: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer への貢献:サンプル/ドキュメントの追加・改善

既存サンプルの改善は、わりとすんなりマージされやすい

– ただし、機能の使い方が意図していないものだと時間がかかったり、却下されること

もある

新しいサンプルの追加は、行数も多いためレビューには少し時間がかかる

– 「がっつり添削してもらえる」と考えることもできる

– Chainer は公式サンプルが不足気味なので、サンプル追加はとても歓迎されま

す!!!

– 公式サンプルに入っていないタスクならなんでも OK

ドキュメントの改善はわりとすんなりマージされやすい

– 英語表現の改善、obsolete な内容の更新など

– どんな細かい変更でも歓迎します。おそらく貢献の敷居はドキュメントが一番低い

51

Page 52: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer への貢献:リポジトリ外での貢献

ソースコードに変更を加える以外にも、Chainer コミュニティーへの貢献の仕方は

たくさんある

バグや機能リクエストなどを issue に書く

論文における実験の(追試)スクリプトを GitHub などにアップロードする

– 宣伝もできるとなおよし!

– 連絡していただければ、Chainer の公式 Twitter アカウントでツイートします(こち

らで見つけた場合に勝手にツイートすることもあります)

– 何かしらの方法で学習済みモデル(シリアライズしたもの)もアップロードしてくれ

るとさらにグッド

フォーラムに質問を投げる、フォーラムの質問に答える

使い方や機能、上に書いた「追試」などのブログを書く

勉強会などで Chainer にまつわる発表を行う

52

Page 53: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer への貢献:公開集中開発

およそ月に 1 回のペースで「公開集中開発」を開催しています

Chainer コアチームのメンバーと一緒にもくもくと開発する会

– 開発は、本体リポジトリへの PR/マージ を目標とするもののもが対象

– 本体の開発でも、ドキュメント・サンプルの改善・追加でも OK

疑問点があったときにすぐ開発者に相談できるという点でおすすめです

53

Page 54: 深層学習フレームワーク Chainer の開発と今後の展開

学生・研究者がコードを公開する意味

現状、論文の発表などの業績という点で、ソースコードを公開するインセン

ティブはあまり働いていない

学生の場合には、開発の実績として就職活動の際には利用可能

それに限らず、とくに深層学習においては研究の再現性が重要

– 再現するために必要な情報をすべて論文に書き切ることができない場合も多い(とく

にスペースの制限された会議論文などの場合)

– 再現に必要なスクリプトを公開すれば、その研究のフォロワーがつきやすくなると考

えられる(自分でチューニングをやりなおすことなく、関連研究や応用ができる)

– よって、スクリプトの公開は、論文の refer を増やす効果があると予想される

54

Page 55: 深層学習フレームワーク Chainer の開発と今後の展開

OSS 開発に参加する意味

(とくに学生にとって)

PR を送ることは、自分のコードをほかの開発者に直接レビューしてもらえる機

会になる

自分の研究分野で必要な機能を本体に積極的に取り込んでもらうと、その機能

を使う研究者・実務家が増える

– するとこの人たちが関連する機能をさらに公開したり PR を送ったりするようになる

– これらは最初に機能を書いた人にとってはただで利用できる機能ということになる

– Chainer 自体の公開も、根底にはこの狙いがある(クローズドに開発するよりも開発

スピードが上がるだろうという点)

55

Page 56: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer の今後の展開

56

Page 57: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer の学習・貢献をもっとスムーズにする

現状

学習:公式チュートリアルとサンプルを読む(分量、バリエーションが足りて

いない)

貢献:本体へ PR(敷居が高い)、GitHub にコードを上げる(検索性が悪い)

もっと段階的に入門から PR へのサポートをしたい

(幅広い層のユーザーをサポートしていきたい)

Page 58: 深層学習フレームワーク Chainer の開発と今後の展開

予定している学習・貢献段階の充実

公式ドキュメント(今までどおり)

Chainer 100 本ノック

Chainer Blog

Chainer プラグインリポジトリ(仮)

PR(今までどおり)

(まだ企画・準備段階なので、具体的な形式・内容は未定です)

58

新しく実施予定

Page 59: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer 100 本ノック

Cf.) 言語処理 100 本ノック http://www.cl.ecei.tohoku.ac.jp/nlp100/

Chainer を使って深層学習の研究をはじめるために必要な知識を学ぶための問

題集

初学者向けの内容で、たとえば学生の方にまずこれをやって深層学習の実装上

の知識や Chainer の使い方を知ってもらう

59

Page 60: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer Blog

Chainer の使い方や example についてのブログ

主な目的は example の充実で、このブログ上で公式 example でカバーされて

いない様々な応用について、Chainer のコードつきでタスクや手法の解説をし

ていきたい

100 本ノックと比べると、すでに Chainer を触り始めている人向け

余裕があれば Chainer の各機能についてのチュートリアルより突っ込んだ解説

などもしていきたい(cf. NVIDIA の Parallel Forall Blog)

60

Page 61: 深層学習フレームワーク Chainer の開発と今後の展開

Chainer プラグインリポジトリ(仮)

Chainer の Function や Link などのある程度独立した機能を共有するサービス

GitHub の本体リポジトリに PR を送らなくても、ほかのユーザと最新の手法実

装を共有する場所をつくりたい

– 現状でも GitHub の自分のリポジトリを作り、そこに実装を置いておくことは可能

– 多くの研究者・実務家が、論文の実験スクリプトや再現スクリプトを公開している

– しかし、これらは検索しづらいし、提供のされ方もバラバラ

– 専用のサービスに登録できるようにすれば検索・利用しやすくなり手法の再現・応用

の敷居がさらに下がる

これはすでに自分のタスクのために Chainer を使っている人向け

61

Page 62: 深層学習フレームワーク Chainer の開発と今後の展開

まとめ

ニューラルネット (NN) は誤差逆伝播できる計算グラフ

NN のフレームワークは Backend、低レベルAPI、高レベルAPI からなる

Chainer は Backend である CuPy と、動的計算グラフおよび訓練ループの抽

象化からなる

Chainer の OSS 開発は PFN のコア開発者が主導して進めているが、外部から

の貢献が大きなウェイトを占めている

学生や研究者がコードを公開したり、OSS 開発に参加することは、研究遂行上

も意味がある(と考えている)

さらに Chainer の利用を広めていくために、リソースの提供を増やしていき、

また共有の仕組みも強化していく予定

62