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

Improve: spekaer_infoをasync化 #1073

Conversation

sevenc-nanashi
Copy link
Member

@sevenc-nanashi sevenc-nanashi commented Feb 25, 2024

内容

speaker_info、singer_infoをasyncにすることで高速化します。

関連 Issue

スクリーンショット・動画など

user_dictのリクエストが始まった時点で終了。

same.mp4
個別

Before

VOICEVOX.-.Ver.999.999.999.Mozilla.Firefox.2024-02-26.00-59-59.mp4

After

VOICEVOX.-.Ver.999.999.999.Mozilla.Firefox.2024-02-26.01-00-40.mp4

その他

  • なぜかuser_dictが遅くなりました(何故???)
  • 多分他にも高速化できそうなところがあるのでIssueのcloseはしません。

@sevenc-nanashi sevenc-nanashi requested a review from a team as a code owner February 25, 2024 16:06
@sevenc-nanashi sevenc-nanashi requested review from Hiroshiba and removed request for a team February 25, 2024 16:06
Copy link

Coverage Result

Resultを開く
Name Stmts Miss Cover
run.py 522 277 coverage-47%
voicevox_engine/init.py 1 0 coverage-100%
voicevox_engine/cancellable_engine.py 94 72 coverage-23%
voicevox_engine/core/init.py 0 0 coverage-100%
voicevox_engine/core/core_adapter.py 81 12 coverage-85%
voicevox_engine/core/core_initializer.py 59 30 coverage-49%
voicevox_engine/core/core_wrapper.py 257 183 coverage-29%
voicevox_engine/dev/init.py 0 0 coverage-100%
voicevox_engine/dev/core/init.py 0 0 coverage-100%
voicevox_engine/dev/core/mock.py 65 4 coverage-94%
voicevox_engine/dev/tts_engine/init.py 0 0 coverage-100%
voicevox_engine/dev/tts_engine/mock.py 28 0 coverage-100%
voicevox_engine/engine_manifest/EngineManifest.py 36 0 coverage-100%
voicevox_engine/engine_manifest/EngineManifestLoader.py 12 0 coverage-100%
voicevox_engine/engine_manifest/init.py 0 0 coverage-100%
voicevox_engine/library_manager.py 92 4 coverage-96%
voicevox_engine/metas/Metas.py 36 0 coverage-100%
voicevox_engine/metas/MetasStore.py 28 6 coverage-79%
voicevox_engine/metas/init.py 0 0 coverage-100%
voicevox_engine/model.py 180 9 coverage-95%
voicevox_engine/morphing.py 71 46 coverage-35%
voicevox_engine/preset/Preset.py 13 0 coverage-100%
voicevox_engine/preset/PresetError.py 2 0 coverage-100%
voicevox_engine/preset/PresetManager.py 80 2 coverage-98%
voicevox_engine/preset/init.py 0 0 coverage-100%
voicevox_engine/setting/Setting.py 11 0 coverage-100%
voicevox_engine/setting/SettingLoader.py 17 0 coverage-100%
voicevox_engine/setting/init.py 0 0 coverage-100%
voicevox_engine/tts_pipeline/init.py 0 0 coverage-100%
voicevox_engine/tts_pipeline/kana_converter.py 88 1 coverage-99%
voicevox_engine/tts_pipeline/mora_mapping.py 7 0 coverage-100%
voicevox_engine/tts_pipeline/phoneme.py 34 0 coverage-100%
voicevox_engine/tts_pipeline/text_analyzer.py 146 6 coverage-96%
voicevox_engine/tts_pipeline/tts_engine.py 267 9 coverage-97%
voicevox_engine/user_dict/part_of_speech_data.py 5 0 coverage-100%
voicevox_engine/user_dict/user_dict.py 146 12 coverage-92%
voicevox_engine/utility/init.py 0 0 coverage-100%
voicevox_engine/utility/connect_base64_waves.py 37 0 coverage-100%
voicevox_engine/utility/core_version_utility.py 8 1 coverage-88%
voicevox_engine/utility/mutex_utility.py 13 0 coverage-100%
voicevox_engine/utility/path_utility.py 26 8 coverage-69%
voicevox_engine/utility/run_utility.py 10 7 coverage-30%
TOTAL 2472 689 coverage-72%

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こちらで動かしてみた感じは特に早くも遅くもなりませんでした。SSDだから・・・?

FastAPIはaiofilesではなくanyioを使っているらしいです。
こちらに乗り換えても良さそうですが、どうでしょうか。
(Python詳しくないので妥当なのかどうかわかりませんが。。少なくとも最近のDL数だけだとanyioのが多そう。)

なぜかuser_dictが遅くなりました(何故???)

これは検証しておくと将来的にも勉強になるかもとちょっと思いました!
APIを直接叩いてみた場合はどうかとか、テストを実行してみるとどうかとか、直接関数を叩くとどうかとか。

@sevenc-nanashi
Copy link
Member Author

まだ仮説ですが、

/version | Thread 1 起動
/speaker_info | Thread 2 起動
/speaker_info | Thread 3 起動
/speaker_info | Thread 1 待機
/speaker_info | Thread 2 待機
...
/user_dict | Thread 1 待機
/user_dict | Thread 2 待機

これが

/version | Thread 1 起動
/speaker_info | Async Thread 1 起動
/speaker_info | Async Thread 2 起動
/speaker_info | Async Thread 3 起動
/speaker_info | Async Thread 4 起動
...
/user_dict | Thread 2 起動
/user_dict | Thread 3 起動

こうなったのかも?

@sevenc-nanashi
Copy link
Member Author

プロファイリング取るとか色々やってました、逆に悪化するパターンもありそうなのでCloseします...

@Hiroshiba
Copy link
Member

Hiroshiba commented Feb 26, 2024

@sevenc-nanashi なるほどです!! 謎ですねぇ・・・!

辞書のとこもasyncにしないととかなんですかね。
ソフトウェア層で過ごしてるからこういうハードウェアやOSレベルのことをあまり知らない・・・。

せっかくなので、いろいろ試したときに書いたコードとかを雑でも良いのでここに貼っておくと、あとあと再開or引き継ぎしやすいかもとか思いました。
なんか不正確でも悪かった結果でも良いので、記録を残しとくとあとあとマジで助かったりします。
微妙だったという事実はうまく行ったのと同じくらい重要だったりするはずです。

あとはまあただのアイデアですが、Github Actionsで実測してみると条件揃えやすいかもですね!

@sevenc-nanashi
Copy link
Member Author

Async:https://share.firefox.dev/3wxrqX6
Blocking:https://share.firefox.dev/42QOewQ
ネットワークのパフォーマンスです。4.3秒から5.5秒になっていました。

...となるとどこがボトルネックになってるんでしょうか?

いろいろ

というのも、このパフォーマンス向上やろうと思ったのはRustで実装し直したときは一瞬(0.6秒)で終わったからなんですよね。

https://share.firefox.dev/49r6wHL

ので、Pythonもがんばればもう少し速くできるんじゃないかな~って思って、それのがんばりの1つとしてasync化を試していた感じです。

@Hiroshiba
Copy link
Member

なるほどです!
ちょっと生放送で聞いた感じだとRust版はファイル読み込みをせずメモリーに乗せてたから早かったのかも、みたいな話もしてました。

まあでもさすがにスピードが出てるのはそれだけじゃないと思うので、全然もっと早くできそうな気配は感じますね!
ありがとうございました!!!

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.

2 participants