SlideShare uma empresa 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の研究・開発【修正版】

Mais conteúdo relacionado

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

ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介ADVENTURE Project
 
点群深層学習 Meta-study
点群深層学習 Meta-study点群深層学習 Meta-study
点群深層学習 Meta-studyNaoya Chiba
 
令和元年度 実践セミナー - Deep Learning 概論 -
令和元年度 実践セミナー - Deep Learning 概論 -令和元年度 実践セミナー - Deep Learning 概論 -
令和元年度 実践セミナー - Deep Learning 概論 -Yutaka KATAYAMA
 
Inside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesInside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesTakeshi Komiya
 
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​SSII
 
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 ...Sho Kagami
 
CVPR2018論文紹介「Pseudo Mask Augmented Object Detection」
CVPR2018論文紹介「Pseudo Mask Augmented Object Detection」CVPR2018論文紹介「Pseudo Mask Augmented Object Detection」
CVPR2018論文紹介「Pseudo Mask Augmented Object Detection」諒介 荒木
 
バイナリニューラルネットとハードウェアの関係
バイナリニューラルネットとハードウェアの関係バイナリニューラルネットとハードウェアの関係
バイナリニューラルネットとハードウェアの関係Kento Tajiri
 

Semelhante 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 do 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/