はじめに
機械学習モデルのチューニングしているときに異常停止することがたびたび起きた。この症状はスモールデータでは起きずに、比較的大きなデータを利用する際に起きた。著者の失敗により大きく時間を損失したので作成した。
背景
scikit-learn を利用するときには、機械学習モデルの関数(例えばRandomForestClassifier) やグリッドサーチを行うための関数(例えばGridSearchCV)には利用するCPU数を設定する n_jobs パラメータがある。
例えば、n_jobsの値を16と設定するとCPUを16コア利用することになる。
前提
- 著者のPCが16コアのマシン
実験内容
以下の要領でCPUの動作状況を確認する。
- 実験1: BalancedRandomForestClassifier の n_jobs を設定
- 実験2: BalancedRandomForestClassifier と GridSearchCV の n_jobsの値を -1に設定
- 実験3: BalancedRandomForestClassifier と GridSearchCV の n_jobsの値を16コア以内に設定
- 実験4: BalancedRandomForestClassifier と GridSearchCV の n_jobsの値を任意のコア数以内に設定
実験1 : 正常動作
次のように機械学習モデルを利用するための初期化を行う。n_jobsの値は-1 とした。
model = BalancedRandomForestClassifier(random_state = 43, n_jobs = -1)
上記のように、n_jobs = -1 と設定すると、CPUコア数(16コア)分設定される。この場合は、CPUの使用量は最大100%になるが、常に100%にはならない。また、PCの操作は重くならない。
実験2: 意図的でない動作
次のように設定する場合は意図せず多くのコア数を指定することになる。n_jobsの値はそれぞれ -1 とした。
model = BalancedRandomForestClassifier(random_state = 43, n_jobs = -1)
*** 中略 ***
grid_result = GridSearchCV(estimator = model,
param_grid = param_grid,
scoring = "balanced_accuracy",
cv = 5,
n_jobs = -1)
例の設定であれば 16×16 コアを設定したのと同じ意味を持つ。常に**CPU使用量が100%**になる。PCの操作は不可能な状態になる。この状態ではPythonが異常停止することがある。
実験3: 意図的な動作
次のように利用する場合は意図した量の使用CPUコア数を指定することができる。 n_jobsの値はそれぞれ 4 とした。
model = BalancedRandomForestClassifier(random_state = 43, n_jobs = 4)
*** 中略 ***
grid_result = GridSearchCV(estimator = model,
param_grid = param_grid,
scoring = "balanced_accuracy",
cv = 5,
n_jobs = 4)
例の設定であれば 4×4 コアを設定したのと同じ意味を持つ。CPUの使用量は最大100%になるが、常に100%にはならない。また、PCの操作は重くならない。
実験4: コア数の指定
次のように利用する場合は意図した量の使用CPUコア数を指定することができる。 CPU使用量を50%(8コア)となるように、BalancedRandomForestClassifier の n_jobsの値は4、 GridSearchCVn_jobsの値は2とした。
model = BalancedRandomForestClassifier(random_state = 43, n_jobs = 4)
*** 中略 ***
grid_result = GridSearchCV(estimator = model,
param_grid = param_grid,
scoring = "balanced_accuracy",
cv = 5,
n_jobs = 2)
例の設定であれば 2×4 コアを設定したのと同じ意味を持つ。**CPUの使用量は最大50%**になるが、25%から50%を前後する。また、PCの操作は重くならない。
まとめ
プログラム中に n_jobs を二カ所以上設定する場合は注意が必要である。
例えば、BalancedRandomForestClassifier の n_jobs を n_jobs_bと呼び、GridSearchCVのn_jobs を n_jobs_gと呼読んだときには、注意点は次のようにまとめることができる。
- n_jobs_b = -1, n_jobs_g = -1 とする場合は異常動作を引き起こす。
- n_jobs に設定されたCPUコア数はn_jobs_bの値 × n_jobs_gの値となる。
- つまり「n_jobs_b × n_jobs_g の値 > 自分のマシンのCPU数」と設定しなければならない。