Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Chainer Familyで始めるComputer Visionの研究・開発【修正版】

5,354 views

Published on

2018年4月21日 名古屋CV/PRML勉強会で使用した資料の修正版です

Published in: Engineering
  • Be the first to comment

Chainer Familyで始めるComputer Visionの研究・開発【修正版】

  1. 1. 2018/4/21@名古屋CV/PRML勉強会 @sakanazensen, Preferred Networks Chainer Familyで始める Computer Visionの研究・開発
  2. 2. 自己紹介 おさかなさん (@sakanazensen) Engineer at Preferred Networks, Inc. • ~2010 高専@山口(高専プロコン) • ~2012 B 豊橋技科大(内視鏡画像からのSfM) • ~2014 M 名大院 村瀬研(Semi-supervisedな歩行者検出) • nagoyacv 2代目幹事 • ~2016 Web系IT企業 エンジニア(兼 日曜Cver) • 2016.9~ エンジニア
  3. 3. PFNでのお仕事(と求人情報) 自動運転のための認知・判断技術の研究開発 JAFウェブサイトより • 軽量・高精度な認識モデルの研究 • 学習方法を工夫する研究 • 組み込み実装のための技術検証 • シーン理解のためのジオメトリ技術 などなど…
  4. 4. PFNでのお仕事(と求人情報) 自動運転のための認知・判断技術の研究開発 JAFウェブサイトより • 軽量・高精度な認識モデルの研究 • 学習方法を工夫する研究 • 組み込み実装のための技術検証 • シーン理解のためのジオメトリ技術 などなど… PFNでは自動運転技術の エンジニア・リサーチャーの 採用を強化しています! 一緒にチャレンジしましょう!
  5. 5. 関東Computer Vision勉強会の宣伝 https://kantocv.connpass.com/event/76984/
  6. 6. 関東Computer Vision勉強会の宣伝 https://kantocv.connpass.com/event/76984/
  7. 7. 関東Computer Vision勉強会の宣伝 • 名古屋CV勉強会との姉妹勉強会 • 概ね隔月ぐらいのペースで開催 • nagoyacv元関係者も多い • 名古屋と比較すると社会人 (エンジニア等)が多め? • 招待講演も多い • 研究会・シンポジウムとの共催も PFN前田先生の招待講演(強化学習) 東大 樋口先生の招待講演(HCI)
  8. 8. Chainer Familyで始める Computer Visionの研究・開発
  9. 9. 今日する話 • ニューラルネットの基礎のおさらいとChainerの仕組み • Chainer/Cupyの簡単な使い方 • CV的に便利なChainer Familyの紹介: Chainer{CV|UI|MN}, ONNX-Chainer 今日しない話 • 他フレームワークとのSide-by-Side比較(僕があまり詳しくないので…) • かなり高度なChainer機能の解説(Double-backpropなど) • その他のChainer Familyについて
  10. 10. Webサイト https://chainer.org/ Github: https://github.com/chainer/chainer S. Tokui, et al., “Chainer: a Next-Generation Open Source Framework for Deep Learning,” in Proc of Workshop on Machine Learning Systems(LearningSys) in The Twenty-ninth Annual Conference on Neural Information Processing Systems (NIPS), 2015
  11. 11. Webサイト https://chainer.org/ Github: https://github.com/chainer/chainer エンジニア・研究者がニューラルネットに期待する 振る舞いをそのままPythonコードで書ける →開発や追跡=デバッグが容易(詳細は後述) S. Tokui, et al., “Chainer: a Next-Generation Open Source Framework for Deep Learning,” in Proc of Workshop on Machine Learning Systems(LearningSys) in The Twenty-ninth Annual Conference on Neural Information Processing Systems (NIPS), 2015
  12. 12. Chainer 「ChainerはPythonicな 機械学習フレームワーク」 -- Travis Oliphant(numpy開発者) • Full Pythonなフレームワーク • “Define-by-Run”の概念を 初めて提唱(詳細後述) • OSS (MIT license) • Github上でオープンに開発 • 歴史 • 2015 PFN得居がGWに開発 • 2015.6 正式版(1.0)リリース • 2017.6 cupyの独立 • … • 2018.4 chainer4/cupy4リリース
  13. 13. NVIDIA GPU BLAS cupy cuDNN numpy Chainer ChainerCV … Chainerエコシステム概観 ※ChainerMNではMPI層とNCCL層が挟まる cuBLAS CUDA iDeep CPU Python MKL-DNN 少し厳密でない部分もありますが 概観ということでご容赦ください
  14. 14. NVIDIA GPU BLAS cupy cuDNN numpy Chainer ChainerCV … Chainerエコシステム概観 ※ChainerMNではMPI層とNCCL層が挟まる cuBLAS CUDA iDeep CPU Python MKL-DNN ユーザが触るのはこのあたり 少し厳密でない部分もありますが 概観ということでご容赦ください
  15. 15. Neural Networkの学習と Chainerの仕組み 〜ボトムアップ的にChainerの仕組みと使い方を解説します〜
  16. 16. ニューラルネット
  17. 17. ニューラルネット=計算グラフ 𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2 • 全体として巨大な関数 𝐹 𝑥0 = 𝑓3(𝑓2(𝑓1(𝑥0))) をなす • 複雑なNNも結局、関数同士が繋がる有向グラフ • 各関数は入力と、固有のパラメータ(重み)から出力を計算 • なので実際は 𝑓𝑘(𝑥 𝑘, 𝑤 𝑘) と表記したほうがわかりやすいかも
  18. 18. ニューラルネットの学習 𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2 • やりたいこと: • 入力をNNに通した出力と教師信号の差が最小になる重みを獲得 • 方針: • 層ごとに、その層の重みに関する損失の勾配=微分値を求める • 勾配の方向(の逆)に重みを更新する(勾配降下法) 𝑡以下略
  19. 19. 勾配の計算:backprop(導出は省き、操作の雰囲気だけ) 𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2 • 層𝑘の誤差𝛿 𝑘 = 出力側隣の𝛿 * 出力側隣の重み * 𝑓𝑘 ′ (この層の入力𝑥) • 層𝑘の重みの勾配 𝜕𝐶 𝜕𝒘 𝑘 = 誤差𝛿 𝑘 * 入力側隣の出力 出力層の誤差𝛿が求まると入力側まで順に𝛿が求まり勾配が計算できる エクスキューズ: 意図的に雑なかんじ にしています🙏
  20. 20. 勾配の計算:backprop(導出は省き、操作の雰囲気だけ) 𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2 誤差𝛿3 • 層𝑘の誤差𝛿 𝑘 = 出力側隣の𝛿 * 出力側隣の重み * 𝑓𝑘 ′ (この層の入力𝑥) • 層𝑘の重みの勾配 𝜕𝐶 𝜕𝒘 𝑘 = 誤差𝛿 𝑘 * 入力側隣の出力 出力層の誤差𝛿が求まると入力側まで順に𝛿が求まり勾配が計算できる
  21. 21. 勾配の計算:backprop(導出は省き、操作の雰囲気だけ) 𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2 誤差𝛿3 勾配 𝜕𝐶 𝜕𝒘3 • 層𝑘の誤差𝛿 𝑘 = 出力側隣の𝛿 * 出力側隣の重み * 𝑓𝑘 ′ (この層の入力𝑥) • 層𝑘の重みの勾配 𝜕𝐶 𝜕𝒘 𝑘 = 誤差𝛿 𝑘 * 入力側隣の出力 出力層の誤差𝛿が求まると入力側まで順に𝛿が求まり勾配が計算できる
  22. 22. 勾配の計算:backprop(導出は省き、操作の雰囲気だけ) 𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2 誤差𝛿3 勾配 𝜕𝐶 𝜕𝒘3𝛿2 𝜕𝐶 𝜕𝒘2 • 層𝑘の誤差𝛿 𝑘 = 出力側隣の𝛿 * 出力側隣の重み * 𝑓𝑘 ′ (この層の入力𝑥) • 層𝑘の重みの勾配 𝜕𝐶 𝜕𝒘 𝑘 = 誤差𝛿 𝑘 * 入力側隣の出力 出力層の誤差𝛿が求まると入力側まで順に𝛿が求まり勾配が計算できる
  23. 23. 勾配の計算:backprop(導出は省き、操作の雰囲気だけ) 𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2 誤差𝛿3 勾配 𝜕𝐶 𝜕𝒘3𝛿2 𝜕𝐶 𝜕𝒘2𝛿1 𝜕𝐶 𝜕𝒘1 • 層𝑘の誤差𝛿 𝑘 = 出力側隣の𝛿 * 出力側隣の重み * 𝑓𝑘 ′ (この層の入力𝑥) • 層𝑘の重みの勾配 𝜕𝐶 𝜕𝒘 𝑘 = 誤差𝛿 𝑘 * 入力側隣の出力 出力層の誤差𝛿が求まると入力側まで順に𝛿が求まり勾配が計算できる
  24. 24. 勾配の計算:backprop(導出は省き、操作の雰囲気だけ) 𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2 誤差𝛿3 勾配 𝜕𝐶 𝜕𝒘3𝛿2 𝜕𝐶 𝜕𝒘2𝛿1 𝜕𝐶 𝜕𝒘1 • 層𝑘の誤差𝛿 𝑘 = 出力側隣の𝛿 * 出力側隣の重み * 𝑓𝑘 ′ (この層の入力𝑥) • 層𝑘の重みの勾配 𝜕𝐶 𝜕𝒘 𝑘 = 誤差𝛿 𝑘 * 入力側隣の出力 出力層の誤差𝛿が求まると入力側まで順に𝛿が求まり勾配が計算できる 計算グラフをたどって 出力側ノードから伝達される 各層の関数は同時に 導関数𝑓𝑘 ′ も持ち、BP時に計算
  25. 25. backpropによる勾配計算に必要なもの 𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2 • 𝑘番目の層について • その層の入力𝑥 • 導関数の値𝑓𝑘 ′ (𝑥) • その層を生成した関数への参照 • 出力層の誤差δ • 損失関数の微分から陽に求まる Chainerの計算グラフは forward-pass/BPの際に裏で自動的に これらを計算・キープする仕組み
  26. 26. Chainerでの計算グラフの構築 順伝搬をPythonで書くと内部で計算グラフが自動構築される
  27. 27. Chainerでの計算グラフの構築 まずパラメータつきの関数を宣言しておく • Chainerではこれを”Link”と呼ぶ • パラメータのないものを ”Function”と呼び分ける • ReLUなどが該当 • Linkの実体は、Functionとそのパラメータを 一緒に保持するための箱
  28. 28. Chainerでの計算グラフの構築 続いて入力を用意する • 型はnumpy/cupyの配列 • cupyの詳細は後述します 𝑥0 計算グラフ
  29. 29. Chainerでの計算グラフの構築 関数を呼ぶと… • 計算グラフが構築される • 「𝑥1が𝑥0から𝑓1により作られた」 • 中間値は”Variable” • 実際の値と、親Functionへの参照をもつ • 関数は”Function” • Linkも計算グラフ上ではFunction • 入力されたVariableへの参照をもつ • 導関数𝑓𝑘 ′ ももつ 𝑓1(_, 𝑤1) 𝑥0 𝑥1 Function Variable 計算グラフ
  30. 30. Chainerでの計算グラフの構築 関数を呼ぶと… • ロスまでの計算グラフが完成 𝑓1(_, 𝑤1) 𝑥0 𝑓2(_, 𝑤2) 𝑥1 𝑥2 Function Function Variable Variable 計算グラフ
  31. 31. Chainerでの計算グラフの構築 関数を呼ぶと… 𝑓1(_, 𝑤1) 𝑥0 𝑓2(_, 𝑤2) 𝑥1 𝑥2 𝑓3(_, 𝑤3) 𝑦 Function Function Function Variable Variable Variable 計算グラフ • ロスまでの計算グラフが完成
  32. 32. Chainerでの計算グラフの構築 backward()で各層の勾配を計算できる • 計算グラフをたどり 各関数の勾配を求める • あとは勾配を使い重みを更新 𝑓1(_, 𝑤1) 𝑥0 𝑓2(_, 𝑤2) 𝑥1 𝑥2 𝑓3(_, 𝑤3) 𝑦 Function Function Variable Variable Variable 𝛿3 𝛿2 𝛿1 𝜕𝑓1 𝜕𝑤1 Function 𝜕𝑓2 𝜕𝑤2 𝜕𝑓3 𝜕𝑤3 計算グラフ
  33. 33. 動的な構造のネットワークの計算グラフ 任意の条件でネットワークの構造を変えられる • 単に動的な構造をPythonコード で順伝搬ロジックを書けばOK • 勾配計算・重み更新は計算グラフ に現れたパスのみで走る 𝑓1(_, 𝑤1) 𝑥0 𝑓2(_, 𝑤2) 𝑥1 𝑥2 𝑓3𝑎(_, 𝑤3) 𝑦 計算グラフ 𝑓3𝑏(_, 𝑤3) 𝑦めっちゃ直感的!!!
  34. 34. “Define-by-Run”: Chainerが初めて提唱したコンセプト 順伝搬を走らせることによって計算グラフをその都度構築する 対義語:”Define-and-Run” 予めニューラルネット構造を定義し、後はそれに従って学習・推論 Pros Cons • RNN等含め動的構造のNNの記述が容易 • 巨大な構造の記述も容易 • forループで関数呼び出しを繰り返せばOK • 順伝搬の実行とコードが対応 • デバッグや追跡が容易 • 毎回構造が変わる(ことを想定する必要 がある)ので処理の最適化は困難 • 毎回の計算グラフ構築のコスト • モデルファイル自体は構造を表さない • 常にコードとモデルを同時にデプロイ
  35. 35. “Define-by-Run”: Chainerが初めて提唱したコンセプト 順伝搬を走らせることによって計算グラフをその都度構築する 対義語:”Define-and-Run” 予めニューラルネット構造を定義し、後はそれに従って学習・推論 Pros Cons • RNN等含め動的構造のNNの記述が容易 • 巨大な構造の記述も容易 • forループで関数呼び出しを繰り返せばOK • 順伝搬の実行とコードが対応 • デバッグや追跡が容易 • 毎回構造が変わる(ことを想定する必 要がある)ので処理の最適化は困難 • 毎回の計算グラフ構築処理のコスト • モデルファイル自体は構造を表さない • 常にコードとモデルを同時にデプロイ そのわりにChainerは結構速く GPUを使うDLライブラリ中では 平均的な速さで学習ができる https://github.com/ilkarman/DeepLearningFrameworks
  36. 36. Chainerでの学習(1) ~モデルの定義~ まずNNをchainer.Chainなクラスで定義 • やってることはこれまでと全く同じ • まとめてモデルを保存したりGPUに 送ったりといった便利機能が使える
  37. 37. Chainerでの学習(1) ~モデルの定義~ まずNNをchainer.Chainなクラスで定義 self.init_scope() によって、 ChainerにこのNNの持つ学習対象の 関数の一覧を教えてあげる • やってることはこれまでと全く同じ • まとめてモデルを保存したりGPUに 送ったりといった便利機能が使える
  38. 38. Chainerでの学習(1) ~モデルの定義~ まずNNをchainer.Chainなクラスで定義 reluなど学習すべき重みのない関数 (”Function”) はその場で直接呼ぶ • やってることはこれまでと全く同じ • まとめてモデルを保存したりGPUに 送ったりといった便利機能が使える
  39. 39. Chainerでの学習(1) ~モデルの定義~ まずNNをchainer.Chainなクラスで定義 __call__()に順伝搬を書くことで という書き方で呼べる • やってることはこれまでと全く同じ • まとめてモデルを保存したりGPUに 送ったりといった便利機能が使える
  40. 40. Chainerでの学習(2) ~学習イテレーション~ 学習:入力をNNに通す→ロス計算→BPで勾配計算→重み更新 を回す
  41. 41. Chainerでの学習(2) ~学習イテレーション~ 1サンプル(1バッチ)での学習を手書きしてみると…
  42. 42. Chainerでの学習(2) ~学習イテレーション~ 1サンプル(1バッチ)での学習を手書きしてみると… • NNのオブジェクトを作る • 最適化エンジンのオブジェクトを作り 学習対象を教える
  43. 43. Chainerでの学習(2) ~学習イテレーション~ 1サンプル(1バッチ)での学習を手書きしてみると… • 入力を用意する • numpyまたはcupyのfloat32なarray • shape(次元)は(batch, in_dim) • 先頭をバッチ軸にするのがお作法 • Conv2Dの場合は(batch, C, H, W)
  44. 44. Chainerでの学習(2) ~学習イテレーション~ 1サンプル(1バッチ)での学習を手書きしてみると… • 用意した入力を順伝搬 • ロスを求める
  45. 45. Chainerでの学習(2) ~学習イテレーション~ 1サンプル(1バッチ)での学習を手書きしてみると… • backwardによって層ごとの勾配を計算 • SGD optimizerにより重み更新 • 実際はこれをループしないといけない
  46. 46. Chainerでの学習(3) ~学習ループ~ 配列にロード済みのデータで 100エポック学習する簡単なコード
  47. 47. Chainerでの学習(3) ~学習ループ~ • このあたりは1サンプル学習と全く一緒 • 準備 • データを1つ与え勾配を求め更新まで
  48. 48. Chainerでの学習(3) ~学習ループ~ データは全てロード済みとする (numpy arrayのリスト) エポックを回すループ バッチ(iteration)を回すループ
  49. 49. Chainerでの学習(3) ~学習ループ~ エポックごとにデータをシャッフルし バッチ化しNNに入れる
  50. 50. Chainerでの学習(3) ~学習ループ~ エポックごとにモデルを保存する lossをprintして学習曲線を描く…等もこの辺で
  51. 51. Chainerでの学習(4) ~Trainer~ 毎回全部手書きはツライ!! 使いやすく抽象化された仕組み が整備されています
  52. 52. Chainerでの学習(4) ~Trainer~ 毎回全部手書きはツライ!! “Iterator”:バッチ作成担当 “Updater”:forward/backwardと更新担当 “Extension”: こまごまする担当 使いやすく抽象化された仕組み が整備されています “Dataset”:データ読み込み担当
  53. 53. Chainerでの学習(4) ~Trainer~ 毎回全部手書きはツライ!! “Iterator”:バッチ作成担当 “Trainer”: 全てを仕切る神 “Updater”:forward/backwardと更新担当 “Extension”: こまごまする担当 使いやすく抽象化された仕組み が整備されています “Dataset”:データ読み込み担当
  54. 54. Chainerでの学習(4) ~Trainer~ https://github.com/chainer/chainer/blob/master/examples/mnist/train_mnist.py から抜粋 “Dataset”:データ読み込み担当 “Iterator”:バッチ作成担当 “Updater”:forward/backwardと更新担当 “Trainer”: 全てを仕切る神 “Extension”: こまごまする担当 ※他の全てが最終的にTrainerに登録される Trainerを使った学習コード 学習ループを回す
  55. 55. Chainerでの学習(4) ~Trainer~ https://github.com/chainer/chainer/blob/master/examples/mnist/train_mnist.py から抜粋 “Dataset”:データ読み込み担当 “Iterator”:バッチ作成担当 “Updater”:forward/backwardと更新担当 “Trainer”: 全てを仕切る神 “Extension”: こまごまする担当 ※他の全てが最終的にTrainerに登録される Trainerを使った学習コード 学習ループを回す こっそりおまじない: softmax_cross_entropyまで 1つのNNにしてくれる
  56. 56. 高度な学習をする場合 example: GAN • GeneratorとDiscriminatorの2つのNNを同時かつ独立に学習する • Optimizerを2つ持つupdaterが必要 example: Triplet loss (類似度学習NN) • 最新のモデルの出力で次に投入するデータを決める • 特殊なIteratorの自前実装が必要 ※1 http://gluon.mxnet.io/chapter14_generative-adversarial-networks/dcgan.html ※2 https://arxiv.org/pdf/1503.03832.pdf ※1 ※2 (Chainerに限らず当然ですが) ある程度DL世界とChainer世界の関係 が頭の中で対応づいてる必要がある
  57. 57. Chainerでの推論 学習ができたら推論もしたい • 普段通り順伝搬を呼べば大抵OK • が、NN出力そのままでは不便なことも • 推論用の関数を追加で書くと便利
  58. 58. Chainerでの推論 callはFC層の出力を返すので使いにくい →argmaxしてスコアと共に返すような 推論関数predict()を実装 学習ができたら推論もしたい • 普段通り順伝搬を呼べば大抵OK • が、NN出力そのままでは不便なことも • 推論用の関数を追加で書くと便利
  59. 59. Chainerでの推論 学習ができたら推論もしたい • 普段通り順伝搬を呼べば大抵OK • が、NN出力そのままでは不便なことも • 推論用の関数を追加で書くと便利 ここで__call__を呼んで forward passを実行している
  60. 60. なぜChainerが「直感的」か • 複雑な順伝搬のロジックがそのままコードに書ける • プログラマにとって挙動が一目瞭然 • フレームワーク特有の知識の要求が少ない • 順伝搬が毎回そのコードに沿って走る • バグ等があるとその場所で落ちてくれる • 追跡もしやすい • 全般に「やりたいことをそのままコードで書けば期待通り動く」 • 計算グラフは生き物 • NN構造も入力のshapeも毎回変わっていい • 生き物を生き物として扱ってあげるChainer 個人の見解です!
  61. 61. Chainerを使いこなすために必要なもの・こと • ニューラルネット・深層学習の基本の理解 • 基本的な理論 • 学習のアルゴリズム、フロー • Pythonとnumpyである程度自由に書けること • 多少のComputer Science的な思考回路 • 技術文書を読める程度の英語力 • GPUが1024台※程あると便利。無い人は で待ってます! Chainerに限った 話じゃない! 個人の見解です! 1536台※ ※ https://www.preferred-networks.jp/ja/news/pr20170920 ※ https://www.preferred-networks.jp/ja/news/pr20180328
  62. 62. Chainerの力をGPUで引き出す cupy
  63. 63. Chainerの(NVIDIA)GPU用バックエンドとして開発された numpy互換の配列操作ライブラリ(が、用途はDLに限定しない) Webサイト https://cupy.chainer.org/ Github: https://github.com/cupy/cupy
  64. 64. numpy vs cupy example: モンテカルロシミュレーションで𝜋を計算してみる 多くの場合同じコードが使いまわせる! そうでない場合 → Pull Requestを!🙇
  65. 65. numpy vs cupy with Chainer example: ここまでお馴染み3層MLP ポイント • cupy.arrayをnumpy.arrayから生成 • to_gpuでモデル(の重み)をGPUに送る • 同じコードがまるっと使いまわせる • to_gpuの有無だけで完全にCPU/GPU互換に
  66. 66. numpy/cupy共存時の便利なイディオム (2) 受け取った配列がnumpyかcupyか 動的に判定し使い分ける (1) メソッドの引数にcupy/numpy どちらを使うか渡す
  67. 67. numpy vs cupy: performance example: 先ほどのモンテカルロ𝜋計算のベンチマーク ※cupyでは1回目だけはCUDAカーネルのコンパイルが走るので少し時間がかかります 時間/回 倍率 numpy 6.14秒 x1.00 cupy 0.171秒 x35.96 機械学習以外の一般データ解析にも非常に便利 ※i7-7700K, GTX1080Ti, cupy4.0
  68. 68. numpy vs cupy: performance example: VGG16の順伝搬 VGG16 時間/回 倍率 numpy 662ms x1.00 cupy 4.9ms 135x cupy+cuDNN 3.4ms 194x ※cupyは、使える時は自動でcuDNNを使う ※4.0からiDeep(MLK-DNN)が使えるので、CPUでも速くなります ※i7-7700K, GTX1080Ti, cupy4.0
  69. 69. 画像処理的に便利なcupyの機能 • numpyと等価の配列操作による画像の加工 • スライスによるクロップ/反転など • 転置や正規化・mean subtractionなど • GPU上での画像のアフィン変換[New!] • 最近傍補間・線形補間 • (scipy.ndimageのcupyサブセットが開発中) 学習の前処理(Data Aug含)がGPU上でできる機能が整いつつある
  70. 70. 高度なCVタスクの気軽な利用 ChainerCV
  71. 71. ChainerCV: 即利用可能なCV関連実装群 Webサイト http://chainercv.readthedocs.io/en/stable/ Github https://github.com/chainer/chainercv Y. Niitani, et al., “ChainerCV: a Library for Deep Learning in Computer Vision,” in Proc of ACM Multimedia, 2017 Vision tasks Image Classification ResNets, VGG Object Detection SSD, Faster-RCNN Semantic Segmentation SegNet Misc 基本的な画像処理 画像変形、Data Aug etc データセットローダー VOC, Cityscapes, CamVid etc その他ユーティリティ 精度評価、可視化、etc
  72. 72. ChainerCVの使い方の例 画像分類器(VGG16)を使った特徴抽出器の例 ※ https://blog.heuritech.com/2016/03/02/yann-lecun-lectures-at-the-college-de-france-n3/ 4096 4096 1000 ※ image L2-distance (fc7) 5.9e+5 1.8e+6 1.8e+6
  73. 73. ChainerCVの使い方の例 物体検出(Single-Shot multibox Detector)の例 W. Liu, et al., “SSD: Single Shot MultiBox Detector,” in Proc of ECCV, 2016
  74. 74. ChainerCVの使い方の例 物体検出(Single-Shot multibox Detector)の例 学習済み検出器 を読み込み 画像ロード 検出実行 可視化 W. Liu, et al., “SSD: Single Shot MultiBox Detector,” in Proc of ECCV, 2016
  75. 75. 研究で使うChainerCV • 学習済みImageNet分類器で特徴抽出 • 応用的研究の前段として検出などを利用 • 物体検出など自体を研究する人 • 各種ユーティリティの流用 • データセットローダー • 可視化の仕組み • 精度評価スクリプト etc • 学習メカニズムの流用 • 自分の手法部分の実装に集中できる 機能(実装されるタスク)は今後増えていく予定です!
  76. 76. 学習の進捗を確認する便利ツール ChainerUI※ ※2017年夏のインターン生が開発しました!
  77. 77. Chainerで学習中の典型的な画面出力 学習曲線とかを可視化して見たい!
  78. 78. ChainerUI インストール 実行 リアルタイムに曲線が 伸びていく TensorBoardとかと似たかんじ? 学習コード(train_mnist.py)の変更は不要!!
  79. 79. ChainerUI インストール 実行 train_mnistは”result”に結果を書く chaineruiにそこを見させる 学習コード(train_mnist.py)の変更は不要!!
  80. 80. ChainerUI インストール 実行 学習コード(train_mnist.py)の変更は不要!! 裏でWebサーバが走ることで ブラウザから見ることができる
  81. 81. ChainerUI 学習スクリプトにchainerui用コードを 埋込むと画面から学習loopに介入できる 学習を中断したり 学習率等をいじったり
  82. 82. ChainerUIは便利 研究ではいろんな設定で学習を並列に回す事が多い 眺めてると心が安らぐ 学習状況を随時確認できて便利 サーバ#1 サーバ#2 …
  83. 83. 大規模な学習を可能にする ChainerMN
  84. 84. データセットも巨大化している • ImageNet (ILSVRC) ← 最早かわいいレベルの規模 • 約100万枚のラベル付き静止画 • YouTube-8M https://research.google.com/youtube8m/ • 700万本の動画とその関係を表すグラフ • VGGFace2 https://www.robots.ox.ac.uk/~vgg/data/vgg_face2/ • 9100人から撮った330万枚の顔画像 • 産業応用各社も多数の専任スタッフでデータセットを作る • 自動運転技術のMobileEye社は2016時点で600人 https://bit.ly/2HPsHLG モデルの表現能力・識別能力の飛躍的な向上により、データも大規模に
  85. 85. データセットも巨大化している • ImageNet (ILSVRC) ← 最早かわいいレベルの規模 • 約100万枚のラベル付き静止画 • YouTube-8M https://research.google.com/youtube8m/ • 700万本の動画とその関係を表すグラフ • VGGFace2 https://www.robots.ox.ac.uk/~vgg/data/vgg_face2/ • 9100人から撮った330万枚の顔画像 • 産業応用各社も多数の専任スタッフでデータセットを作る • 自動運転技術のMobileEye社は2016時点で600人 https://bit.ly/2HPsHLG モデルの表現能力・識別能力の飛躍的な向上により、データも大規模に GPU1台、ワークステーション1台で 何とかなる規模ではなくなってきた! →学習の大規模化が必要
  86. 86. Training ImageNet in 15mins • 当時の世界記録 • NVIDIA CEO J. Huangが SC’17で紹介 • 1024台のTesla P100と ChainerMNを使用 • ResNet50を90epoch T. Akiba et al., “Extremely Large Minibatch SGD: Training ResNet-50 on ImageNet in 15 Minutes,” https://arxiv.org/abs/1711.04325
  87. 87. ChainerMN 同期型データ並列を中心とした分散深層学習パッケージ (※モデル並列も最近サポートされた) https://github.com/chainer/chainermn
  88. 88. ChainerMN 同期型データ並列を中心とした分散深層学習パッケージ • 各GPUで別々のデータでforward/backward • 勾配を集約する(勾配の和を計算) • 各GPUのもつモデルを更新する https://github.com/chainer/chainermn
  89. 89. ChainerMN 同期型データ並列を中心とした分散深層学習パッケージ • 各GPUで別々のデータでforward/backward • 勾配を集約する(勾配の和を計算) • 各GPUのもつモデルを更新する って言葉で言うほど 簡単ではない! https://github.com/chainer/chainermn
  90. 90. ChainerMN 同期型データ並列を中心とした分散深層学習パッケージ 分散深層学習の難しさ • GPU間・ノード間は相対的に遅い • 勾配を集約する間GPUが遊ぶ • 高い並列度ではバッチサイズが巨大になり収束性が悪化 • (大量にGPU使うとちょいちょい壊れる子がいる) https://github.com/chainer/chainermn
  91. 91. ChainerMN 同期型データ並列を中心とした分散深層学習パッケージ ChainerMN in short • Infiniband/NCCLなど高速インターコネクトを利用※ • 勾配の通信量を圧縮 • 通信と演算をオーバーラップしGPUを遊ばせない • (学習を工夫し巨大バッチサイズでの収束性を改善)etc… https://github.com/chainer/chainermn ※Ethernetも対応
  92. 92. ChainerMNのスケーラビリティ 多くの技術的・研究的な努力により 1024GPUまでほぼ線形にスケール 詳細は下記の解説などを参照 • “分散深層学習とChainerMNについて” • https://www.slideshare.net/pfi/20171128chainermn • “ChainerMN: Scalable Distributed Deep Learning with Chainer” • https://bit.ly/2HP4sNB
  93. 93. 他フレームワークとの協調や 深層学習の産業応用を可能にする ONNX-Chainer
  94. 94. Chainerで研究開発した後の活用 産業機器・リアルタイム機器 への組み込み モバイルやIoT機器など 低電力環境への組み込み 他ライブラリを使う研究者 たのめの成果の公開
  95. 95. ONNX; Open Neural Network eXchange format NNの構造と重みを可搬に するための共通フォーマット https://onnx.ai/ • 研究成果を非Chainerユーザの 研究者向けに公開 • Chainerで学習したモデルを組み込み 機器上で専用の推論エンジンで実行 • … http://onnx.ai/supported-tools
  96. 96. ONNX-Chainer Chainerで書かれたモデルをONNX形式に変換できる実験的ツール https://github.com/chainer/onnx-chainer (今後Chainer本体に取り込まれる予定です) 仕組み: • backpropと同様に計算グラフを辿る • 勾配の代わりにNNの構造と重みを 集めてONNXに吐き出す
  97. 97. ONNX-Chainer Chainerで書かれたモデルをONNX形式に変換できる実験的ツール https://github.com/chainer/onnx-chainer (今後Chainer本体に取り込まれる予定です) 仕組み: • backpropと同様に計算グラフを辿る • 勾配の代わりにNNの構造と重みを 集めてONNXに吐き出す ダミー入力で順伝搬して 計算グラフを構築させる
  98. 98. 産業応用:推論エンジンと組み合わせる NVIDIA TensorRTにONNXを入れてみる ResNet152 時間/回 倍率 cupy+cuDNN 51ms 1.0x TensorRT FP32 7.0ms 7.3x TensorRT INT8 3.2ms 15.9x ※i7-7700K, GTX1080Ti, cupy4.0 • NVIDIA GPU上で使える推論エンジン • 静的な構造のNNを前提とした最適化 • 計算グラフの最適化 • CUDAカーネルの選択 • メモリ最適化 • モデルをFP16/INT8へ変換 • … ARM等でもONNX対応の推論エンジンがある (Snapdragon NPE SDKなど) 産業応用(組込み機器への デプロイ)も容易に
  99. 99. Chainerの最新の動向と これから
  100. 100. Chainer v4: what’s new • intel-chainer導入 (iDeep; MKL-DNNのPythonフロントエンド) • CaffeExport/ONNX-Chainerの導入 • chainer.Sequential • 使用する層を定義するだけで順伝搬を自動生成(Keras風のNN定義) • cuDNNの改善 • Autotune: 最適なConvのCUDAカーネルを自動で選択 • TensorCoreサポート: Volta GPUでの性能向上 • FP16での学習のサポート • etc…
  101. 101. Cupy v4: what’s new • (Chainerと合わせるため、3がスキップされ2から4に) • 継続的なnumpy/scipy機能の実装 • FFTなど • Cupy単独利用時のメモリプール使用のデフォルト化 • 細かなメモリの確保・開放があるコードでの性能改善 • (Chainerではもともと有効化されている) • バイナリ配布 • インストールが素早く • etc…
  102. 102. Chainer/Cupyのこれから https://connpass.com/event/59740/
  103. 103. まとめ
  104. 104. まとめ • ニューラルネットの原理の雑なおさらいから、 Chainerの仕組みを紹介しました • Chainerでの学習ループについて簡単に解説しました • CupyやChainer Familyについて紹介しました • Chainerの最新動向を簡単に紹介しました
  105. 105. 便利なリンク集 • PFN正社員応募サイト • PFN2018インターン応募要項 • Chainer website, document, github • Cupy website, document, github • Official Twitter (en and jp) • Official Chainer Slack (en and jp) • Q&Aやアナウンスが流れます • Forum (en and jp) • Chainer blog • Chainer Playground • Chainerをインタラクティブ学ぶ • Awesome Chainer • 充実した公式リンク集 • Chainer関連の公式イベント • Chainer meetupなど • Chainerの開発と今後の展開 • Introduction to Chainer (July 2017) • Chainerで加速する深層学習と フレームワークの未来@GTCJ’17 by PFN海野 • Cupyの解説 by CTO奥田 • ChainerCVのACMMM発表と論文 • ChainerMNのGTC発表と論文 • 1-file chainer by PFN斎藤 • Chainerの仕組みを深く理解するのに最適な資料 • ビギナー向けチュートリアル for Chainer 3.1 • その他のChainer Family • ChainerRL (強化学習) • ChainerChem (物性予測の実験的プロジェクト) • Chainer Advent Calendar 2015, 2016, 2017 • Deep Learning Framework Examples • 他ライブラリと性能・コードの比較
  106. 106. PFN 2018インターンのお知らせ
  107. 107. PFN 2018インターン 開催します • 約2ヶ月間フルタイムでPFN社員と研究開発 • 研究成果の論文化・開発成果のOSS化が可能 • 待遇 • 交通費宿泊費PFN負担 • その他詳細はウェブサイトで • 選考 • 応募書類提出→録画面接→ コーディング面接→オフィスでの面接 https://www.preferred-networks.jp/ja/news/internship2018summer_jp 応募締切:4月30日 23:59 中間発表(ポスター)の様子 毎日社員と過ごします
  108. 108. PFN 2018インターン 募集テーマ例 • 機械学習/深層学習の理論研究 • コンピュータビジョン • 深層強化学習 • ロボティクス • バイオヘルスケア • 分散深層学習/深層学習 のためのHPC・分散データ管理 • 自然言語処理 • 音声処理 • VR/AR • HCI • 深層学習のアニメーション応用・クリエーター支援 • Chainer本体の開発 • Chainerベースの分野特化ライブラリ開発 • 異常検知等の機械学習アルゴリズムの研究開発 • 機械学習のための情報可視化ツール・フロントエンド開発 • 機械学習のための研究支援・クラスタ管理・実験管理システ • 深層学習のための専用アクセラレータ/プロセッサ開発 • 深層学習のためのコンパイラ/オプティマイザ開発 • IoT/Edge Heavy Computingプラットフォームの開発 • 深層学習のチューニング自動化のための研究開発 • スポーツデータ解析←New! • その他 https://www.preferred-networks.jp/ja/news/internship2018summer_jp 応募締切:4月30日 23:59 技術的に面白くて高度なら 何でもありです!

×