Repository: VOICEVOX/voicevox_engine (Python)

Issue:
`cpu_num_threads`が未指定または0の場合に、論理コア数の半分をコアに渡すようにする
## 内容

現在、`cpu_num_threads`はコア（[VOICEVOX CORE](https://github.com/VOICEVOX/voicevox_core)）にそのまま渡されていて（たぶん）、「`cpu_num_threads`が未指定または0」の場合にどうなるかはコアの実装依存です。

そして現在のコアの実装は、「`cpu_num_threads`が未指定または0」の場合に物理コア数が使用されるようになっていて、一部のCPUでCPUのすべてのコアが使用されるので、[論理コア数の半分が使用されるようにするissue](https://github.com/VOICEVOX/voicevox_core/issues/756)を立てています。

エンジンも、「`cpu_numhreads`が未指定または0」の場合は、「論理コア数の半分」の値を渡すようにするのが良さそうです。

### Pros 良くなる点

- 「`cpu_num_threads`が未指定または0」の場合の挙動がコアの実装依存ではなくなる

### Cons 悪くなる点

- 
仕様が変わる


## その他


Discussion: ## 前提: `README.md` の関連記述

```
--cpu_num_threads CPU_NUM_THREADS
                        音声合成を行うスレッド数です。指定しないと、代わりに環境変数VV_CPU_NUM_THREADSの値が使われます。VV_CPU_NUM_THREADSが空文字列でなく数値でもない場合はエラー終了します。

#### CPU スレッド数を指定する

CPU スレッド数が未指定の場合は、論理コア数の半分か物理コア数が使われます。（殆どの CPU で、これは全体の処理能力の半分です）  
もし IaaS 上で実行していたり、専用サーバーで実行している場合など、  
エンジンが使う処理能力を調節したい場合は、CPU スレッド数を指定することで実現できます。

- 実行時引数で指定する
  python run.py --voicevox_dir=$VOICEVOX_DIR --cpu_num_threads=4
- 環境変数で指定する
  export VV_CPU_NUM_THREADS=4
  python run.py --voicevox_dir=$VOICEVOX_DIR
```

## 意見
上記の通り、現在の ENGINE 仕様は `CPU スレッド数が未指定の場合は、論理コア数の半分か物理コア数が使われます。（殆どの CPU で、これは全体の処理能力の半分です）` です。  
ENGINEの観点からは、むしろ現状の実装がバグ（50%でなく100%使ってしまう）だと言えそうです。  
100%使い切りが好ましくない観点からも、明示的に50%を渡すのは効果的です。  
「バグ修正により、デフォルト設定では全スレッドの50%のみを利用するようになります」とChangeLogに書く形で納得感が得られると考えます。  
結論として、実装に賛成です。
@tarepan さんの意見と同感です！
50%だけ使われるのが正しい挙動だと勘違いしていたので、100%使われるのはバグ扱いで良いと思います！
実装を希望します。
Draft PR #1113 を作成しましたので、確認いただけると幸いです。



Fix (patch):
diff --git a/README.md b/README.md
index 36d91429d..07a1149b7 100644
--- a/README.md
+++ b/README.md
@@ -434,7 +434,7 @@ python run.py --output_log_utf8
 
 #### CPU スレッド数を指定する
 
-CPU スレッド数が未指定の場合は、論理コア数の半分か物理コア数が使われます。（殆どの CPU で、これは全体の処理能力の半分です）  
+CPU スレッド数が未指定の場合は、論理コア数の半分が使われます。（殆どの CPU で、これは全体の処理能力の半分です）  
 もし IaaS 上で実行していたり、専用サーバーで実行している場合など、  
 エンジンが使う処理能力を調節したい場合は、CPU スレッド数を指定することで実現できます。
 
diff --git a/voicevox_engine/core/core_initializer.py b/voicevox_engine/core/core_initializer.py
index 66c7ca26c..1cf3cbef8 100644
--- a/voicevox_engine/core/core_initializer.py
+++ b/voicevox_engine/core/core_initializer.py
@@ -4,6 +4,7 @@
 from typing import List, Optional
 
 from ..tts_pipeline.tts_engine import CoreAdapter
+from ..utility.core_utility import get_half_logical_cores
 from ..utility.path_utility import engine_root, get_save_dir
 from .core_wrapper import CoreWrapper, load_runtime_lib
 
@@ -35,7 +36,7 @@ def initialize_cores(
         None のとき、voicevox_dir、カレントディレクトリになる
     cpu_num_threads: int, optional, default=None
         音声ライブラリが、推論に用いるCPUスレッド数を設定する
-        Noneのとき、ライブラリ側の挙動により論理コア数の半分か、物理コア数が指定される
+        Noneのとき、論理コア数の半分が指定される
     enable_mock: bool, optional, default=True
         コア読み込みに失敗したとき、代わりにmockを使用するかどうか
     load_all_models: bool, optional, default=False
@@ -44,10 +45,10 @@ def initialize_cores(
     if cpu_num_threads == 0 or cpu_num_threads is None:
         print(
             "Warning: cpu_num_threads is set to 0. "
-            + "( The library leaves the decision to the synthesis runtime )",
+            + "Setting it to half of the logical cores.",
             file=sys.stderr,
         )
-        cpu_num_threads = 0
+        cpu_num_threads = get_half_logical_cores()
 
     # ディレクトリを設定する
     # 引数による指定を反映する
diff --git a/voicevox_engine/utility/core_utility.py b/voicevox_engine/utility/core_utility.py
new file mode 100644
index 000000000..993fa9ebf
--- /dev/null
+++ b/voicevox_engine/utility/core_utility.py
@@ -0,0 +1,8 @@
+import os
+
+
+def get_half_logical_cores() -> int:
+    logical_cores = os.cpu_count()
+    if logical_cores is None:
+        return 0
+    return logical_cores // 2