XGBRegressor + cross_val_score 只使用 1 个内核?
XGBRegressor + cross_val_score use only 1 kernel?
我有一个有 8 个 cores/16 线程的 CPU,并且
我将 cross_val_score 与 XGBRegressor 一起使用并且 njobs=6,但它们实际上只使用 1 个核心(在 htop-Console 中只有 1 CPU 具有 100% 负载,其余 - 0%)。
for i,n_est in enumerate(range(20,105,5)):
for j,m_dep in enumerate(range(3,10,2)):
for k,l_rate in enumerate([0.0001,0.001,0.01,0.1]):
sc = cross_val_score(estimator=xgb.XGBRegressor(njobs=6,
max_depth=m_dep,
learning_rate=l_rate,
n_estimators=n_est),
X=X_train,
y=y_train,
cv=5,
scoring='r2',
n_jobs=6)
res[i,j,k] = np.mean(sc)
l += 1
print(l,end = '')
这有什么问题吗? cross val score 必须很容易并行化,因为它在 5 个独立数据集上运行 5 个模型?
好的,看起来像
from joblib import parallel_backend
parallel_backend(backend='threading', n_jobs=-1)
有帮助。现在 CPU 至少在部分时间使用 4-5 个内核,计算速度更快。
更新。 XGBoost参数确实解决了问题:
nthread=8
现在所有核心都已 100% 加载。
我有一个有 8 个 cores/16 线程的 CPU,并且 我将 cross_val_score 与 XGBRegressor 一起使用并且 njobs=6,但它们实际上只使用 1 个核心(在 htop-Console 中只有 1 CPU 具有 100% 负载,其余 - 0%)。
for i,n_est in enumerate(range(20,105,5)):
for j,m_dep in enumerate(range(3,10,2)):
for k,l_rate in enumerate([0.0001,0.001,0.01,0.1]):
sc = cross_val_score(estimator=xgb.XGBRegressor(njobs=6,
max_depth=m_dep,
learning_rate=l_rate,
n_estimators=n_est),
X=X_train,
y=y_train,
cv=5,
scoring='r2',
n_jobs=6)
res[i,j,k] = np.mean(sc)
l += 1
print(l,end = '')
这有什么问题吗? cross val score 必须很容易并行化,因为它在 5 个独立数据集上运行 5 个模型?
好的,看起来像
from joblib import parallel_backend
parallel_backend(backend='threading', n_jobs=-1)
有帮助。现在 CPU 至少在部分时间使用 4-5 个内核,计算速度更快。
更新。 XGBoost参数确实解决了问题:
nthread=8
现在所有核心都已 100% 加载。