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

12世代CPUで実行するとEコアが使われてパフォーマンスが落ちる? #1147

Open
Hiroshiba opened this issue Mar 26, 2024 · 9 comments
Labels
バグ 状態:設計 設計をおこなっている状態 要議論 実行する前に議論が必要そうなもの

Comments

@Hiroshiba
Copy link
Member

Hiroshiba commented Mar 26, 2024

不具合の内容

バージョン0.18.0からエンジンでの合成速度が下がったという報告を2件見かけました。
https://twitter.com/Denshirangeman/status/1772073540683956407
https://twitter.com/ONeeeeeChang/status/1772755110747414904

Discordで議論した仮説として、12世代CPUは省電力コアがあるため説が出ました。
パフォーマンスが出るPコア8個と低電力なEコア4個構成な場合、Pコアは論理コア数が2つずつ、Eコアは1つずつなので合計20スレッドになります。
そして今までは物理コア数(この場合12)の並列数だったのが、0.18.0から論理コア数の半分(この場合10)になっています。

この影響でPコアの使用数が下がったことで処理速度が遅くなったのではという仮説です。

可能ならVOICEVOXがPコアを優先的に使ったり、なにか他の方法で実行速度を上げられると嬉しそうです。

現象・ログ

「Core i7の第12世代CPUにメモリ32GB、RTX3060Tiのデスクトップ環境で今までは1セリフ3秒くらいの処理だったのですが、0.18.0だと10秒ちょっとくらいかかる感じです。」
とのことです。

再現手順

不明。12世代CPUで音声合成すればわかりそう?
タスクマネージャでCPUの使用率を見るとかなり情報が増えそうなのでできる人がいれば。

期待動作

処理速度が速いこと。

その他

Pコアを優先的に使う方法はわかりませんでした。
勝手にPコアとEコアを振り分けてくれるはずで、流石に重い処理なのでPコアに割り当ててほしい感じがしますが、ゲームをやっている場合とかだとこっちがEコアに行きがちなのかもしれない・・・?

抜本的な解決策になってませんが、cpu_num_threadsを論理コアの半分ではなく4分の3とかにすればマシになるかも。

@Hiroshiba Hiroshiba changed the title 12世代CPUにあるEコアが選ばれるとパフォーマンスが落ちる? 12世代CPUで実行するとEコアが使われてパフォーマンスが落ちる? Mar 26, 2024
@nmori
Copy link

nmori commented Mar 27, 2024

このあたりのドキュメントが少し参考になるかもです。
https://www.isus.jp/wp-content/uploads/pdf/Game%20Dev%20Guide%20for%20Alder%20Lake%20Performance%20Hybrid%20Architecture_JA.pdf

@tarepan
Copy link
Contributor

tarepan commented Mar 28, 2024

cpu_num_threads デフォルト値変更の場合、仕様変更となります。
本仕様に関する README.md の記述はコチラになります。仕様変更時にはコチラの記述も合わせて変更をお願いします。

@tarepan tarepan added 要議論 実行する前に議論が必要そうなもの 状態:設計 設計をおこなっている状態 labels Mar 28, 2024
Copy link

本 Issue は直近 180 日間で活動がありません。今後の方針について VOICEVOX チームによる再検討がおこなわれる予定です。

@FanaticPond3462
Copy link

FanaticPond3462 commented Sep 30, 2024

こんにちは。私はGPU(グラボ?)がついていないノートパソコンでVOICEVOXを実行しています。
デスクトップ環境ではありませんが、ある程度快適に動作していると思われます。

私が動作させているVOICEVOXエンジンのバージョンは 0.19.1 で、CPU版を使用しております。
また、VOICEVOX本体は起動させておりません。

以下が私のノートパソコンのスペックです。
OS: Windows 11 (23H2)
CPU: 12th Gen Intel(R) Core(TM) i7-1260P
GPU: Intel(R) Iris(R) Xe Graphics (オンボードグラフィック)
RAM: 16GB
生成速度に関しましては、大体2秒程度で動作しております。
以下の写真はNovel Speechという拡張機能で小説を再生しているときのタスクマネージャー上のCPU使用率(論理プロセッサ別)とrun.exeプロセスの表示です。

タスクマネージャーのCPUタブ
タスクマネージャーのrun.exeプロセス

この情報がお役に立てれば幸いです。

@Hiroshiba
Copy link
Member Author

@FanaticPond3462 コメントありがとうございます!!!
状況も詳しくありがとうございます!!

調べさせていただいたところ、お使いのCPUではPコアが4、Eコアが8つとのことでした!
Pコア側が2スレットずつあるので、合計で16スレッドが表示されてるんだと思います。
これ見た感じ、もしかしたら所定の性能を発揮できている・・・・かも・・・?
でも使われているのがPコアなのかEコアなのかわからないですね・・・・。なんかちゃんとPコアが使われていそうな気もしますね!

もしターミナル周りの知識をお持ちでしたら、run.exe実行時に以下の引数を指定して実行お願いできませんか 🙇
run.exe --cpu_num_threads=12

これで16スレッドのうち12スレッド使われるようになり、かつPコアがより多く使われるのであれば実行速度が最高1.5倍早くなるのではと思ってます!
でももしかしたらもうすでにPコアが使われていて、あまり性能は変わらないかもとも思ってます。

もし前者だった場合は12世代CPUを使っている方の使い勝手をより上げられるのではないかなと!
お手数おかけして申し訳ないのですが、もしお時間あれば・・・! 🙇

@FanaticPond3462
Copy link

FanaticPond3462 commented Oct 2, 2024

迅速なお返事ありがとうございます。

Pコア側が2スレットずつあるので、合計で16スレッが表示されてるんだと思います。

論理プロセッサってコアのことを表しているのではないのですね...初めて知りました。

さて、VOICEVOX/vv-engineフォルダー内でrun.exe --cpu_num_threads=12を実行し、前回と同じ環境で動作させました。
結果といたしましては、以下がタスクマネージャーのCPUタブです。
タスクマネージャーのCPUタブ
以前と比べて、論理プロセッサーをよく使っていることがわかりました。ですが、体感速度は依然として二秒程度だと感じます。

もっとよく調べてみようと言うことで、Pythonコードを書きました。
こちらが検証用コードになります。

import requests
import time

process_start = time.perf_counter()

audio_query_result = requests.post("http://localhost:50021/audio_query?text=こんにちは&speaker=8")
audio_query_end = time.perf_counter()

requests.post("http://localhost:50021/synthesis?speaker=8", data=audio_query_result.text)
synthesis_end = time.perf_counter()

print(f"Audio queryにかかった時間:{audio_query_end - process_start}")
print(f"Synthesisにかかった時間:{synthesis_end - audio_query_end}")
print(f"すべて終わるのにかかった時間:{synthesis_end - process_start}")

実施方法といたしましては、最初に一回を実行してから(キャラクターの初期化があるため)、続いて三回実行し、三回実行した平均値を結果といたします。
まずはrun.exeです。
Audio queryにかかった時間(平均)は約0.01秒ほど
Synthesisにかかった時間(平均)は約0.92秒ほど
でした。
次にrun.exe --cpu_num_threads=12です。
Audio queryにかかった時間(平均)は約0.01秒ほど
Synthesisにかかった時間(平均)は約2.87秒ほど
でした。

結論といたしましては
VOICEVOXエンジン バージョン0.19.1時点では何もしてないほうがなぜか早いという結果になりました。
ここからは推測になるのですが、遅くなった要因といたしましては「スレッド数を増やすとEコアを使ってしまうため、足を引っ張ってしまっている」というのが一番の有力候補だと思われます。

この情報がお役に立てれば幸いです!

@nmori
Copy link

nmori commented Oct 2, 2024

下記ツールがどれぐらい信憑性があるかわかりませんが、
コア指定ツールというのがあるそうなので、
少し状況の切り分けができるかもしれません
(そして、メカニズムがわかれば、なにか応用できることもあるかも!?)

@FanaticPond3462
Copy link

FanaticPond3462 commented Oct 2, 2024

コア指定ツールというものがあるのですね!
初めて拝見いたしました。
そのメカニズムには推測ですがCPU Affinityというプロパティが使用されているのではないでしょうか。

CPU Affinityプロパティとはプロセスに対してコア番号で使用するコアを指定できるというものらしいです。

カニエルボーさんの解説記事によりますと以下のコマンドで1と2、6と7のコアだけを使用するようにできるそうです
編集: リンクが間違ってました...すみません...
cmd /c start "" /affinity C6 path/to/exe
指定する方法の詳しくは上記リンク(カニエルボーさんの解説記事)をご覧ください。

コアがPコアかEコアか判断できたら役に立ちそうです!

@Hiroshiba
Copy link
Member Author

@FanaticPond3462 詳しい調査本当にありがとうございます!!!

スレッド数を増やすとEコアを使ってしまうため、足を引っ張ってしまっている

!?!?!?!?!?!!?!!?!?
確かに実験結果から、こちらの推察が得られるのものすごいなるほどでした!!
たぶん言われなかったら可能性に気づけなかった気がします、助かりました。。。。

頂いたタスクマネージャーのスクショ2枚を見比べると、なんか下8つがPコアのスレッドな気がちょっとしますね!!
(スレッド数を指定しなかった方は、下8つしか動いてなさそうだったので)

もしそうなら、スレッド数12で動かしたものは下8つの稼働率が若干下がっているので、もしかしたらPコアの使用率が下がったから遅くなってる気がしますね!!
(つまり @FanaticPond3462 さんと同じ考え)


@nmori さんの指定ツール、及び @FanaticPond3462 さんのコア指定方法もご教示ありがとうございます!!!
確かに指定できると嬉しい気がしますね!!

ただもしかしたら @FanaticPond3462 さんの結果を見るに、Pコアの数だけのスレッド数で起動すれば、勝手にPコアだけ使ってくれるんじゃないかという気もしますね!!!
もしPコアの数を得られる方法があるなら、1回試して作ってみて最近の PC を持ってる方に試していただくのもありかも。
(多分これが一番楽実装が楽かも・・・?プロセスの優先度指定は結構複雑なことになりそうだなという直感があるだけですが。。)


あるいはジャストアイディアだけど、いろんなスレッド数で実際に回してみて一番早かったものを選ぶという手もありそう。
onnxruntime側にそういうオプションとか、ありはそういう検証をしてる人とかいないかな。
もしくはそういうライブラリがすでにあるかも・・・・・?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
バグ 状態:設計 設計をおこなっている状態 要議論 実行する前に議論が必要そうなもの
Projects
None yet
Development

No branches or pull requests

4 participants