Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ONNX 推論時のメモリ消費量を大幅に削減 & 前回 PR の実装ミスの修正 #194

Open
wants to merge 13 commits into
base: dev
Choose a base branch
from

Conversation

tsukumijima
Copy link

表題の通りです。

1. ONNX 推論時のメモリ消費量を大幅に削減

ONNX 版の BERT モデルを FP16 に変換したところ、音声合成品質にはほとんど影響なくファイルサイズやメモリ消費量を節約できることが判明したため、initialize.py 実行時にダウンロードされる ONNX 版 BERT モデルを FP16 版に切り替えました。

また、ONNX + CPU 推論時に発生していたメモリリーク問題(推論処理を行えば行うほどメモリが圧迫されていく)に関して、ONNX Runtime のデフォルトが富豪的にメモリを消費する構成になっていることと、Transformer アーキテクチャである BERT が入力系列長に応じてメモリを消費することが原因と判明しました。
こちらは ONNX Runtime の SessionOptions・RunOptions を調整することで解決しており、大幅なメモリ消費量削減を実現しています。

Note

この変更により BERT モデルの推論速度が Core i5-13400 環境で 0.2 ~ 0.3 秒程度低下するトレードオフがありますが、CPU 推論は元々 CUDA 推論に比べてあまり早くないことから、メモリ消費量の削減を優先しました。
なお、アプリケーション側で onnx_bert_models.load_model() 実行時に enable_cpu_mem_arena=True を渡すことで、BERT モデルの CPU 推論時にメモリアリーナが構築され、従来通りのパフォーマンスを維持できます(その代わり、若干緩和されているものの依然メモリを食います)。

前回 PR の実装ミスの修正

前回のプルリクエストで修正できていなかった実装ミスの修正となります。

  • TTSModel.unload() 実行時に PyTorch がインストールされていないと (ONNX 推論のみ利用する状態でも) エラーが発生する問題を修正
  • ONNX 版の英語の BERT モデル (deberta-v3-large) のトークナイザーの Fast Tokenizer への変換処理 (convert_bert_onnx.py 内) の実装が誤っており、結果英語の g2p 処理がうまく行われない(未知語が「unknown」と読み上げられてしまうなど)問題を修正

そのほか

テストコードが単一文字列での音声合成のみをテストする形でパフォーマンス計測上不都合だったことから、複数文を音声合成する形に変更しました。
また、convert_bert_onnx.py では FP32 版と FP16 版両方の ONNX BERT モデルを変換できるように改良してあります。

以上、よろしくお願いいたします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants