Upgrade to Pro — share decks privately, control downloads, hide ads and more …

深層学習フレームワーク Chainerの特徴 @第5回 産総研人工知能セミナー「深層学習フレー...

深層学習フレームワーク Chainerの特徴 @第5回 産総研人工知能セミナー「深層学習フレームワーク」

Yuya Unno

March 17, 2016
Tweet

More Decks by Yuya Unno

Other Decks in Technology

Transcript

  1. ⾃自⼰己紹介 海野 裕也 l  -2008 東⼤大情報理理⼯工修⼠士 l  ⾃自然⾔言語処理理 l  2008-2011

    ⽇日本アイ・ビー・エム(株)東京基礎研 l  テキストマイニング、⾃自然⾔言語処理理の研究開発 l  2011- (株)プリファードインフラストラクチャー l  ⾃自然⾔言語処理理、情報検索索、機械学習、テキストマイニングなど の研究開発 l  研究開発系案件、コンサルティング l  JubatusやChainerの開発 l  最近は対話処理理 NLP若若⼿手の会共同委員⻑⾧長(2014-) 「オンライン機械学習」(2015, 講談社) 2
  2. 計算グラフの例例 z = x ** 2 + 2 * x

    * y + y 8 x y _ ** 2 2 * _ _ * _ _ + _ z _ + _
  3. ニューラルネットの学習⽅方法 1.  ⽬目的関数の設計 l  計算グラフを⾃自分で設計する 2.  勾配の計算 l  誤差逆伝播で機械的に計算できる 3. 

    最⼩小化のための反復復計算 l  勾配を使って反復復更更新する 12 1さえ設計すれば残りは ほぼ⾃自動化されている
  4. 深層学習フレームワークの構成要素 l  いずれも似たような構成要素からなる l  テンソルデータ構造 l  レイヤー(関数) l  ネットワーク(計算グラフ) l 

    最適化ルーチン l  フレームワークによってこれらの設計指針や抽 象化の粒粒度度、インターフェイスが異異なる 13
  5. 計算グラフの作成戦略略 define-and-runとdefine-by-run l  define-and-run l  まず計算グラフを構築し、構築した計算グラフに データを流流すという、2ステップから成る l  ほとんどのフレームワークがこちら l 

    Caffeやtheanoなど l  define-by-run l  通常の⾏行行列列演算をする感覚で順伝播処理理をすると同 時に、逆伝播ようの計算グラフが構築される l  Chainer 15
  6. 擬似コードで⽐比較する define-and-run # 構築 x = Variable(‘x’) y = Variable(‘y’)

    z = x + 2 * y # 評価 for xi, yi in data: eval(z, x=xi, y=yi)) define-by-run # 構築と評価が同時 for xi, yi in data: x = Variable(xi) y = Variable(yi) z = x + 2 * y 20 データを⾒見見ながら 違う処理理をしてもよい
  7. 計算グラフで⽐比較する 21 s = 0 for x in [1, 2,

    3]: s += x s x + x + x + s s x + s define-and-runで ループを作る define-by-runでは すべて展開される
  8. なぜ、⾃自由度度の⾼高いフレームワークが必要か? 深層学習とは階層の深いニューラルネットのことだけでは なくなってきている l  深いボルツマンマシン l  深い畳込みニューラルネットワーク l  再帰ニューラルネットワーク l 

    双⽅方向再帰ネットワーク l  注意メカニズム(Attention) 特に⾃自然⾔言語処理理など、対象のデータの構造を活かした ネットワークを作るときに役⽴立立つ 23
  9. define-by-runのデメリット l  計算グラフの構築コストが⼤大きい l  毎計算ごとにグラフを構築する l  ループは展開される l  最適化をかけづらい l 

    2つの演算をまとめたような演算に変換できない 26 演算単位が⼤大きいベクトルなので、オーバー ヘッドは⽐比較的軽微 計算の実⾏行行を遅延させて、JITで最適化を⾏行行う ことはできそう
  10. NNフレームワークの現在・今後の課題 l  メモリ使⽤用量量の削減 l  ニューラルネットの学習はメモリを⼤大量量に消費する l  ⼀一⽅方でGPUのメモリは⼩小さい l  マルチGPU・マルチノード l 

    ⾃自動で最適化しないと使ってもらえない l  最後のTensorflowの発表に期待! l  ミニバッチ化をやめたい l  計算効率率率を上げるために、同じデータを纏めて計算している l  そのため、構造の違うデータを⼀一度度に処理理しづらい 28
  11. CuPyとNumPyの⽐比較 import numpy x = numpy.array([1,2,3], numpy.float32) y = x

    * x s = numpy.sum(y) print(s) import cupy x = cupy.array([1,2,3], cupy.float32) y = x * x s = cupy.sum(y) print(s) 33
  12. CuPyはどのくらい早いの? l  状況しだいですが、最⼤大数⼗十倍程度度速くなります def test(xp): a = xp.arange(1000000).reshape(1000, -1) return

    a.T * 2 test(numpy) t1 = datetime.datetime.now() for i in range(1000): test(numpy) t2 = datetime.datetime.now() print(t2 -t1) test(cupy) t1 = datetime.datetime.now() for i in range(1000): test(cupy) t2 = datetime.datetime.now() print(t2 -t1) 34 時間 [ms] 倍率率率 NumPy 2929 1.0 CuPy 585 5.0 CuPy + Memory Pool 123 23.8 Intel Core i7-4790 @3.60GHz, 32GB, GeForce GTX 970
  13. なぜCuPyが求められるのか? l  GPUを使った応⽤用研究では、必 要な知識識が以前より増えた l  GPU⾃自体が複雑 l  GPUを効率率率的に扱うアルゴリズム も複雑 l 

    使わないと効率率率で勝てない l  GPUを効率率率的に⼿手軽に使える仕 組みが必要になっている 35 GPU CUDA ⾏行行列列ライブラリ 深層学習エンジン 応⽤用研究
  14. ⾃自分でコードを書きたい時 例例:z[i] = x[i] + 2 * y[i] を書きたい 38

    引数の型: “float32 x, float32 y” 戻り値の型: “float32 z” 処理理: “z = x + 2 * y;” ループやインデックスの処理理は ⾃自動で埋めてくれる これだけ書け ば良良い
  15. Elementwiseカーネルの実体 l  Pythonの⽂文字列列テンプレートを使って⽣生成 39 ${preamble} extern "C" __global__ void ${name}(${params})

    { ${loop_prep}; CUPY_FOR(i, _ind.size()){ //全要素のループ _ind.set(i); //インデックスを計算 ${operation}; //計算部分 } ${after_loop}; }
  16. できる処理理 l  Elementwise l  各次元に対して同じ処理理をおこなう l  z i = f(x

    i , y i , …) for all i l  Reduction l  全次元をマージする l  z = f(f(… f(x1, x2), x3, …) それぞれMapReduceのMapとReduceに対応して いると思えば良良い 40
  17. 型を汎⽤用にしたい 例例:z[i] = x[i] + 2 * y[i] をint/float対応にしたい 41

    引数の型: “T x, T y” 戻り値の型: “T z” 処理理: “z = x + 2 * y;” 渡された配列列の型に応じて 異異なるソースを⽣生成する
  18. 型解決の仕組み l  基本的にNumPyの型規則に準拠 l  例例えばint32 + float32はfloat64になるなど、 NumPyの仕様が決まっている l  NumPyのバグ(?)も再現

    l  渡された型ごとにコードを⾃自動⽣生成する仕組み があるので、int32とfloat32に対して同じコー ドを書けばよい l  例例外を書く⽅方法も⽤用意されている 42
  19. CuPyの問題点 l  細かい単位の関数呼び出しが多くなる l  GPUの帯域律律速になってしまう l  関数合成の仕組みが必要 l  ⾮非同期呼び出しとメモリプールの相性が悪い l 

    現在は⼀一つのストリームのみ使っている l  その他 l  NumPyの関数のカバー率率率が低い l  Chainerに必要なものから実装中 45
  20. 全体のまとめ l  Chainerは⾃自由度度が⾼高い l  NNフレームワークは誤差逆伝播をやってくれる l  Chainerのdefine-by-runは⾃自由にネットワークを構築 できる l  メモリ、マルチノード、ミニバッチが今後の課題

    l  CuPyはNumPy互換の⾏行行列列ライブラリ l  NumPyとほぼAPI互換 l  ビルド作業などは裏裏で勝⼿手にやってくれる l  CUDAのコードを⾃自分で書くこともできる 46