coderで四位、数々のプログラミングコンテストで受賞歴を持つすごい人。動画を見る限り今までchainerで作っていたモデルをchainerMNに移し替えるのも簡単そうです。chainerMNの思想chainerMNの高速化は王道である、と繰り返されていた。凄まじい新テクニックとかを使っているわけではない。learningにはモデルパラレルとデータパラレルという方式があるが、chainerはデータパラレルである。データパラレルでは、各GPUで同一のモデルを使い、異なる入力データに対して計算をさせる。具体的には、chainerMNではバッチセットの異なる部分を担当させている。(ベンチマークではバッチサイズは各GPU×32)一方、モデルパラレルでは各GPUに対してモデルの異なる部分(例えばGPUごとに別のレイヤー)を担当させるが、高速化の点で課題があり、現在はポピュラーではない。データパラレルにはさらに、syncとasync、2つの方式があり、chainerMNではsync方式を使っている。asyncとは各GPUを同期させずに勝手にforward(予測)→backward(勾配算出)→optimize(ニューラルネットの重み更新)をさせて勝手に各々のタイミングで重みを更新させていく方法。asyncは同期する(計算が遅いGPUを待つ)必要がなくスループット(単位時間あたりの計算量)は出るが、あるGPUでforwardした後に重みを更新した時に、すでに他のGPUが重みを更新した後でモデルが古くなっていることがある。gradientsと呼ばれる現象。)このため重みの更新が効果的でなかったり、時には悪影響だったりする。googleのチームがsyncとasyncの方式を比較した結果が以下で、asyncは正解率が低い。以上が、chainerMNがsync方式である理由である。dataの考え方を取り入れている。各GPUで同じ学習スクリプトtrain_mnist.pyを実行させるだけ。通常のchainerではforward(予測)、backward(勾配算出)、optimize(重み更新)を行うが、chainerMNではbackwardとoptimizeの間にallreduceが挟まれるのが、普通のchainerとの違い。allreduceとは、各GPUで算出された勾配を平均化すること。allreduceの提供であり、その他forwardとbackwardとoptimizeは普通のchainerでやっていることと変わらない。いままでchainerで作っていたモデルをchainerMNで使う場合、変更点はかなり少ない。chainerの提供の形chainerMNは、今後ユーザーに対しoptimizerのラッパーとして提供する予定。ユーザーはいままで、optimizerを"chainer.optimizers.MometumSGD()"と書いていたところを"chainermn.DistributedOptimizer(chainer.optimizers.MometumSGD())"とするだけ。