-
Notifications
You must be signed in to change notification settings - Fork 206
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
synthesisで処理が終わった後にメモリを開放する #1506
Comments
おそらくこのissueは #513 の重複になるのではないかと思っています。 私の理解では、
1.について補足すると、あるONNXモデルには複数の話者/スタイルが入っており、例えばあまあまずんだもんに対してロードすると春日部つむぎ等もロードされます。 https://github.com/VOICEVOX/voicevox_fat_resource/tree/177c5a3d96336ca74413b90609a4845091c19920/core/model#音声モデルvvmファイルと声キャラクタースタイル名とスタイル-id-の対応表 1.でロードされたモデルはVOICEVOX ENGINEを終了するまでロードされたままです。そして私が見聞きした限りでは、「VOICEVOX ENGINEが使っているRAM/VRAM」とは1.を指すと思います。 ただし2.で使用メモリが膨らまないかというとそうでもないようで、CUDA版でメモリリークが起きるらしいことがわかっています。CUDAのメモリリークについてONNXモデルのアンロードが効くかどうかは未確認です。 |
#513と同じ現象なのかちょっと疑問が残ります。 私の環境では#513は確認できませんでした。#1506は初め、ブラウザからリクエストしたときに確認しましたが、エディタからの場合でも同様に発生しているようです。 以下engineで調べたこと #513で提案されている、エンジンからコアをリフレッシュする方法は良さそうですが、Rustが分からないので私は手が出ないかもしれません。 |
ロードされたモデルという表現はよくなかったかもしれません。protobufで記述されたONNXファイルが、ONNX Runtimeの 実際VOICEVOX COREのPython APIで このことから、メモリリークとして分類するのは微妙かもしれません。というのも解放しようとしたらできるので。というより今調べたら、ちゃんとドキュメント化されていた挙動のようです。
どうするかですが、 #513 の流れからすると @Hiroshiba このissueについてはどうしましょう?個人的にはせっかくなのでsub-issue機能を使ってもいいかと思ったですが、上手い整理のしかたが思い付きませんでした。親子の関係というよりは兄弟っぽいし... |
issue作成ありがとうございます! 調査もありがとうございます! 音声合成するたびに毎回メモリ解放しても速度的に問題がないかはちょっとわからないのが本音です。 @qryxip さんが貼ってるページを見るに、onnxruntimeはどれくらいメモリを確保し続けるか指定できそうなので、それで制御可能にするのもありかも。 とはいえコア側変えないとなのでかなり大変だと思います。 実装としてはおそらく |
「話者を指定して」は少々無理があるように思えます。現状のENGINEだと、libvoicevox_core単位で丸ごとアンロードする他無いのではないかと。 VVMが導入された後だとしても、引数を COREの方でVVMについての議論をしていたとき、「例えばあまあまずんだもんをアンロードしようとしたら春日部つむぎ等もアンロードされる。これはユーザーにとって理解するのが難しくないか」という流れから、VVMを陽に指定してアンロードする形式に落ち着いたという認識です。 async with await VoiceModelFile.open("./path/to/0.vvm") as model:
await synth.load_voice_model(model)
# …
synth.unload_voice_model(model.id) ENGINEでもVVMのUUIDを指定する形式はそんなに無理が出ないのではと思ってます。例えば |
@qryxip ちょっとコアの話に寄りすぎ気味かもです。 話者となってるけどStyleIdでしたね。。 実装は、とりあえず今のエンジンは指定したスタイルが含まれるコアをunloadする感じで良いと思います。 兎にも角にも、そもそもエンジンマネージャーからコアインスタンスを弾いた時にメモリ解放できるのかが重要なので、そこの検証結果がほしい…! |
よくわかっていないのですが、ENGINEにとっての声とは
ちょっと個人的にはこれに懐疑的です。モデルをロードしたい理由はほぼほぼ限られると思いますが、反面モデルをアンロードしたい理由は多岐に渡ると思います。このissueのように巨大な入力を与えてしまってメモリが数GBに膨れてしまったのをどうにかしたい場合もあれば、一定時間使っていない声に対してメモリを節約したいという場合もあるのではないかと。なので
|
たしかに必ずinitializeと対応させるは必要はないかもです。
あっすみませんここ誤解で、エンジンは内容的にstyleIdを受け取るものでも互換性のために引数名をspeakerIdにしてて、僕はstyleIdのことを意図してspeakerIdと書いてしまいました!
全コアのインスタンスを破棄するAPIはその需要での使い勝手は良さそうですが、ひとつずつ破棄したい需要をカバーできないかな? コアバージョンの指定はたしかに必要だと思います。 まとめると、引数はstyleId(引数名はspeakerIdかもしれない)、core_versionとするのが使い勝手良さそうですね! |
これは承知しておりまして、Web APIのパラメータの意味で発言しました。というより、VOICEVOXのコードの読み書きをしている者同士で誤解が生じうるとは考えてもいませんでした。「話者」を指したかったら
「かもしれない」というのが引っ掛かったのですが、なるほど。新規追加のAPIであれば |
たしかソングAPIでめちゃくちゃ迷って(意味的にはstyleIdだし、そもそもspeaker=話者ですらない)、迷った末にspeakerにした記憶があります。 とりあえずAPIのシグネチャはまとまりそうですね!
|
すみません、勘違いしていました!! コアインスタンスの破棄あるいはfinalize()を前提に、その機能を持つAPIの名称候補は
実装は @qryxip さんがちょこっとおっしゃってるように、 |
本 Issue は直近 30 日間で活動がありません。今後の方針について VOICEVOX チームによる再検討がおこなわれる予定です。 |
内容
synthesisにクエリを送るとメモリが確保されますが、タスクマネージャを見ると処理が終わった後もメモリが占有され続けられているようです(最も大きいクエリの消費量が維持される?)。メモリ消費自体はクライアント側でクエリを小さく分割して送れば問題にならないはずなので(エディタもそうしてる?)、さほど優先順位は高くないかもしれませんが、処理が終わったら適宜解放するほうが他のソフトへの支障が避けられるかなと。synthesis以外のリクエストが同様であるかは未確認です。
Pros 良くなる点
メモリ占有率を抑えられる
Cons 悪くなる点
予めメモリが確保されているか否かでパフォーマンスに差がある、かも?無いと思いますが
実現方法
未検証
VOICEVOXのバージョン
VOICEVOX ENGINE 0.21.1
OSの種類/ディストリ/バージョン
The text was updated successfully, but these errors were encountered: