CPU使用率が高いほど作業速度が遅くなるのはなぜですか?

CPU使用率が高いほど作業速度が遅くなるのはなぜですか?

使っていますささやき.cpp一部のサウンドファイルをコピーします。これはCPU集約的なプロセスなので、最適な設定を見つけようとし、スレッド設定(-t)でいくつかのテストを実行しましたが、結果は非常に混乱しました。私が実行したコマンドは次のとおりです。

date; time ./main -t [number of threads] -m ggml-model.bin -f 5min-16kHz.wav; date

私は6つのコア(+ 6つのハイパースレッディングコア)を備えたIntel i7を搭載したMacbook Proでこれを実行しています。

デフォルト設定(4スレッド)、6スレッド、12スレッド(すべてのCPUが100%で実行されているにもかかわらず、出力が生成されていない14スレッド)を試しました。結果は次のとおりです。

スレッド 時間出力
4 1750.84秒ユーザー11.02秒システム564%CPU 5:11.87合計
4 1862.04s ユーザー 18.63s システム 553% CPU 5:39.58 合計
6 2199.42秒ユーザー16.79秒システム720%CPU 5:07.51合計
6 2212.72秒ユーザー14.49秒システム722%CPU 5:08.22合計
12 4595.03秒ユーザー22.21秒システム1053%CPU 7:18.47合計
12 4298.11s ユーザー 22.53s システム 1059% CPU 6:47.85 合計

ご覧のとおり、スレッド数が増加するとCPU負荷も増加します。 CPU負荷が増加するにつれてリアルタイム時間が比例的に減少することが予想されるかもしれません(1分間の100%は約30分間の200%、2分間の50%に相当します)。

代わりに、4スレッドと6スレッドを使用してもほぼ同じリアルタイム結果が得られ、6スレッドを実行するとCPU使用率が約25%増加しました。 12個のスレッドはさらに悪化し、6個のスレッドに比べてCPU時間は2倍になり、リアルタイムは40%増加します。

わかりません。もちろん、より多くのスレッドは直線的に拡張されませんが、同じ操作を実行するとき、CPU時間はスレッド数に関係なくかなり一定に保たれる必要があります。そうですか? CPU使用量が増加した場合、リアルタイムは減少する必要がありますか?

タスクとハードウェアを考慮するときに使用するスレッド数の合理的な設定は何ですか?スレッドが I/O を待っている場合に備えて、コア数 + 少しの追加になると予想します。私が作業しているサウンドファイルは10MBで、Whisper.cppは32GBシステムで約3,6GBを使用しています(現在約10GBは使用されておらず、メモリ不足は「緑」です)。


編集:1つのスレッドのみを使用する対応する値(-t 1):

1619.90秒ユーザー20.86秒システム197%CPU 13:48.78合計

1つのスレッドがCPUのほぼ200%を使用していることがわかります。私がこれを理解しているかどうかはわかりません。しかし、実際の時間の13分は意味があります。

編集2:CPUを追加(-p)するとパフォーマンスが低下します。

-t 6 -p 3- 6804.14s user 38.58s system 1040% cpu 10:57.84 total(実時間の2倍、CPU時間の3〜4倍) -t 8 -p 2- 10573.58s user 57.47s system 1018% cpu 17:23.63 total(実時間の3倍以上、CPU時間の6倍) -t 4 -p 2- 2962.38s user 28.65s system 854% cpu 5:50.01 total(-t 4とほぼ同じ)

私の考えでは、-pは、この操作がコンピュータに与える影響を制限したい場合にのみ使用する必要があると思います。それ以外の場合は、できるだけ多くのプロセッサを使用します。

I/Oではないようです。最初の5〜10秒間3.08 GBを読み取り、残りの実行(少なくとも5分間継続)中に10 MB未満を読み取りました。

編集3:-t 13つまり、私のCPUがサポートしているよりも多くのスレッドを使用すると、非常に奇妙な結果が得られます。93213.70s user 450.23s system 978% cpu 2:39:36.88 totalいいえ、冗談ではありません。 CPU時間は50倍以上高いが、-t 4CPU使用率はほぼ2倍高い(978%対564)%)、リアルタイム性能が30倍以上向上した。

CPU時間が20倍以上増加したのと比較すると、-t 12CPU使用量はほぼ同じで、リアルタイムも20倍以上増加します。スレッドをもう1つ追加するだけです。

ここに何か問題があるのではないでしょうか?

編集4:

選択したベンチマークデータ

./bench -m ./models/ggml-small.en.bin -t 4

system_info: n_threads = 4 / 12 | AVX = 1 | AVX2 = 1 | AVX512 = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 1 | VSX = 0 | 

whisper_print_timings:     load time =   540.82 ms
whisper_print_timings:   encode time =  3490.52 ms
whisper_print_timings:    total time =  4031.40 ms

5つのスレッドは4つのスレッドより約8%高速です。

whisper_print_timings:     load time =   547.27 ms
whisper_print_timings:   encode time =  3193.27 ms
whisper_print_timings:    total time =  3740.58 ms

6スレッドは5スレッドより1%遅いです。

whisper_print_timings:     load time =   591.16 ms
whisper_print_timings:   encode time =  3158.88 ms
whisper_print_timings:    total time =  3750.10 ms

7スレッドは6スレッドより15%遅いです。そこからすべてが下り坂でした。私の考えでは、これはハイパースレッドコアではなく、私が持っている6つの「実際の」コアだけを使用するようです。理論的には、6つのスレッドが5つのスレッドよりも速くなければならないと思いますが、このベンチマークの実行中にコンピュータがスレッドの1つを停止し、時々コアを使用する他のタスクを実行すると想像しています。

編集5:

-20という良い値でベンチマークを実行すると、いくつかの興味深い結果が出ました(ここには合計時間だけがリストされています)。

Threads    Total time (ms)    ∆ (negative is better)
      4               3512    -13%
      5               3510     -6%
      6               3251 !! -13%
      7               3962     -8%

Δは、一般的な優先順位を持つ同じ数のスレッドと比較されます。優先順位の高い6つのスレッドは、通常優先順位のデフォルト設定より19%高速です。

ベストアンサー1

ある時点でスレッド数を増やすと、計算メモリが制限され、パフォーマンスが向上しません。whisper.cppスレッドを同期するために忙しいループを使用するため、CPU使用率は増加し続けます。これはより多くのCPUリソースを使用し、多くのCPUサイクルを無駄にしますが、コンテキスト切り替えやミューテックス/条件変数のその他の副作用を防ぎ、待ち時間を減らすのに役立ちます。

この--processorsパラメータはCPUプロセッサを表しません。これはwhisper.cppオーディオを並列に処理する独立したプロセッサです。この機能の詳細についてはこちらをご覧ください。

https://github.com/ggerganov/whisper.cpp/pull/110

おすすめ記事