石井 敬章、○磯部 洋平、磯 健一 (ヤフー株式会社)
ヤフー音声認識サービスで
のディープラーニングとGPU
利用事例
2016年7月2日 Chainer Meetup #03
自己紹介:ヤフー音声認識チーム
• Yahoo! JAPANで使われる
音声認識プラットフォームを開発運用
• 音声認識エンジン&サーバ
• スマホ用SDK(Android, iOS)
• 組織概要
• データ&サイエンスソリューション
統括本部
• Yahoo! JAPAN研究所(磯)
• サイエンス本部(石井,磯部)
2
目次
1. 音声認識とディープラーニング
2. 学習高速化のためのマルチGPU実験
3. 学習高速化のための検討
3
ヤフーの音声認識サービス:YJVOICE
• スマートフォン向け分散型音声認識
• 語彙数100万語(音声検索,対話)
• 弊社Android, iOS向けアプリで導入
• 2011年3月サービス開始
• 2013年エンジン内製化
• 2015年5月にディープラーニング導入
4
YJVOICEの中のディープラーニング
5
音声認識エンジン
認識結果
ディープラーニングの
実装範囲
マイク入力
(音声波形)
「明日晴れます」
※ 音響モデル:音声データから音素の特徴パターンを確率表現(モデル化)したもの
※ 言語モデル:大規模テキストから単語間の連続のし易さを確率表現(モデル化)したもの
音声区間
検出
音響モデル 言語モデル
単語列候補の出力
(例) 明日は ...
音素列候補の出力
(例) a sh i t a w a ...
音声区間のみ
切り出し
単語と単語の繋がり
易さを表現する知識
「あ」等の音を
表現する知識
DNNによる音声区間検出
音声区間
③DNNによる
音声/非音声の判定
非音声
(雑音)
音声
...
...
...
...
...
...
. . .
音声
非音声
入力層 中間層 出力層
特徴量
ベクトル
ニューラルネットワークの構造:DNN
6
①音声波形の読込み
②音声波形から
特徴量を抽出
. . .
. . .
...
...
...
特徴量ベクトル40次元
*11フレーム(認識対象1+前後5フレーム)
=440次元を入力に利用
• 10ミリ秒ごとに“音声”or“非音声”を判別
DNNによる音響モデル
• 10ミリ秒ごとに“音素”を判別
③HMMによる
時系列方向
の処理
①音声と判定された
特徴量を入力
②DNNよる音素の推定
...
...
...
...
...
...
. . .
/a/a/a/sh/sh/i/i/t/a/…
/a/sh/i/t/a/…
※実際は前後のつながりを考慮したtriphone
(sil-a+sh a-sh+i sh-i+t i-t+a ...)
. . .
特徴量ベクトル40次元
*11フレーム(認識対象1+前後5フレーム)
=440次元を入力に利用
言語処理(発音辞書・言語モデル)へ
...
...
...
. . .
入力層 中間層 出力層
特徴量
ベクトル
ニューラルネットワークの構造:DNN
...
......
sil-a+sh:0.9
a-sh+i:0.01
各発音記号の
事後確率
DNN-HMM hybrid
音響モデル
7
DNNによる性能の向上
• 既存手法から
誤り率が
30〜40%改善
• 音声検索1万発話
による文正解率
• 約3%(1/32)の
学習データ量でもDNN
の方が精度が
高い
• 耐雑音性能の向上
8
GMM
(DNN=2048x5)
文正解率(%)
1/32
1/16
1/8
1/4
1/2
1
GMMの学習データ量を1として
DNNの学習データ量を1〜1/32の場合での比較
※ GMM : Gaussian Mixture Models
これまでのデファクト音響モデル
DNN音響モデルの学習
• ツール
• TheanoによるGPU学習
• データ量
• 1000時間以上の音声データ
• 例:1000時間=590GB(360Mサンプル)
• 1サンプル(10ミリ秒)=440次元
• 440次元*(float32)=1.7KB
• 学習時間
• 例:1000時間, 2048x5層, 15epoch
• Tesla M2090で約1ヶ月
• TITAN Xで約2週間
9
GPUを使ったDNN学習
• 学習データをGPUメモリに収まる
サイズ(=チャンク)に分割しておく
• 1チャンクごとに学習を行う
• 学習時、予めGPUメモリに転送する
• ミニバッチごとに転送すると効率が悪い
10
epoch1
チャンク1
チャンク2
チャンクN
minibatchSGD→
…
…
256
256
…
雑音重畳学習
• データ拡張(Data Augmentation)
• 手法イメージ
• 様々なノイズを追加した学習データを
使用することで耐雑音性能を向上
• データ量が倍増
• 学習データ12000時間の事例など
• Deep Speech 2(Baidu Research)
11
Data0
DataANoiseA Data0
NoiseAに
強いモデル
学習
…
…通常の音声データ
モデルの学習に関する課題
• 学習データが多い・学習時間が長い
• 例
• 1000時間分の学習データ590GB
• TITAN Xで2週間
• 雑音重畳学習により学習データが倍増
→高速化が必要!
12
学習高速化のための
マルチGPU実験
マルチGPUによる学習
• 複数のGPUを使用して学習
• 手法
• モデル並列
• モデルを分割して全データを学習
• データ並列
• データを分割してモデルを共有
• DNN音響モデルの場合
→密結合なDNNなのでデータ並列
14
マルチGPUデータ並列の実験
実験1: 2GPUによる高速化
• 使用ツール
1. Theano(v0.7)
• マルチGPU非対応
• 既存の学習スクリプトをデータ並列に
拡張
• 参考 https://github.com/uoguelph-mlrg/theano_multi_gpu
2. Chainer(v1.6)
• マルチGPU, データ並列をサポート
• チュートリアルを参考に実装
15
ChainerでマルチGPU試行錯誤 その1
1つ目のチャンクデータの処理が終わり,
2つ目のチャンクデータをGPUメモリに
のせるとエラー
• 原因:GPUメモリ上のcupy.ndarrayが
解放されなかった
• 対応:解放されるように実装して回避
• フォーラムの情報が参考になった
16
チャンクのループ
終了時に明示↓
↓”.copy()”でdeep copyするように明示して回避
ChainerでマルチGPU試行錯誤 その2
GPUに送ったチャンクデータ(cupy.ndarray)からVariableを
作成しようとするとエラー
• 原因:cupy.ndarrayにx[1,9,5]のようなアクセスができない
• どうやらcupyが未対応だった(v1.6)
• チュートリアルのインデックスをシャッフルするやり方をそのまま
使用していた
• 対応:GPUに送る前に学習データtrain_x, train_y(numpy)に同じシャッフルをし
ておく
• numpy.random.get_state()/numpy.random.set_state()
• こちらもフォーラムに情報あり
17
マルチGPU結果(1)
1GPUの場合より遅
い
• モデルパラメータの
同期がボトルネック
• ミニバッチサイズを
大きくすることで改
善
→同期回数を減少
18
0
50
100
150
200
250
single-512
multi-256
single-1024
multi-512
single-2048
multi-1024
single-4096
multi-2048
512 1024 2048 4096
[sec]
synctime calctime
Theano, TITAN X *2,1024x5
0
50
100
150
200
250
300
350
400
single-512
multi-256
single-1024
multi-512
single-2048
multi-1024
single-4096
multi-2048
512 1024 2048 4096
Chainer, M2090*2,1024x4
ERROR
マルチGPU結果(2)
実験2: ミニバッチサイズとマルチGPUによる速度変化
19
• TheanoとTensorFlow(TITAN X*4, 同期SGD)を比較
• MAX:ミニバッチサイズ64倍&GPU*4で処理速度約4.7倍
• (まだまだ改良中:データ転送の効率化でもう少し高速化できそう)
• 注:初期バッチサイズと同等の精度が出ない
• 適切な学習率や初期値などのパラメータ探索が必要
74.2
23.7
25.9
15.8
0
10
20
30
40
50
60
70
80
256(x1) 16384(x64) 16384(x64) 16384(x64)
1GPU 1GPU 4GPU
Theano TensorFlow
1sampleあたりの処理時間[usec]
3.1倍 1.6倍
マルチGPU考察
• モデルパラメータ同期がボトルネック
• ミニバッチサイズを大きくする事で改善
• 学習パラメータ探索は必要
• GPU間通信が高速なHWがベター
• GPUの構成を要確認
1. GPU-GPU間で直接通信可能なパターン
2. GPU間の通信にCPUの同期が必要な
パターン
• $ nvidia-smi topo --matrix コマンド
20
$ nvidia-smi topo --matrix コマンド例
21
とあるTITAN X x4環境でのコマンド結果
おそらくCPUを介さず通信できるのはGPU0-GPU1, GPI2-GPU3のみ
学習高速化のための検討
学習高速化のために考えること その1
• ハードウェアが重要
• GPU性能の向上
• M2090:1ヶ月→TITAN X:2週間→Pascal
• Pascal 半精度演算(float16)
• CUDA, cuDNN
• CNN, RNNの高速化
• データの転送速度・転送効率
• 事例:Baidu Research
• HWに合わせた低レイヤからの最適化
• Persistent RNNs
• GPUのレジスタを活用してRNNを数十倍の高速化
23
学習高速化のために考えること その2
• マルチGPUによる並列化
• デバイス間の高速な通信
(インターコネクト)
• 例: Infiniband, NVLink
• 非同期/分散の最適化アルゴリズム
• asynchronous SGD
• 通信するデータ量の削減
• 例: 1bit-SGD (Microsoft)
24
学習高速化のために考えること その3
• 複数台での並列化(マルチノード)
• Google
• Distributed TensorFlow(r0.8)
• Microsoft
• CNTK: Computational Network Toolkit
• 事例:Amazon
• Strom, Nikko. "Scalable distributed dnn training
using commodity gpu cloud
computing." INTERSPEECH. Vol. 7. 2015.
• 40台までリニアにスケール, 80台まで改善
25
まとめ
• 音声認識のディープラーニングモデル学習
• 大規模な学習データ量
• 学習の高速化が求められる
• 高速化のためのマルチGPU
• フレームワークの対応状況
• パラメータの同期がボトルネック
• ミニバッチサイズ(同期回数)
• デバイス間通信の高速化
• 非同期/分散の最適化アルゴリズム
• 通信データ量の削減
• マルチノード
26
ありがとうございました&お知らせ
• Interspeech2016
http://www.interspeech2016.org
• Sept. 8-12, San Francisco
• 音声系の国際学会
• Gold Sponsor
• ブース出展
• 採択:Yuya Fujita@音声チーム
"Robust DNN-based VAD augmented with phone entropy
based rejection of background speech"
• 音声系エンジニアほかいろいろ募集中
→ http://hr.yahoo.co.jp
27
参考資料
• GTC JAPAN 2015
• 1011:ヤフー音声認識サービス「YJVOICE」におけるディープラーニング
活用事例
• https://youtu.be/PzyV7cPe5bk
• ICASSP 2016 : Plenary talk
(http://2016.ieeeicassp.org/PlenarySpeakers.asp)
• Li Deng - Microsoft Research
“Deep Learning for AI: From Machine Perception to Machine
Cognition”
• http://2016.ieeeicassp.org/SP16_PlenaryDeng_Slides.pdf
29
参考資料
• Baidu Research : Deep Speech 2
Amodei, Dario, et al. "Deep speech 2: End-to-end speech recognition in
english and mandarin." Proceedings of The 33rd International Conference
on Machine Learning, pp. 173–182, 2016.
• http://jmlr.org/proceedings/papers/v48/amodei16.html
• https://arxiv.org/abs/1512.02595
30
参考資料
• Theano : multi GPU
• https://github.com/Theano/Theano/wiki/Using-Multiple-GPUs
• https://github.com/uoguelph-mlrg/theano_multi_gpu
• Using multiple GPUs — Theano 0.8.2 documentation
• http://deeplearning.net/software/theano/tutorial/using_multi_gpu.html
• Chainer User Group
• Free memory of cupy.ndarray - Google グループ
• https://groups.google.com/d/msg/chainer/E5ygPRt-hD8/YHIz7FHbBQAJ
• ミニバッチ学習でのデータシャッフルの方法 (GPUを使って学習する場合) - Google
グループ
• https://groups.google.com/d/msg/chainer/ZNyjR2Czo1c/uNVeHuTXAwAJ
31
参考資料
• Baidu Research : Persistent RNNs
Diamos, Gregory, et al. "Persistent RNNs: Stashing Recurrent Weights On-Chip."
Proceedings of The 33rd International Conference on Machine Learning, pp. 2024–2033,
2016.
• https://svail.github.io/persistent_rnns/
• http://jmlr.org/proceedings/papers/v48/diamos16.html
• https://github.com/baidu-research/persistent-rnn
• Microsoft : 1bit-SGD
Seide, Frank, et al. "1-bit stochastic gradient descent and its application to data-parallel
distributed training of speech DNNs." INTERSPEECH. 2014.
• https://www.microsoft.com/en-us/research/publication/1-bit-stochastic-
gradient-descent-and-application-to-data-parallel-distributed-training-of-
speech-dnns/
• http://www.isca-speech.org/archive/interspeech_2014/i14_1058.html
32
参考資料
• Google : Tensorflow (Distributed Tensorflow)
• https://www.tensorflow.org
• https://research.googleblog.com/2016/04/announcing-tensorflow-
08-now-with.html
• Microsoft : CNTK
• https://cntk.ai
• https://blogs.technet.microsoft.com/inside_microsoft_research/201
5/12/07/microsoft-computational-network-toolkit-offers-most-
efficient-distributed-deep-learning-computational-performance/
33
参考資料
• Amazon
Strom, Nikko. "Scalable distributed dnn training using commodity gpu cloud
computing." INTERSPEECH. Vol. 7. 2015.
• http://www.nikkostrom.com/publications/interspeech2015/strom_inter
speech2015.pdf
• http://www.isca-speech.org/archive/interspeech_2015/i15_1488.html
34

ヤフー音声認識サービスでのディープラーニングとGPU利用事例