はじめに
競馬の順位予測システムを作成しています。
順位予測モデルをLightGBMで作成したとき、下記の警告が出ました。
モデルの作成に影響はなかったのですが、実行するたびに警告が出るので、警告が出ないようにするための対処方法をまとめました。
C:\xxxxx\.venv_new\Lib\site-packages\joblib\externals\loky\backend\context.py:136: UserWarning: Could not find the number of physical cores for the following reason:
found 0 physical cores < 1
Returning the number of logical cores instead. You can silence this warning by setting LOKY_MAX_CPU_COUNT to the number of cores you want to use.
warnings.warn(
File "C:\xxxxx\.venv_new\Lib\site-packages\joblib\externals\loky\backend\context.py", line 282, in _count_physical_cores
raise ValueError(f"found {cpu_count_physical} physical cores < 1")
警告メッセージの内容
この警告メッセージは、joblibライブラリの内部で物理コア(physical cores)の数を検出しようとした際に、物理コアの数が「0」として報告されているため、これを基に計算を続行することができず、代わりに論理コア(logical cores)の数を使用することを示しています。
joblibは物理コアの数を取得しようとしましたが、何らかの理由で「0」が返されたため、物理コアの数が「1」未満であるとして、代わりに論理コアの数を使用します。
この警告は通常、プログラムの実行に重大な影響を与えるものではありませんが、パフォーマンス最適化を行う際に注意が必要です。
対処方法
joblibの警告メッセージを回避するために、LOKY_MAX_CPU_COUNT環境変数を適切に設定する必要があります。
下記のコードは、psutilライブラリのcpu_count関数を使用して、物理コアと論理コアの数を取得し、LOKY_MAX_CPU_COUNT環境変数を設定します。下記のコードを呼び出すことで、警告が出なくなります。
def set_loky_max_cpu_count():
physical_cores = psutil.cpu_count(logical=False)
logical_cores = psutil.cpu_count(logical=True)
cpu_count = max(1, min(physical_cores, logical_cores))
os.environ['LOKY_MAX_CPU_COUNT'] = str(cpu_count)
print(f"LOKY_MAX_CPU_COUNT set to {cpu_count}")
psutilライブラリを使用しているので、実行環境に下記のパッケージをインストールしてください。
(.venv)> pip install psutil
コードの補足
cpu_count = max(1, min(physical_cores, logical_cores))
物理コアと論理コアの少ない方の数を選択します(min(physical_cores, logical_cores))。
その後、その値が最低でも1になるようにmax(1, …)で補正します。これにより、コア数が0やマイナスになることを防ぎます
<コア数が少ない方を選ぶ理由>
- リソース共有の影響:
論理コアは、物理コアのリソースを共有して動作します。そのため、物理コアが実際に持つ計算能力を超えて、論理コアが多数稼働しても、逆にリソースの競合が生じてパフォーマンスが低下する可能性があります。 - 物理コアの効率性:
特に重い計算やCPUに負荷がかかる処理では、物理コアのほうが論理コアよりも効率的に作業を行えるため、少ないほうのコア数を選ぶことで無理のないパフォーマンスを維持する狙いがあります。
以上です。
コメント