XGBoost:具有多个核心的奇怪运行时

时间:2018-01-26 05:15:07

标签: python xgboost

我在2017年的MacBook Pro上使用XGBoost 0.7和Python 3.6。我跑:

sysctl -n hw.ncpu

然后回来

8

所以我测试多线程是否正常工作,几乎所有东西看起来都很正常。我看到改进多达8个核心。但是,当我使用numthreads=-1时,我的表现很糟糕。

具体来说,我使用Kaggle中的Otto train.csv文件运行:

from pandas import read_csv
from xgboost import XGBClassifier
from sklearn.preprocessing import LabelEncoder
import time
from matplotlib import pyplot
# load data
data = read_csv('train.csv')
dataset = data.values
# split data into X and y
X = dataset[:,0:94]
y = dataset[:,94]
# encode string class values as integers
label_encoded_y = LabelEncoder().fit_transform(y)
# evaluate the effect of the number of threads
results = []
num_threads = [2, 4, 8, 16, -1]
for n in num_threads:
    start = time.time()
    model = XGBClassifier(nthread=n)
    model.fit(X, label_encoded_y)
    elapsed = time.time() - start
    print(n, elapsed)
    results.append(elapsed)

我回来了:

2 48.96274280548096
4 26.73108983039856
8 24.160531997680664
16 24.71382975578308
-1 91.67938613891602

根据xgboost文档,numthreads=-1应该使用您计算机上的所有可用内核。因此,我不应该获得最佳性能,至少与8核一样好吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

  

根据xgboost文档,numthreads = -1应该使用您计算机上的所有可用内核。

不知道你在哪里,但在XGB source code中,nthread< = 0表示Noneinternally use the single threaded implementation。这就是为什么你的速度几乎是2线程执行时间的两倍。