こんにちは、 RevComm Research Dept. Development Groupのid:tmotegiです。趣味は積読と日本酒を嗜んでおります。昨日は仙禽の雪だるまを飲みました。現世で2度目のアドベントカレンダーなので緊張します。
この記事は RevComm Advent Calendar 2023 、15日目の記事です。昨日の記事は豊崎さんによる「CodemagicでFlutterアプリをビルドする」でした。
私達のチームは、チームトポロジーのイネイブリングチームに相当するチームとして組織されており、他のチームに対してサポート・ツール・サービスを提供し、効果的かつ効率的に業務を遂行できるようにする役割を担っています。 今回は私が取り組んだ、AWS EC2 Inf2インスタンスを使った推論の高速化をご紹介します。
TL;DR
- AWS EC2 Inf2インスタンスにより、音声感情認識モデルの推論は爆速化し、コストも削減され、精度は維持されることが分かった。
- G5インスタンス (ONNX) に比べ、Inf2インスタンスは2倍以上高速に推論することができる。
- G5インスタンス (ONNX) に比べ、Inf2インスタンスはコストを80%弱削減できる。
背景
私達はMiiTelのコアバリューである音声認識・話者分離・音声感情認識などの機能を実現するために最新の深層学習モデルを利用しています。このような深層学習モデルは推論時に大量の演算を必要とするため、その性能向上のために一般的にGPUが利用されます。しかし、GPUインスタンスはCPUインスタンスに比べてコストが高くなる傾向があります。一方、AWSはInf2インスタンスという推論に特化したインスタンスを提供しています。Inf2インスタンスはAWS Neuron SDKを用いて作成した専用のモデルをデプロイすることで、パフォーマンスの向上とコスト削減を同時に実現することが可能となっています。
私はGPUインスタンスのコストがかさむ問題に対して、Inf2インスタンスを導入することで解決を試みました。具体的には、MiiTelで使われている音声感情認識モデルをONNXやGPUインスタンス、Inf1およびInf2インスタンスを使った推論を行い、結果を比較することでInf2インスタンスが導入可能かどうか検討しました。
音声感情認識
私が取り上げた音声感情認識について簡単に紹介します。
音声感情認識機能
音声感情認識機能は、話し手のポジティブ・ネガティブな感情を可視化します。話し方からポジティブ・ネガティブを認識し、オレンジからブルーのグラデーションで帯として表示します。これによって会話した当事者以外でも、ネガティブな内容の会話にいち早く気づくことができます。(下記の図の赤いドットの角丸矩形が感情を示すグラデーション)
詳細は以下のプレスリリース記事で紹介されています。
音声解析AI電話「MiiTel」、音声感情認識機能をリリース 会話のポジティブ、ネガティブな感情をAIが可視化 prtimes.jp
音声感情認識モデル
紹介した音声感情認識機能で実際に使われているモデルは、論文 "Speech Emotion Recognition based on Attention Weight Correction Using Word-level Confidence Measure"1 で提案された "confidence measure (CM) as weighting correction" になります。
詳細は以下のブログで紹介されています。
https://tech.revcomm.co.jp/2022/07/13/voice-emotion-recognition/ tech.revcomm.co.jp
実験
この実験の目的は、AWS EC2 Inf2インスタンスを使用して、音声感情認識モデルの推論速度を改善することです。これにより、同じ品質のアウトプットを保ちつつコストと時間を節約し、効率性を向上させることを期待しました。
環境設定
c6in.2xlarge, g5.xlarge, inf1.xlargeは東京リージョンで起動し、inf2.xlargeのみまだ東京リージョンでは提供されていないため、バージニア北部リージョンで起動しました。
Instance type | GPU | AWS Inferentia | Software |
---|---|---|---|
c6in.2xlarge | No | No | torch, onnxruntime |
g5.xlarge | Yes | No | torch, onnxruntime, onnxruntime-gpu |
inf1.xlarge | No | Yes | torch, torch-neuron |
inf2.xlarge | No | Yes | torch, torch-neuronx |
データセット
プライベートなデータセットを使ってモデルの評価を行いました。データセットは3つの感情 (happiness, anger, neutral) を含み、音声の合計長は74分です。また各クラスの事例数は次の表のとおりです。
Class | # Samples |
---|---|
happiness | 201 |
anger | 206 |
neutral | 270 |
指標
音声感情認識のPyTorchモデルをCPUインスタンスで実行した結果を基準 2とし、相対的な指標で評価します。
- 高速化率
- 新しく導入したモデルが既存のモデルと比較して、どれだけ推論速度が改善したかを示します。「PyTorchモデルをCPUで実行したときの1推論あたりの平均レイテンシー / 各モデルの1推論あたりの平均レイテンシー」で計算します。
- コスト削減率
- 新たに導入したモデルが既存のモデルと比較して、どれだけコストを削減できたかを評価します。「1 - 各モデルの1推論あたりの平均コスト / PyTorchモデルをCPUで実行したときの1推論あたりの平均コスト」で計算します。
- 平均コストは平均レイテンシーとオンデマンドインスタンスの価格表から算出しました。
- 新たに導入したモデルが既存のモデルと比較して、どれだけコストを削減できたかを評価します。「1 - 各モデルの1推論あたりの平均コスト / PyTorchモデルをCPUで実行したときの1推論あたりの平均コスト」で計算します。
- 精度変化
- 新たに導入したモデルが既存のモデルと比較して、どの程度精度が変化したかを評価します。「PyTorchモデルをCPUで実行したときのaccuracy(精度)- 各モデルのaccuracy」で計算します。
- モデルファイルサイズ変化率
- 新たに導入したモデルのファイルサイズが、既存のモデルと比較してどれだけ変化したかを評価します。モデルのファイルサイズは、一般的にストレージやメモリ上のリソース使用量に影響を与えます。「ONNX or AWS Neuronでコンバート後のモデルのファイルサイズ / PyTorchモデルのファイルサイズ」で計算します。
- モデルロード時間高速化率
- 新たに導入したモデルをロードするのに要する時間が、既存のモデルと比較してどれだけ速くなったかを評価します。これは、モデルを使用する前に必要な初期化時間に直結します。「PyTorchモデルのロード時間 / ONNX or AWS Neuronでコンバート後のモデルのロード時間」で計算します。
実験結果
推論のパフォーマンス比較
前処理(スペクトログラムや単語ベクトル作成)以外の推論部分についてレイテンシーおよび速度を測定し比較しました。
Model | PyTorch | ONNX | ONNX | ONNX | PyTorch | ONNX | AWS Neuron | AWS Neuron |
---|---|---|---|---|---|---|---|---|
Instance | c6in.2xlarge | c6in.2xlarge | c6in.2xlarge | c6in.2xlarge | g5.xlarge | g5.xlarge | inf1.xlarge | inf2.xlarge |
浮動小数点数 | 32 bit floating point (fp32) | fp32 | int8 | uint8 | fp32 | fp32 | 16 bit brain floating point (bf16) | bf16 |
高速化率 | - | 1.19 | 2.01 | 1.93 | 9.57 | 23.57 | 9.58 | 57.55 |
コスト削減率 | - | 0.16 | 0.50 | 0.48 | 0.73 | 0.89 | 0.94 | 0.98 |
精度変化 | - | 0.000 | -0.005 | -0.006 | -0.007 | -0.007 | -0.008 | -0.008 |
高速化
音声感情認識モデルはONNXやGPU、Inf1 & Inf2インスタンスを使うことで高速化を達成できることが分かりました。特にinf2.xlargeを使った推論はONNXモデルをGPUで動かした場合の推論速度より2倍程度早くなっています。Inf1 & Inf2インスタンスではbf16以外のデータタイプも使えるのですが、推論のレイテンシーはbf16と同程度となりました。
コスト削減
Inf1 & Inf2インスタンスのコスト削減率が高いことが分かります。これは1推論あたりの平均レイテンシーが短いことや、インスタンスの価格がGPUインスタンスより安価であることが挙げられます。
精度変化
Inf1 & Inf2ではモデルパラメータの浮動小数点数としてbf16を利用しました。ONNXやInf1 & Inf2インスタンスを使った場合には、浮動小数点数の変更はモデルの精度への影響が少ないようです。Inf1 & Inf2インスタンスではbf16以外のデータタイプも使えるのですが、ほかのデータタイプを使用してもbf16を使用した場合と同程度の精度変化が見られました。
モデルサイズ・ロード時間比較
ONNXやInf1 & Inf2インスタンスを使うことで、モデルのファイルサイズやモデルのロード時間がどのように変化したか記録しました。
Model | PyTorch | ONNX | ONNX | ONNX | PyTorch | ONNX | AWS Neuron | AWS Neuron |
---|---|---|---|---|---|---|---|---|
Instance | c6in.2xlarge | c6in.2xlarge | c6in.2xlarge | c6in.2xlarge | g5.xlarge | g5.xlarge | inf1.xlarge | inf2.xlarge |
浮動小数点数 | fp32 | fp32 | int8 | uint8 | fp32 | fp32 | bf16 | bf16 |
モデルファイルサイズ変化率 | - | 0.96 | 0.24 | 0.24 | 1.00 | 0.96 | 0.52 | 0.50 |
モデルロード時間高速化率 | - | 28.99 | 133.73 | 143.42 | 0.88 | 29.85 | 17.51 | 7.61 |
モデルファイルサイズ
モデルファイルサイズは浮動小数点数に連動して小さくなりました。モデルのパラメータを16ビットで表す場合は元のモデルのファイルサイズの約1/2、8ビットで表す場合は約1/4になりました。
モデルロード時間
ONNXモデルではファイルサイズと同様に浮動小数点数の精度を下げることで、モデルロード時間が短くなる結果になりました。また、AWS Neuron SDKを用いて作成したモデルは、ONNXモデルよりは遅いものの、PyTorchのモデルのロード時間よりは早くなりました。
まとめ
MiiTelで使われている音声感情認識モデルの推論をInf系インスタンスで実行し、推論速度や精度について比較しました。Inf2インスタンスを利用することで、今までの精度を維持する一方で高速で低コストな推論ができることを確認しました。また、モデルファイルサイズやモデルロード時間も既存モデルに対して改善することを確認しました。
これらの結果は、既存モデルに対する改善を示しています。品質を維持したまま推論速度を上げることで、音声感情認識の速度を高め、結果としてユーザー体験の向上が期待できます。また、コスト削減により長期の運用コストを抑えることが可能となります。
今後の課題としては、既存モデルを実際にInf2インスタンスで置き換え、音声感情認識の高速化とコスト削減に取り組むことがあげられます。また、他の深層学習を使った機能やサービスに対して、同様の最適化手法を適用することも推進する予定です。