Skip to content

Commit

Permalink
Update: Style-Bert-VITS2 を更新し、メモリ消費量を大幅に削減
Browse files Browse the repository at this point in the history
調査から解決まで数日を消費してしまった…
  • Loading branch information
tsukumijima committed Dec 22, 2024
1 parent fa57957 commit a0d9ea4
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 13 deletions.
10 changes: 4 additions & 6 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ sudachipy = "0.6.8"
# aivmlib は AIVMX ファイルのメタデータ読み取りに必要
aivmlib = "^1.0.0"
# AivisSpeech-Engine にはカスタマイズされた Style-Bert-VITS2 が必要
style-bert-vits2 = { git = "https://github.com/tsukumijima/Style-Bert-VITS2", rev = "73248159d0a1de17f49811b58e9e48cb2243bb3c" }
style-bert-vits2 = { git = "https://github.com/tsukumijima/Style-Bert-VITS2", rev = "6060053d0a1b7c34269ed9067efaa4bc219c4252" }
# OS に応じて適切な ONNX Runtime プラグインをインストール
## Windows では若干速度は落ちるが onnxruntime-directml で代用できるのとファイルサイズがデカいので、
## 当面 onnxruntime-gpu はインストールしない
Expand Down
32 changes: 26 additions & 6 deletions voicevox_engine/tts_pipeline/style_bert_vits2_tts_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,17 @@ def __init__(
self.tts_models: dict[str, TTSModel] = {}

# ONNX Runtime での推論に利用するデバイスを選択
## デフォルト: CPU 推論 (CPUExecutionProvider)
## arena_extend_strategy を kSameAsRequested にすると、推論セッションによって作成される
## メモリアリーナが、実際に推論に必要な容量以上にメモリを確保する問題を防ぐことができる
## この設定によるパフォーマンス低下はほとんどない (はず)
## ref: https://github.com/microsoft/onnxruntime/issues/11627#issuecomment-1137668551
## ref: https://skottmckay.github.io/onnxruntime/docs/reference/api/c-api.html
self.available_onnx_providers: list[str] = onnxruntime.get_available_providers()
self.onnx_providers: Sequence[str | tuple[str, dict[str, Any]]] = [
("CPUExecutionProvider", {}),
("CPUExecutionProvider", {
"arena_extend_strategy": "kSameAsRequested",
}),
]

# NVIDIA GPU が接続されていて CUDA がインストールされていれば、CUDAExecutionProvider が利用できる
Expand All @@ -85,22 +93,33 @@ def __init__(
self.onnx_providers = []
# cudnn_conv_algo_search を DEFAULT にすると推論速度が大幅に向上する
# ref: https://medium.com/neuml/debug-onnx-gpu-performance-c9290fe07459
self.onnx_providers.append(("CUDAExecutionProvider", {"cudnn_conv_algo_search": "DEFAULT"})) # fmt: skip
self.onnx_providers.append(("CUDAExecutionProvider", {
"arena_extend_strategy": "kSameAsRequested",
"cudnn_conv_algo_search": "DEFAULT",
})) # fmt: skip
# DirectML が利用可能なら、フォールバックとして DmlExecutionProvider も指定する
if "DmlExecutionProvider" in self.available_onnx_providers:
self.onnx_providers.append(("DmlExecutionProvider", {"device_id": 0}))
self.onnx_providers.append(("DmlExecutionProvider", {
"device_id": 0,
}))
# フォールバックとして CPUExecutionProvider も指定する
self.onnx_providers.append(("CPUExecutionProvider", {}))
self.onnx_providers.append(("CPUExecutionProvider", {
"arena_extend_strategy": "kSameAsRequested",
}))
logger.info("Using GPU (NVIDIA CUDA) for inference.")

# Windows なら DirectML (DmlExecutionProvider) を利用できる
## iGPU でも利用できるが、大半のケースで CPU 推論よりも大幅に遅くなる
elif use_gpu is True and "DmlExecutionProvider" in self.available_onnx_providers: # fmt: skip
self.onnx_providers = []
## TODO: より適した Direct3D 上のデバイス ID を指定できるようにする
self.onnx_providers.append(("DmlExecutionProvider", {"device_id": 0}))
self.onnx_providers.append(("DmlExecutionProvider", {
"device_id": 0,
}))
# フォールバックとして CPUExecutionProvider も指定する
self.onnx_providers.append(("CPUExecutionProvider", {}))
self.onnx_providers.append(("CPUExecutionProvider", {
"arena_extend_strategy": "kSameAsRequested",
}))
logger.info("Using GPU (DirectML) for inference.")

# GPU モードが指定されているが GPU が利用できない場合は CPU にフォールバック
Expand Down Expand Up @@ -232,6 +251,7 @@ def load_model(self, aivm_uuid: str) -> TTSModel:
onnx_providers=self.onnx_providers,
) # fmt: skip
start_time = time.time()
logger.info(f"Loading {aivm_info.manifest.name} ({aivm_uuid})...")
tts_model.load()
logger.info(
f"{aivm_info.manifest.name} ({aivm_uuid}) loaded. ({time.time() - start_time:.2f}s)"
Expand Down

0 comments on commit a0d9ea4

Please sign in to comment.