Joblib はマルチプロセッシングとスレッド バックエンドを使用できます。デフォルトではマルチプロセッシングを使用します (これは CPython の実装によるもので、特定のケースでのみスレッドが高速になります。ここでは詳細には触れません。 CPython および Python GIL)。
これはエラーではなく、プロセスからプロセスを作成しようとしたことを示す単なる警告です。つまり、次の行で:
results = Parallel(n_jobs = num_jobs)(delayed(crossVal)(model) for model in models)
デフォルトで cross_val_score が multoprocessing を使用しているため、すでにいくつかのプロセス (n_jobs) を生成してから、cross_val_score
内部で同じことを試みます(いくつかのプロセスを生成します)。crossVal
Joblib では、マルチプロセッシング バックエンドでそのようなことを行うことはできません。したがって、知る限り、この警告が表示され、ネストされた並列ループが単一プロセスで実行されます。つまり、cross_val_score
内部は単一スレッドで実行されますが、crossVal
関数はマルチプロセッシング モードで実行されます。
これら 2 つのマルチプロセッシング サイクルのいずれかを取り除くと、この警告を回避できます。つまり、ネストされたマルチプロセッシングを次の呼び出しで取り除くことができます。
cross_val_score(..., n_jobs=1)
crossVal
関数で、またはcross_val_score
マルチプロセッシングなしで単純なループで default を数回呼び出してから、結果を集計することができます。
results = [cross_val_score(estimator = est, ...) for est in estimators]
最初のケースでは同時に実行できますmin(n_models, n_jobs)
(元のケースでは、joblib が警告を発した場合、暗黙的にこれを既に実行しています)、2 番目のケースでは - min(n_folds, n_cores)
. 実行したい場合は、 GridSearchCVmin(n_jobs, n_models*n_folds)
を使用する必要があります。これは、内部的に次の方法でジョブを生成するためです。
out = Parallel(
n_jobs=self.n_jobs, verbose=self.verbose,
pre_dispatch=pre_dispatch
)(
delayed(_fit_and_score)(clone(base_estimator), X, y, self.scorer_,
train, test, self.verbose, parameters,
self.fit_params, return_parameters=True,
error_score=self.error_score)
for parameters in parameter_iterable
for train, test in cv)