VOICEVOX / voicevox_core

無料で使える中品質なテキスト読み上げソフトウェア、VOICEVOXのコア
https://voicevox.hiroshiba.jp/
MIT License
844 stars 114 forks source link

`cpu_num_threads`が未指定または0の場合に、論理コア数の半分が使用されるようにする #756

Open sigprogramming opened 5 months ago

sigprogramming commented 5 months ago

内容

現在、cpu_num_threadsの値はonnxruntimeのintra_op_num_threadsに渡されるようになっていますが、0が渡された場合にINTRAスレッドの合計=物理コアの数になるため、「cpu_num_threadsが未指定または0」かつ「論理コア数=物理コア数のCPU」の場合にすべてのコアが使用されます。

すべてのコアが使用されると他のアプリケーションやOSの動作に影響が出る(重くなる)のと、コメントやエンジンのREADMEでは「論理コア数の半分」という表記があるので、「cpu_num_threadsが未指定または0」の場合は論理コア数の半分が使用されるようにするのが良さそうです。

Pros 良くなる点

Cons 悪くなる点

実現方法

論理コア数はnum_cpusで取得できそう?

その他

Hiroshiba commented 5 months ago

issue作成ありがとうございます! 補足説明と個人的な感想をコメントしてみます。

cpu_num_threadsの数ですが、スレッド数の半分ぐらいを超えるとパフォーマンスはそこまで上がらなかったという実験結果があります。 https://github.com/VOICEVOX/voicevox_engine/issues/291#issuecomment-1019399723

たぶんエンジンは大体の環境でいい感じに動作してくれるデフォルト値を設定した方が良さそうに思います。 ただコアはデフォルト値をどうするべきかはちょっと迷います。 onnxruntimeのデフォルト値の「物理コア数」にするのは意図がはっきりしないので真似する必要はない気がします。 じゃあ論理コア数にするのか、論理コアの半分にするべきなのかは分からないです。

個人的にはスマホとかだと100%使われると結構いまいちそうなので、コアでもまあ論理コアの半分にしといていいんじゃないかなとちょっと思ってます。 あるいはまあ4分の3とか。

qryxip commented 5 months ago

とりあえずメモとしてですが、Rustの標準ライブラリにはstd::thread::available_parallelismという面白いものがあります。通常は論理コアの数を返すみたいです。 (例えばrayonは以前論理コア数を使っていましたが、今はavailable_parallelismを使うようになっています)。

まあ説明が難しいし、「論理コアの数の半分」がシンプルだとは思います。

Hiroshiba commented 5 months ago

なるほどです!!

ノートPC勢とかは画面が固まっちゃうので、できれば実装してあげたい気持ちがあります。 ただまぁエンジンには必須な機能だけど、コアはちょっと優先度下がるかも。 とはいえいい感じのプロダクトを作るためにこのパラメータを変えないとなのは気づきにくそうなので、デフォルトでいい感じに動いた方がやっぱり良さそう…かなぁ。