使っていますささやき.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 4
CPU使用率はほぼ2倍高い(978%対564)%)、リアルタイム性能が30倍以上向上した。
CPU時間が20倍以上増加したのと比較すると、-t 12
CPU使用量はほぼ同じで、リアルタイムも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
オーディオを並列に処理する独立したプロセッサです。この機能の詳細についてはこちらをご覧ください。
答え2
スレッド設定(-t)でいくつかのテストを行いました。
これは実際にはとても良い考えです... -pオプションに何かを指定する限り:
-p N, --processors N [1 ] 計算中に使用するプロセッサの数
それ以外の場合、使用されるプロセッサの数はデフォルトで 1 に設定されます。実際の利益なしにコンテキスト切り替えに多くの時間を無駄にします。 (唯一の利点は、IOが他の実行可能スレッドの利点を得るのを待っているスレッドの時間を利用することですが、アプリケーションがCPUに過度にバインドされていることを認識することです...)
実際、どのようなCPU集約型アプリケーションでも、単一のプロセッサで作業するスレッドが多いほど、無駄も大きくなります。ただ…証明しました。 ;-)
したがって、私は以下をお勧めします。
- 1/デフォルトのパフォーマンス決定、デフォルト値t = 4;
- 2/ t = 4とp = 2で、利点が重要になるまでtを増やします。
- 3/実行中の他のアプリケーションが破損し始めるまで、より高いp値で2を繰り返します。
開発者は、アプリケーションのパフォーマンスを低下させる賢明ではないデフォルト値を提供しないと確信しています。
ここに適用されているように、開発者はアプリケーションがかなりIOに縛られていることを認めているようですので、4:1のt / p比をお勧めします。
Next ジョブの更新
婦人声明:IntelのTurbo Boostテクノロジ、特にCore i7が内部でどのようにコア周波数/オフラインコアを変更し、マルチスレッドアプリケーションのパフォーマンスに与える影響を決定するのか理解できません。
編集5:このデータセットは論理数値を提供します。
CPUバインディングスレッドを下げるのに適した値は、予約中にCPUが予約できる時間を増やし、非常に安価なコンテキストスイッチコストでワークロードを処理します。
このデータセットは、6つのコアのみが使用されたことを示しています。なぜですか?ターボ? HTが無効になっていますか?この中で正確に何かを知る方法があるなら...