SlideShare una empresa de Scribd logo
1 de 109
2018/4/21@名古屋CV/PRML勉強会
@sakanazensen, Preferred Networks
Chainer Familyで始める
Computer Visionの研究・開発
自己紹介
おさかなさん (@sakanazensen)
Engineer at Preferred Networks, Inc.
• ~2010 高専@山口(高専プロコン)
• ~2012 B 豊橋技科大(内視鏡画像からのSfM)
• ~2014 M 名大院 村瀬研(Semi-supervisedな歩行者検出)
• nagoyacv 2代目幹事
• ~2016 Web系IT企業 エンジニア(兼 日曜Cver)
• 2016.9~ エンジニア
PFNでのお仕事(と求人情報)
自動運転のための認知・判断技術の研究開発
JAFウェブサイトより
• 軽量・高精度な認識モデルの研究
• 学習方法を工夫する研究
• 組み込み実装のための技術検証
• シーン理解のためのジオメトリ技術 などなど…
PFNでのお仕事(と求人情報)
自動運転のための認知・判断技術の研究開発
JAFウェブサイトより
• 軽量・高精度な認識モデルの研究
• 学習方法を工夫する研究
• 組み込み実装のための技術検証
• シーン理解のためのジオメトリ技術 などなど…
PFNでは自動運転技術の
エンジニア・リサーチャーの
採用を強化しています!
一緒にチャレンジしましょう!
関東Computer Vision勉強会の宣伝
https://kantocv.connpass.com/event/76984/
関東Computer Vision勉強会の宣伝
https://kantocv.connpass.com/event/76984/
関東Computer Vision勉強会の宣伝
• 名古屋CV勉強会との姉妹勉強会
• 概ね隔月ぐらいのペースで開催
• nagoyacv元関係者も多い
• 名古屋と比較すると社会人
(エンジニア等)が多め?
• 招待講演も多い
• 研究会・シンポジウムとの共催も
PFN前田先生の招待講演(強化学習)
東大 樋口先生の招待講演(HCI)
Chainer Familyで始める
Computer Visionの研究・開発
今日する話
• ニューラルネットの基礎のおさらいとChainerの仕組み
• Chainer/Cupyの簡単な使い方
• CV的に便利なChainer Familyの紹介: Chainer{CV|UI|MN}, ONNX-Chainer
今日しない話
• 他フレームワークとのSide-by-Side比較(僕があまり詳しくないので…)
• かなり高度なChainer機能の解説(Double-backpropなど)
• その他のChainer Familyについて
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
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
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リリース
NVIDIA GPU
BLAS
cupy
cuDNN
numpy
Chainer
ChainerCV …
Chainerエコシステム概観
※ChainerMNではMPI層とNCCL層が挟まる
cuBLAS
CUDA
iDeep
CPU
Python
MKL-DNN
少し厳密でない部分もありますが
概観ということでご容赦ください
NVIDIA GPU
BLAS
cupy
cuDNN
numpy
Chainer
ChainerCV …
Chainerエコシステム概観
※ChainerMNではMPI層とNCCL層が挟まる
cuBLAS
CUDA
iDeep
CPU
Python
MKL-DNN
ユーザが触るのはこのあたり
少し厳密でない部分もありますが
概観ということでご容赦ください
Neural Networkの学習と
Chainerの仕組み
〜ボトムアップ的にChainerの仕組みと使い方を解説します〜
ニューラルネット
ニューラルネット=計算グラフ
𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2
• 全体として巨大な関数 𝐹 𝑥0 = 𝑓3(𝑓2(𝑓1(𝑥0))) をなす
• 複雑なNNも結局、関数同士が繋がる有向グラフ
• 各関数は入力と、固有のパラメータ(重み)から出力を計算
• なので実際は 𝑓𝑘(𝑥 𝑘, 𝑤 𝑘) と表記したほうがわかりやすいかも
ニューラルネットの学習
𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2
• やりたいこと:
• 入力をNNに通した出力と教師信号の差が最小になる重みを獲得
• 方針:
• 層ごとに、その層の重みに関する損失の勾配=微分値を求める
• 勾配の方向(の逆)に重みを更新する(勾配降下法)
𝑡以下略
勾配の計算:backprop(導出は省き、操作の雰囲気だけ)
𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2
• 層𝑘の誤差𝛿 𝑘 = 出力側隣の𝛿 * 出力側隣の重み * 𝑓𝑘
′
(この層の入力𝑥)
• 層𝑘の重みの勾配
𝜕𝐶
𝜕𝒘 𝑘
= 誤差𝛿 𝑘 * 入力側隣の出力
出力層の誤差𝛿が求まると入力側まで順に𝛿が求まり勾配が計算できる
エクスキューズ:
意図的に雑なかんじ
にしています🙏
勾配の計算:backprop(導出は省き、操作の雰囲気だけ)
𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2
誤差𝛿3
• 層𝑘の誤差𝛿 𝑘 = 出力側隣の𝛿 * 出力側隣の重み * 𝑓𝑘
′
(この層の入力𝑥)
• 層𝑘の重みの勾配
𝜕𝐶
𝜕𝒘 𝑘
= 誤差𝛿 𝑘 * 入力側隣の出力
出力層の誤差𝛿が求まると入力側まで順に𝛿が求まり勾配が計算できる
勾配の計算:backprop(導出は省き、操作の雰囲気だけ)
𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2
誤差𝛿3
勾配
𝜕𝐶
𝜕𝒘3
• 層𝑘の誤差𝛿 𝑘 = 出力側隣の𝛿 * 出力側隣の重み * 𝑓𝑘
′
(この層の入力𝑥)
• 層𝑘の重みの勾配
𝜕𝐶
𝜕𝒘 𝑘
= 誤差𝛿 𝑘 * 入力側隣の出力
出力層の誤差𝛿が求まると入力側まで順に𝛿が求まり勾配が計算できる
勾配の計算:backprop(導出は省き、操作の雰囲気だけ)
𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2
誤差𝛿3
勾配
𝜕𝐶
𝜕𝒘3𝛿2
𝜕𝐶
𝜕𝒘2
• 層𝑘の誤差𝛿 𝑘 = 出力側隣の𝛿 * 出力側隣の重み * 𝑓𝑘
′
(この層の入力𝑥)
• 層𝑘の重みの勾配
𝜕𝐶
𝜕𝒘 𝑘
= 誤差𝛿 𝑘 * 入力側隣の出力
出力層の誤差𝛿が求まると入力側まで順に𝛿が求まり勾配が計算できる
勾配の計算:backprop(導出は省き、操作の雰囲気だけ)
𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2
誤差𝛿3
勾配
𝜕𝐶
𝜕𝒘3𝛿2
𝜕𝐶
𝜕𝒘2𝛿1
𝜕𝐶
𝜕𝒘1
• 層𝑘の誤差𝛿 𝑘 = 出力側隣の𝛿 * 出力側隣の重み * 𝑓𝑘
′
(この層の入力𝑥)
• 層𝑘の重みの勾配
𝜕𝐶
𝜕𝒘 𝑘
= 誤差𝛿 𝑘 * 入力側隣の出力
出力層の誤差𝛿が求まると入力側まで順に𝛿が求まり勾配が計算できる
勾配の計算:backprop(導出は省き、操作の雰囲気だけ)
𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2
誤差𝛿3
勾配
𝜕𝐶
𝜕𝒘3𝛿2
𝜕𝐶
𝜕𝒘2𝛿1
𝜕𝐶
𝜕𝒘1
• 層𝑘の誤差𝛿 𝑘 = 出力側隣の𝛿 * 出力側隣の重み * 𝑓𝑘
′
(この層の入力𝑥)
• 層𝑘の重みの勾配
𝜕𝐶
𝜕𝒘 𝑘
= 誤差𝛿 𝑘 * 入力側隣の出力
出力層の誤差𝛿が求まると入力側まで順に𝛿が求まり勾配が計算できる
計算グラフをたどって
出力側ノードから伝達される
各層の関数は同時に
導関数𝑓𝑘
′
も持ち、BP時に計算
backpropによる勾配計算に必要なもの
𝑓1(𝑥0) 𝑓2(𝑥1) 𝑓3(𝑥2)𝑥0 𝐶𝑥1 𝑥2
• 𝑘番目の層について
• その層の入力𝑥
• 導関数の値𝑓𝑘
′
(𝑥)
• その層を生成した関数への参照
• 出力層の誤差δ
• 損失関数の微分から陽に求まる
Chainerの計算グラフは
forward-pass/BPの際に裏で自動的に
これらを計算・キープする仕組み
Chainerでの計算グラフの構築
順伝搬をPythonで書くと内部で計算グラフが自動構築される
Chainerでの計算グラフの構築
まずパラメータつきの関数を宣言しておく
• Chainerではこれを”Link”と呼ぶ
• パラメータのないものを
”Function”と呼び分ける
• ReLUなどが該当
• Linkの実体は、Functionとそのパラメータを
一緒に保持するための箱
Chainerでの計算グラフの構築
続いて入力を用意する
• 型はnumpy/cupyの配列
• cupyの詳細は後述します
𝑥0
計算グラフ
Chainerでの計算グラフの構築
関数を呼ぶと…
• 計算グラフが構築される
• 「𝑥1が𝑥0から𝑓1により作られた」
• 中間値は”Variable”
• 実際の値と、親Functionへの参照をもつ
• 関数は”Function”
• Linkも計算グラフ上ではFunction
• 入力されたVariableへの参照をもつ
• 導関数𝑓𝑘
′
ももつ
𝑓1(_, 𝑤1)
𝑥0
𝑥1
Function
Variable
計算グラフ
Chainerでの計算グラフの構築
関数を呼ぶと…
• ロスまでの計算グラフが完成
𝑓1(_, 𝑤1)
𝑥0
𝑓2(_, 𝑤2)
𝑥1
𝑥2
Function
Function
Variable
Variable
計算グラフ
Chainerでの計算グラフの構築
関数を呼ぶと… 𝑓1(_, 𝑤1)
𝑥0
𝑓2(_, 𝑤2)
𝑥1
𝑥2
𝑓3(_, 𝑤3)
𝑦
Function
Function
Function
Variable
Variable
Variable
計算グラフ
• ロスまでの計算グラフが完成
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
計算グラフ
動的な構造のネットワークの計算グラフ
任意の条件でネットワークの構造を変えられる
• 単に動的な構造をPythonコード
で順伝搬ロジックを書けばOK
• 勾配計算・重み更新は計算グラフ
に現れたパスのみで走る
𝑓1(_, 𝑤1)
𝑥0
𝑓2(_, 𝑤2)
𝑥1
𝑥2
𝑓3𝑎(_, 𝑤3)
𝑦
計算グラフ
𝑓3𝑏(_, 𝑤3)
𝑦めっちゃ直感的!!!
“Define-by-Run”: Chainerが初めて提唱したコンセプト
順伝搬を走らせることによって計算グラフをその都度構築する
対義語:”Define-and-Run”
予めニューラルネット構造を定義し、後はそれに従って学習・推論
Pros Cons
• RNN等含め動的構造のNNの記述が容易
• 巨大な構造の記述も容易
• forループで関数呼び出しを繰り返せばOK
• 順伝搬の実行とコードが対応
• デバッグや追跡が容易
• 毎回構造が変わる(ことを想定する必要
がある)ので処理の最適化は困難
• 毎回の計算グラフ構築のコスト
• モデルファイル自体は構造を表さない
• 常にコードとモデルを同時にデプロイ
“Define-by-Run”: Chainerが初めて提唱したコンセプト
順伝搬を走らせることによって計算グラフをその都度構築する
対義語:”Define-and-Run”
予めニューラルネット構造を定義し、後はそれに従って学習・推論
Pros Cons
• RNN等含め動的構造のNNの記述が容易
• 巨大な構造の記述も容易
• forループで関数呼び出しを繰り返せばOK
• 順伝搬の実行とコードが対応
• デバッグや追跡が容易
• 毎回構造が変わる(ことを想定する必
要がある)ので処理の最適化は困難
• 毎回の計算グラフ構築処理のコスト
• モデルファイル自体は構造を表さない
• 常にコードとモデルを同時にデプロイ
そのわりにChainerは結構速く
GPUを使うDLライブラリ中では
平均的な速さで学習ができる
https://github.com/ilkarman/DeepLearningFrameworks
Chainerでの学習(1) ~モデルの定義~
まずNNをchainer.Chainなクラスで定義
• やってることはこれまでと全く同じ
• まとめてモデルを保存したりGPUに
送ったりといった便利機能が使える
Chainerでの学習(1) ~モデルの定義~
まずNNをchainer.Chainなクラスで定義
self.init_scope() によって、
ChainerにこのNNの持つ学習対象の
関数の一覧を教えてあげる
• やってることはこれまでと全く同じ
• まとめてモデルを保存したりGPUに
送ったりといった便利機能が使える
Chainerでの学習(1) ~モデルの定義~
まずNNをchainer.Chainなクラスで定義
reluなど学習すべき重みのない関数
(”Function”) はその場で直接呼ぶ
• やってることはこれまでと全く同じ
• まとめてモデルを保存したりGPUに
送ったりといった便利機能が使える
Chainerでの学習(1) ~モデルの定義~
まずNNをchainer.Chainなクラスで定義
__call__()に順伝搬を書くことで
という書き方で呼べる
• やってることはこれまでと全く同じ
• まとめてモデルを保存したりGPUに
送ったりといった便利機能が使える
Chainerでの学習(2) ~学習イテレーション~
学習:入力をNNに通す→ロス計算→BPで勾配計算→重み更新 を回す
Chainerでの学習(2) ~学習イテレーション~
1サンプル(1バッチ)での学習を手書きしてみると…
Chainerでの学習(2) ~学習イテレーション~
1サンプル(1バッチ)での学習を手書きしてみると…
• NNのオブジェクトを作る
• 最適化エンジンのオブジェクトを作り
学習対象を教える
Chainerでの学習(2) ~学習イテレーション~
1サンプル(1バッチ)での学習を手書きしてみると…
• 入力を用意する
• numpyまたはcupyのfloat32なarray
• shape(次元)は(batch, in_dim)
• 先頭をバッチ軸にするのがお作法
• Conv2Dの場合は(batch, C, H, W)
Chainerでの学習(2) ~学習イテレーション~
1サンプル(1バッチ)での学習を手書きしてみると…
• 用意した入力を順伝搬
• ロスを求める
Chainerでの学習(2) ~学習イテレーション~
1サンプル(1バッチ)での学習を手書きしてみると…
• backwardによって層ごとの勾配を計算
• SGD optimizerにより重み更新
• 実際はこれをループしないといけない
Chainerでの学習(3) ~学習ループ~
配列にロード済みのデータで
100エポック学習する簡単なコード
Chainerでの学習(3) ~学習ループ~
• このあたりは1サンプル学習と全く一緒
• 準備
• データを1つ与え勾配を求め更新まで
Chainerでの学習(3) ~学習ループ~
データは全てロード済みとする
(numpy arrayのリスト)
エポックを回すループ
バッチ(iteration)を回すループ
Chainerでの学習(3) ~学習ループ~
エポックごとにデータをシャッフルし
バッチ化しNNに入れる
Chainerでの学習(3) ~学習ループ~
エポックごとにモデルを保存する
lossをprintして学習曲線を描く…等もこの辺で
Chainerでの学習(4) ~Trainer~
毎回全部手書きはツライ!!
使いやすく抽象化された仕組み
が整備されています
Chainerでの学習(4) ~Trainer~
毎回全部手書きはツライ!!
“Iterator”:バッチ作成担当
“Updater”:forward/backwardと更新担当
“Extension”: こまごまする担当
使いやすく抽象化された仕組み
が整備されています
“Dataset”:データ読み込み担当
Chainerでの学習(4) ~Trainer~
毎回全部手書きはツライ!!
“Iterator”:バッチ作成担当
“Trainer”: 全てを仕切る神
“Updater”:forward/backwardと更新担当
“Extension”: こまごまする担当
使いやすく抽象化された仕組み
が整備されています
“Dataset”:データ読み込み担当
Chainerでの学習(4) ~Trainer~
https://github.com/chainer/chainer/blob/master/examples/mnist/train_mnist.py から抜粋
“Dataset”:データ読み込み担当
“Iterator”:バッチ作成担当
“Updater”:forward/backwardと更新担当
“Trainer”: 全てを仕切る神
“Extension”: こまごまする担当
※他の全てが最終的にTrainerに登録される
Trainerを使った学習コード
学習ループを回す
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にしてくれる
高度な学習をする場合
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世界の関係
が頭の中で対応づいてる必要がある
Chainerでの推論
学習ができたら推論もしたい
• 普段通り順伝搬を呼べば大抵OK
• が、NN出力そのままでは不便なことも
• 推論用の関数を追加で書くと便利
Chainerでの推論
callはFC層の出力を返すので使いにくい
→argmaxしてスコアと共に返すような
推論関数predict()を実装
学習ができたら推論もしたい
• 普段通り順伝搬を呼べば大抵OK
• が、NN出力そのままでは不便なことも
• 推論用の関数を追加で書くと便利
Chainerでの推論
学習ができたら推論もしたい
• 普段通り順伝搬を呼べば大抵OK
• が、NN出力そのままでは不便なことも
• 推論用の関数を追加で書くと便利
ここで__call__を呼んで
forward passを実行している
なぜChainerが「直感的」か
• 複雑な順伝搬のロジックがそのままコードに書ける
• プログラマにとって挙動が一目瞭然
• フレームワーク特有の知識の要求が少ない
• 順伝搬が毎回そのコードに沿って走る
• バグ等があるとその場所で落ちてくれる
• 追跡もしやすい
• 全般に「やりたいことをそのままコードで書けば期待通り動く」
• 計算グラフは生き物
• NN構造も入力のshapeも毎回変わっていい
• 生き物を生き物として扱ってあげるChainer
個人の見解です!
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
Chainerの力をGPUで引き出す
cupy
Chainerの(NVIDIA)GPU用バックエンドとして開発された
numpy互換の配列操作ライブラリ(が、用途はDLに限定しない)
Webサイト https://cupy.chainer.org/
Github: https://github.com/cupy/cupy
numpy vs cupy
example: モンテカルロシミュレーションで𝜋を計算してみる
多くの場合同じコードが使いまわせる!
そうでない場合 → Pull Requestを!🙇
numpy vs cupy with Chainer
example: ここまでお馴染み3層MLP
ポイント
• cupy.arrayをnumpy.arrayから生成
• to_gpuでモデル(の重み)をGPUに送る
• 同じコードがまるっと使いまわせる
• to_gpuの有無だけで完全にCPU/GPU互換に
numpy/cupy共存時の便利なイディオム
(2) 受け取った配列がnumpyかcupyか
動的に判定し使い分ける
(1) メソッドの引数にcupy/numpy
どちらを使うか渡す
numpy vs cupy: performance
example: 先ほどのモンテカルロ𝜋計算のベンチマーク
※cupyでは1回目だけはCUDAカーネルのコンパイルが走るので少し時間がかかります
時間/回 倍率
numpy 6.14秒 x1.00
cupy 0.171秒 x35.96
機械学習以外の一般データ解析にも非常に便利
※i7-7700K, GTX1080Ti, cupy4.0
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
画像処理的に便利なcupyの機能
• numpyと等価の配列操作による画像の加工
• スライスによるクロップ/反転など
• 転置や正規化・mean subtractionなど
• GPU上での画像のアフィン変換[New!]
• 最近傍補間・線形補間
• (scipy.ndimageのcupyサブセットが開発中)
学習の前処理(Data Aug含)がGPU上でできる機能が整いつつある
高度なCVタスクの気軽な利用
ChainerCV
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
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
ChainerCVの使い方の例
物体検出(Single-Shot multibox Detector)の例
W. Liu, et al., “SSD: Single Shot MultiBox Detector,” in Proc of ECCV, 2016
ChainerCVの使い方の例
物体検出(Single-Shot multibox Detector)の例
学習済み検出器
を読み込み
画像ロード
検出実行
可視化
W. Liu, et al., “SSD: Single Shot MultiBox Detector,” in Proc of ECCV, 2016
研究で使うChainerCV
• 学習済みImageNet分類器で特徴抽出
• 応用的研究の前段として検出などを利用
• 物体検出など自体を研究する人
• 各種ユーティリティの流用
• データセットローダー
• 可視化の仕組み
• 精度評価スクリプト etc
• 学習メカニズムの流用
• 自分の手法部分の実装に集中できる
機能(実装されるタスク)は今後増えていく予定です!
学習の進捗を確認する便利ツール
ChainerUI※
※2017年夏のインターン生が開発しました!
Chainerで学習中の典型的な画面出力
学習曲線とかを可視化して見たい!
ChainerUI
インストール
実行
リアルタイムに曲線が
伸びていく
TensorBoardとかと似たかんじ?
学習コード(train_mnist.py)の変更は不要!!
ChainerUI
インストール
実行
train_mnistは”result”に結果を書く
chaineruiにそこを見させる
学習コード(train_mnist.py)の変更は不要!!
ChainerUI
インストール
実行
学習コード(train_mnist.py)の変更は不要!!
裏でWebサーバが走ることで
ブラウザから見ることができる
ChainerUI
学習スクリプトにchainerui用コードを
埋込むと画面から学習loopに介入できる
学習を中断したり
学習率等をいじったり
ChainerUIは便利
研究ではいろんな設定で学習を並列に回す事が多い
眺めてると心が安らぐ 学習状況を随時確認できて便利
サーバ#1 サーバ#2
…
大規模な学習を可能にする
ChainerMN
データセットも巨大化している
• 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
モデルの表現能力・識別能力の飛躍的な向上により、データも大規模に
データセットも巨大化している
• 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台で
何とかなる規模ではなくなってきた!
→学習の大規模化が必要
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
ChainerMN
同期型データ並列を中心とした分散深層学習パッケージ
(※モデル並列も最近サポートされた)
https://github.com/chainer/chainermn
ChainerMN
同期型データ並列を中心とした分散深層学習パッケージ
• 各GPUで別々のデータでforward/backward
• 勾配を集約する(勾配の和を計算)
• 各GPUのもつモデルを更新する
https://github.com/chainer/chainermn
ChainerMN
同期型データ並列を中心とした分散深層学習パッケージ
• 各GPUで別々のデータでforward/backward
• 勾配を集約する(勾配の和を計算)
• 各GPUのもつモデルを更新する
って言葉で言うほど
簡単ではない!
https://github.com/chainer/chainermn
ChainerMN
同期型データ並列を中心とした分散深層学習パッケージ
分散深層学習の難しさ
• GPU間・ノード間は相対的に遅い
• 勾配を集約する間GPUが遊ぶ
• 高い並列度ではバッチサイズが巨大になり収束性が悪化
• (大量にGPU使うとちょいちょい壊れる子がいる)
https://github.com/chainer/chainermn
ChainerMN
同期型データ並列を中心とした分散深層学習パッケージ
ChainerMN in short
• Infiniband/NCCLなど高速インターコネクトを利用※
• 勾配の通信量を圧縮
• 通信と演算をオーバーラップしGPUを遊ばせない
• (学習を工夫し巨大バッチサイズでの収束性を改善)etc…
https://github.com/chainer/chainermn
※Ethernetも対応
ChainerMNのスケーラビリティ
多くの技術的・研究的な努力により
1024GPUまでほぼ線形にスケール
詳細は下記の解説などを参照
• “分散深層学習とChainerMNについて”
• https://www.slideshare.net/pfi/20171128chainermn
• “ChainerMN: Scalable Distributed Deep
Learning with Chainer”
• https://bit.ly/2HP4sNB
他フレームワークとの協調や
深層学習の産業応用を可能にする
ONNX-Chainer
Chainerで研究開発した後の活用
産業機器・リアルタイム機器
への組み込み
モバイルやIoT機器など
低電力環境への組み込み
他ライブラリを使う研究者
たのめの成果の公開
ONNX; Open Neural Network eXchange format
NNの構造と重みを可搬に
するための共通フォーマット
https://onnx.ai/
• 研究成果を非Chainerユーザの
研究者向けに公開
• Chainerで学習したモデルを組み込み
機器上で専用の推論エンジンで実行
• …
http://onnx.ai/supported-tools
ONNX-Chainer
Chainerで書かれたモデルをONNX形式に変換できる実験的ツール
https://github.com/chainer/onnx-chainer (今後Chainer本体に取り込まれる予定です)
仕組み:
• backpropと同様に計算グラフを辿る
• 勾配の代わりにNNの構造と重みを
集めてONNXに吐き出す
ONNX-Chainer
Chainerで書かれたモデルをONNX形式に変換できる実験的ツール
https://github.com/chainer/onnx-chainer (今後Chainer本体に取り込まれる予定です)
仕組み:
• backpropと同様に計算グラフを辿る
• 勾配の代わりにNNの構造と重みを
集めてONNXに吐き出す
ダミー入力で順伝搬して
計算グラフを構築させる
産業応用:推論エンジンと組み合わせる
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など)
産業応用(組込み機器への
デプロイ)も容易に
Chainerの最新の動向と
これから
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…
Cupy v4: what’s new
• (Chainerと合わせるため、3がスキップされ2から4に)
• 継続的なnumpy/scipy機能の実装
• FFTなど
• Cupy単独利用時のメモリプール使用のデフォルト化
• 細かなメモリの確保・開放があるコードでの性能改善
• (Chainerではもともと有効化されている)
• バイナリ配布
• インストールが素早く
• etc…
Chainer/Cupyのこれから
https://connpass.com/event/59740/
まとめ
まとめ
• ニューラルネットの原理の雑なおさらいから、
Chainerの仕組みを紹介しました
• Chainerでの学習ループについて簡単に解説しました
• CupyやChainer Familyについて紹介しました
• Chainerの最新動向を簡単に紹介しました
便利なリンク集
• 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
• 他ライブラリと性能・コードの比較
PFN 2018インターンのお知らせ
PFN 2018インターン 開催します
• 約2ヶ月間フルタイムでPFN社員と研究開発
• 研究成果の論文化・開発成果のOSS化が可能
• 待遇
• 交通費宿泊費PFN負担
• その他詳細はウェブサイトで
• 選考
• 応募書類提出→録画面接→
コーディング面接→オフィスでの面接
https://www.preferred-networks.jp/ja/news/internship2018summer_jp
応募締切:4月30日 23:59
中間発表(ポスター)の様子
毎日社員と過ごします
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
技術的に面白くて高度なら
何でもありです!
Chainer Familyで始めるComputer Visionの研究・開発【修正版】

Más contenido relacionado

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

Inside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesInside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfes
Takeshi Komiya
 

Similar a Chainer Familyで始めるComputer Visionの研究・開発【修正版】 (9)

ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介
 
点群深層学習 Meta-study
点群深層学習 Meta-study点群深層学習 Meta-study
点群深層学習 Meta-study
 
令和元年度 実践セミナー - Deep Learning 概論 -
令和元年度 実践セミナー - Deep Learning 概論 -令和元年度 実践セミナー - Deep Learning 概論 -
令和元年度 実践セミナー - Deep Learning 概論 -
 
Inside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesInside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfes
 
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​
 
CVPR2019 読み会「Understanding the Limitations of CNN-based Absolute Camera Pose ...
CVPR2019 読み会「Understanding the Limitations of CNN-based Absolute Camera Pose ...CVPR2019 読み会「Understanding the Limitations of CNN-based Absolute Camera Pose ...
CVPR2019 読み会「Understanding the Limitations of CNN-based Absolute Camera Pose ...
 
CVPR2018論文紹介「Pseudo Mask Augmented Object Detection」
CVPR2018論文紹介「Pseudo Mask Augmented Object Detection」CVPR2018論文紹介「Pseudo Mask Augmented Object Detection」
CVPR2018論文紹介「Pseudo Mask Augmented Object Detection」
 
バイナリニューラルネットとハードウェアの関係
バイナリニューラルネットとハードウェアの関係バイナリニューラルネットとハードウェアの関係
バイナリニューラルネットとハードウェアの関係
 
W8PRML5.1-5.3
W8PRML5.1-5.3W8PRML5.1-5.3
W8PRML5.1-5.3
 

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

Notas del editor

  1. TODO: chainer logoとか貼る https://www.preferred-networks.jp/ja/pfn-logo https://yuyu2172.github.io/chainercv-chainer-meetup/#1 https://chainer.org/
  2. TODO: complete
  3. TODO: complete
  4. TODO: chainer logoとか貼る https://www.preferred-networks.jp/ja/pfn-logo https://yuyu2172.github.io/chainercv-chainer-meetup/#1 https://chainer.org/
  5. TODO Fix iDeep
  6. TODO Fix iDeep
  7. 海野さんのではvariableとfunctionが逆(variableがノード、functionがエッジ)
  8. 海野さんのではvariableとfunctionが逆(variableがノード、functionがエッジ) 青い本のp47がわかりやすい
  9. 海野さんのではvariableとfunctionが逆(variableがノード、functionがエッジ) 青い本のp47がわかりやすい
  10. 海野さんのではvariableとfunctionが逆(variableがノード、functionがエッジ) 青い本のp47がわかりやすい
  11. 海野さんのではvariableとfunctionが逆(variableがノード、functionがエッジ) 青い本のp47がわかりやすい
  12. 海野さんのではvariableとfunctionが逆(variableがノード、functionがエッジ) 青い本のp47がわかりやすい
  13. 海野さんのではvariableとfunctionが逆(variableがノード、functionがエッジ) 青い本のp47がわかりやすい
  14. 海野さんのではvariableとfunctionが逆(variableがノード、functionがエッジ) 青い本のp47がわかりやすい
  15. https://commons.wikimedia.org/wiki/File:Note.svg
  16. 巨大な構造の記述も容易 forなどで呼び出し
  17. 巨大な構造の記述も容易 forなどで呼び出し
  18. http://gluon.mxnet.io/chapter14_generative-adversarial-networks/dcgan.html
  19. シーシェパードもにっこり
  20. 上の方で使うMNISTのネットワークをここにはって、to_gpuしてcallするのとto_gpuしないでcallする、というコードを貼るだけ。
  21. 画像のresizeとかも速くなったよ! https://github.com/cupy/cupy/blob/master/cupyx/scipy/ndimage/interpolation.py
  22. 画像のresizeとかも速くなったよ! https://github.com/cupy/cupy/blob/master/cupyx/scipy/ndimage/interpolation.py
  23. 画像のresizeとかも速くなったよ! https://github.com/cupy/cupy/blob/master/cupyx/scipy/ndimage/interpolation.py
  24. cat http://photozou.jp/photo/show/258557/26359129 cat2 https://www.pexels.com/photo/cat-whiskers-kitty-tabby-20787/ airplane https://pixabay.com/en/airplane-aircraft-commercial-744865/ https://blog.heuritech.com/2016/03/02/yann-lecun-lectures-at-the-college-de-france-n3/
  25. 何か画像を右に貼りたい
  26. https://drive.google.com/file/d/1E8MHyHNOUC-OcP6c7sSjobvygQl1PUqS/view
  27. 図は https://docs.google.com/presentation/d/1Hyg-dbXFlxRwYboGGal_mlJKKJQeDfiSIH0gN8zYc7s/edit#slide=id.g270420194e_2_15
  28. https://pixabay.com/ja/車-車両-自動車-1-つのドア-側-赤-308456/ https://pxhere.com/ja/photo/1267471 https://pixabay.com/ja/世界-地図-大陸-708823/ https://pixabay.com/ja/コンピュータ-オフィス-ワーカー-入力-プログラマ-開発者-146329/
  29. http://logos.wikia.com/wiki/File:Nvidia_logo.png
  30. 写真 https://research.preferred.jp/2016/10/intern2016/