今日参加してきた Deep Learning Acceleration勉強会 - connpass が非常に面白かった. 一度聞いただけでは全然理解できなかったので、後から読み返すように公開された資料や論文などをメモをまとめた。
私自身は仕事で一度tensorflowでCNN触ってみたくらいで、超初心者なので、 おかしな書き方をしているところがあるかもしれませんヾ(´゚Д゚;)
[2017/09/04 11:00 追記] 間違いの修正/情報追記
目次
- モデルアーキテクチャ観点からのDeep Neural Network高速化 by Yusuke Uchida(@yu4u)さん
- Convolutionの数理とアルゴリズム by Koichi Nakamura(@9_ties)さん
- ウェブブラウザ向け深層学習モデル高速実行フレームワーク「WebDNN」 by きくらげ(@Kiikurage)さん
- WebDNNの特徴
- Using Raspberry Pi GPU for DNN by Noriyuki OHKAWA(@notogawa)さん
- TensorFlow XLAの可能性 by 無限ゲームのなか(@Vengineer)さん
- Googleが開発したニューラルネット専用LSI「Tensor Processing Unit」by Kazunori Sato(@kazunori_279)さん
- ChainerMN による分散深層学習 by Takuya Akiba(@iwiwi)さん
- 感想とおまけ
モデルアーキテクチャ観点からのDeep Neural Network高速化 by Yusuke Uchida(@yu4u)さん
資料
www.slideshare.net
よくある高速化の方法
- 行列を分解して早くする
- 高速モジュールを使う
- pruning
- 重みの量子化
Factorization
畳み込みカーネルを低ランクに近似することで計算量を削減する
conv(5 x 5) => conv(3 x 3) - conv(3 x 3)
計算量が25 -> 18
例えば・・・
- VGGNet: 3x3をめっちゃ重ねてる
- AlexNet: 11 x 11 - 5 x 5 - 3 x 3 ….
conv(3 x 3) -> conv(1 x 3) - conv (3 x 1)
Efficient microarchitecture
25P: モデルアーキテクチャ観点からのDeep Neural Network高速化
File modure (SqueezeNet)
3x3のFilterの代わりに1x1をつかう(=主成分分析的な)
Squeeze layerでの圧縮率 0.75程度だと精度低下しない
expand layer 3*3の割合 0.75程度なら精度低下しない
pruning
重みレベルのpruning(論文:deep compression)
- [1510.00149] Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding
- 閾値以下の重みを0に
チャネルレベルのpruning
[1608.08710] Pruning Filters for Efficient ConvNets
- チャネルごとに畳み込みパラメータのL1ノルムが小さいものからprune
[1708.06519] Learning Efficient Convolutional Networks through Network Slimming
Quantization
重みを量子化することでモデルのメモリの削減
Binary NN
Distillation
Early termination
まとめ
フレームワークより上のレイヤで意味があるのは
- Efficient microarchitecture module
- Pruning (channelレベル)
Convolutionの数理とアルゴリズム by Koichi Nakamura(@9_ties)さん
資料
数学的にCNNって何してるんだーっていう話。ゆっくり後から見直したい。
今回解説された代表的なアルゴリズム
CNNのやってる計算を数学的に理解しよう。
実況など
最初から煽ってくる(^o^)#DLAccel convolutionは皆さん書かれていると思いますが...
— raven (@raven_38_) 2017年9月3日
高校数学でもやりましたよね??? #dlaccel
— 先端IT人材 (@mosko_mule) 2017年9月3日
coef coef
— κeen (@blackenedgold) 2017年9月3日
↓ ↑
pont →複雑な計算 →point
#DLAccel
「これは中国剰余定理を使います、まあ、これは知ってますね」
— κeen (@blackenedgold) 2017年9月3日
#DLAccel
ウェブブラウザ向け深層学習モデル高速実行フレームワーク「WebDNN」 by きくらげ(@Kiikurage)さん
ウェブブラウザ向け深層学習モデル高速実行フレームワーク「WebDNN」 // Speaker Deck
ウェブブラウザ向けDeepLearningモデルの高速実行フレームワーク 学習済みモデルを推論フェーズ に最適化して、webブラウザ上で実行できる
- 例: MakeGirlsMoe
なぜブラウザで深層学習?
サーバーサイドで計算する問題点
- プライバシーに抵触するデータを扱いづらい
- クライアント数に対するスケールアウトが難しい
=> クライアントサイドで計算することでこれらの問題を解決
WebDNNの特徴
ブラウザに実装されているAPIに応じて自動的に最適なバックエンドを選択
- WebGPU
- WebGL
- WebAssembly
- FallBack
既存の以下の深層学習フレームワークの学習済みモデルに対応
独自実装した関数への対応も可能
- keras
- caffe
- chainer
- tensorflow
Keras-jsとの比較
Chrome, Firefox, Safariで動かすとGPUでもCPUでもデスクトップでもモバイルもWebDNNの方がKeras.jsより断然速い
— κeen (@blackenedgold) 2017年9月3日
#DLAccel
計算グラフ最適化による計算の高速化
資料参照
実況など
プロジェクトの目的は研究者に成果を公開して貰う事。なので、そのコストを減らすために既存の機械学習フレームワークを広範囲にサポートしたとのこと。(ひょー頭が下がるぜ。。。 #dlaccel
— tnoho (@tnoho) 2017年9月3日
Keras.jsとWebDNNのベンチ結果#DLAccel pic.twitter.com/AsL3UeDCj4
— まさなし (@machinery81) 2017年9月3日
「SIMDやマルチスレッドも(今年中に)可能になる」
— κeen (@blackenedgold) 2017年9月3日
#DLAccel
#DLAccel JSが遅いのは仕方ないので、WebAssemblyなどを使う。インタプリタによるオーバーヘッドを取り除き生JSでできなかった最適化、(将来)SIMD化なども可能になる
— インターネットの闇 (@no_maddo) 2017年9月3日
発表者のレベルが高いせいか学会のWorkshopみたいなノリに近くなってきたw #DLAccel
— NaOHaq(仮性ソーダ) (@NaOHaq) 2017年9月3日
Using Raspberry Pi GPU for DNN by Noriyuki OHKAWA(@notogawa)さん
ラズパイでのDeepLearningの高速化
資料
www.slideshare.net
ハードより・実践寄りで理解は難しかったのでメモなし|||||/(=ω=。)\ 資料へGO。今までの理論の話から、実践の話へ。
実況など
「GPUメモリからCPUでデータを読み出すのは遅い。一旦GPUメモリに乗せたらGPUで全て計算する覚悟が必要」
— κeen (@blackenedgold) 2017年9月3日
#DLAccel
アセンブラレベルで手動最適化。命令数ゴルフ #DLAccel
— そのっつ (Naotoshi Seo) (@sonots) 2017年9月3日
命令数ゴルフwwwww #DLAccel
— NaOHaq(仮性ソーダ) (@NaOHaq) 2017年9月3日
「これで1命令減りました めでたしめでたし」 #DLAccel
— ㌨㍉ (@namiki036) 2017年9月3日
TensorFlow XLAの可能性 by 無限ゲームのなか(@Vengineer)さん
資料
www.slideshare.net
TenorFlow XLA
同じデバイス内で実行できるサブグラフ単位をノードに1つにまとめて、
_XlaLaunch OP
内で実行する。
- 一連の関数群のコンパイルCache->Compile
- 各パラメータと入力リストをXLA用データに変換
- キャッシュの作成 + 実行 Cache->client()->Execute()
Intel Nervana, GraphcoreがXLAをサポートするかも。
@Vengineerさんその他の資料
実況など
グラフの分割
— κeen (@blackenedgold) 2017年9月3日
sendとrecvを追加してGPUとCPUを分ける
#DLAccel
↑今回のみそXLAでの動き。分割までは同じ。XLA_GPUで計算が1つのカーネルになる
— κeen (@blackenedgold) 2017年9月3日
#DLAccel
(ASIC作るために)10億円欲しい!! #DLAccel
— ɯsı¯ɹǝʇsɐ (@aster_ism) 2017年9月3日
@Vengineer さんのブログが更新されていた
Googleが開発したニューラルネット専用LSI「Tensor Processing Unit」by Kazunori Sato(@kazunori_279)さん
資料
現状まだあがってないもよう
FPGAエクストリーム・コンピューティングの紹介
FPGAエクストリーム・コンピューティング - connpass
次回こちら: FPGAエクストリーム・コンピューティング 第9回 - connpass
TensorFlowの紹介
DeepLearningをもっとみんなが使える状況を目指している。(数学が)
- Google Cloud Platform Japan 公式ブログ: キュウリ農家とディープラーニングをつなぐ TensorFlow
- autoencoderをつかった外れ値検知例
TPUとは?
DeepLearning専用プロセッサ 論文: In-Datacenter Performance Analysis of a Tensor Processing Unit TM
- 2015年からGoogle検索・翻訳・フォトで使われている
- MLPでの利用例が多い
- SystolicArray
CPUやGPUは汎用なのでプログラムコードを読んでいく必要性があるのでレジスタに置きに行く必要性があるのに対し、TPUは行列演算しかしないのでレジスタを使わずに数珠つなぎに計算する。これはSystolicArrayと呼ぶ。画像処理の世界ではよく使われる。 #DLAccel
— tnoho (@tnoho) 2017年9月3日 - minimal design for NN
TPU v2
- 学習もできるようになる (v1は推論だけ)
TPUv2はトレーニング可能!メモリーが16GBどーん600GB/sの強直なメモリーバス32bitのフロート計算機。32GPUで1日が8TPUで半日になりました。ぱちぱちぱちー #DLAccel
— tnoho (@tnoho) 2017年9月3日 - 45 Tflops / chip
「精度を抜きにしたら」 #DLAccel
— κeen (@blackenedgold) 2017年9月3日
ChainerMN による分散深層学習 by Takuya Akiba(@iwiwi)さん
@iwiwi「今年Kaggle Masterになりました」
資料
まだでていないので出たらはります
まず最初に一言だけ言いたい
(^◇^)「ChainerMNつかったら遅くなりました」
=> インターコネクトは何ですか?
(^◇^)「? つながってますよ」
━━(゚Д゚;)━━━!
=> GPUだけじゃなくてインターコネクトにもお金つかって!!話はそれからだ!
インターコネクト雑な早わかり
Ethernet
- ~ 10Gb - 厳しい
- 40Gb ~ 闘えるかも
InfiniBand(Mellanox) <= おすすめ
Omni-Path(Intel)
分散深層学習の基礎
通常イテレーション
- forward(予測) -> backward(逆向き計算) -> optimize(勾配方向に動かす)
この処理を高速化するには
- データ並列 => こっちが一般的
- モデル並列 => GPUメモリが足りない時代に使われていた
同期型 vs 非同期型
- 同期型
- 常に同じworkerを持っている
- 非同期
- 勾配をパラメータサーバーに送りつけてパラメータサーバが計算させる
どっちを使うべき? スループットは非同期型のほうが高い。
Large Scale Distributed Deep Networks
- ↑有名なこちらの論文が非同期大前提。古い情報だからこの情報だけに惑わされないで!
スループットだけを見てはいけない
同期型のほうがはやく高い精度に到達するにという実験結果がある
GradientStaleness
- 非同期型では、各ワーカーが持つモデルが古く、それがモデル改善に悪影響がある
- 同期型にはStalenessがない
- ImageNet (ILSVRC'17)の優勝チームも同期型
以上ふまえ、非同期型のほうがチューニング難しいのでそこ頑張れば同期型の精度までいける場合は多いと予想されるが、同期型のほうがチューニングが簡単である。
ChainerMNの利用法
- 動的なネットワークも分散学習可能
- Chainerのコードをちょっと変えればChainerMNで使える
- MPIを利用・SPMDで動作。
- 1プロセス1GPU
ChainerMNでのイテレーション
- forward(予測) -> backward(逆向き計算) -> ALL Reduce -> optimize(勾配方向に動かす)
参考: 集団通信アルゴリズムまとめ - Google スプレッドシート
ChainerMNに必要なもの
- Chainer, cupy
- MPI
- NVIDIA NCCL
使い方
- communicator()を作る
- optimizerをつくる
- あとは今までのChainerコードで
実験結果
- ほぼ線形に速度向上、128GPUで100倍近い
- Chainer早い。 GPUが多ければ多いほどChainerが威力発揮する
- tensorflowは分散であんまり・・・(今後さらに調査予定)
- tensorflowは パラメータサーバのかずを 奇数にしないと性能がでない
- round robinで割当をやるので,,,バイアス持ってるやつ・weightばっかもってるやつに分かれてしまう
- tensorflowは パラメータサーバのかずを 奇数にしないと性能がでない
このあたりは実際の性能比較の資料ページをもってきたい。(あとで探す)
最後に
_人人人人人人人人人人人人人人人人人_ > ChainerMN v1.0.0リリースしました <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
感想とおまけ
Deep Learning Acceleration勉強会の雰囲気とか
上級者向けの会という感じで私レベルが参加するのは申し訳ない感じだったけどとっても面白かった! 紹介された論文等、全部は読めないかもだけど少しずつ関わりそうなやつを見ていきたい。
ハッシュタグ #DLAccel がトレンドに入ったせいで途中から関係ないツイートとかあってカオスだった_| ̄|○ il||li
DeepLearning始めたい方へ
最初DeepLearning案件に足を突っ込む時、幾つかディープラーニングに関する資料読んだり本を読んだりしたんだけどめっちゃむずくて最初くじけた。
以下の本の内容を全実装自分で書いてみたらようやく少し理解できたので、 (この記事を読んでる人にそんな人がいるかはわかりませんが)これから勉強する方がいれば最初の1冊目におすすめです。
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (17件) を見る